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))