.cv Open Resume File Format
§04 / Install

Three languages, one binary, one source of truth.

The .cv ecosystem ships in JavaScript, Python and Go plus a single static CLI. Every surface produces and consumes the same spec-conformant file.

CLI Command line (cv)

One static binary, no runtime dependency.

shell · install the cv binary

# macOS / Linux (Homebrew tap)
brew tap cvfile/tap
brew install cv

# Windows (Scoop)
scoop bucket add cvfile https://github.com/cvfile/scoop-bucket
scoop install cv

# Windows (WinGet)
winget install cvfile.cv

# Anywhere with Go 1.22+
go install github.com/cvfile/cv-go/cmd/cv@latest

JS JavaScript / TypeScript

shell · npm packages

pnpm add @cvfile/sdk
# Optional embedding generation:
pnpm add @cvfile/embed
# Server middleware (Express/Fastify/Hono):
pnpm add @cvfile/server
# Drop-in viewer web component:
pnpm add @cvfile/viewer-web

typescript · pack and extract

import { pack, extract, validate } from '@cvfile/sdk';
const cv = await pack({
  pdf: pdfBytes,
  markdown: '# Jane Doe\n\n…',
  html: '<!doctype html>…',
  metadata: {
    primaryLanguage: 'en',
    primaryPayload: 'resume.md',
    integrity: 'sha-256',
  },
});
const file = await extract(cv);

PY Python

shell · pip

pip install cvfile
# With BGE-M3 embedding generation:
pip install "cvfile[embed]"

python · pack and extract

from cvfile import pack, extract, validate
cv = pack(
    pdf=pdf_bytes,
    markdown=md,
    html=html,
    metadata={"primary_language": "en", "primary_payload": "resume.md"},
)
file = extract(cv)

GO Go

shell · go get

go get github.com/cvfile/cv-go

go · extract and validate

import cv "github.com/cvfile/cv-go/cv"

file, err := cv.Extract(cvBytes)
report := cv.Validate(cvBytes, cv.ValidateOptions{Strict: true})

WEB Web component

Drop the viewer into any HTML page from the CDN.

html · cv-embed

<script type="module" src="https://cdn.cvfile.org/embed/1/cv-embed.js"></script>
<cv-embed src="resume.cv" view="auto" theme="auto"></cv-embed>

HTTP Server middleware

Serve a directory of .cv files with full content negotiation. Any consumer that asks for text/markdown gets the Markdown back, no special-case handling on either side. This is the integration path for ATS, CRM and recruitment platforms.

node · python · go

# Node (Express/Fastify/Hono)
import express from 'express';
import { cvHandler } from '@cvfile/server';

const app = express();
app.use('/cv', cvHandler({ root: './resumes' }));

# Python (FastAPI/Starlette)
from fastapi import FastAPI
from cvfile.server.asgi import build_cv_asgi_app

app = FastAPI()
app.mount("/cv", build_cv_asgi_app(root="./resumes"))

# Go (net/http)
import "github.com/cvfile/cv-go/middleware"
h, _ := middleware.Handler(middleware.Options{Root: "./resumes"})
http.Handle("/cv/", http.StripPrefix("/cv", h))