Open-source CV builder. YAML in, PDF out.
→ Live demo: cvmake.codevena.dev
One YAML file. Four templates. Switch by changing one line.
![]() academic |
![]() bauhaus |
![]() classic-serif |
![]() corporate |
![]() creative-accent |
![]() editorial |
![]() magazine |
![]() modern-minimal |
![]() monochrome-dark |
![]() noir |
![]() swiss |
![]() tech-dev |
You have a CV. You want to keep it in version control, render it to multiple templates, maintain it in two languages, and not pay $9/month forever for the privilege. cvmake does that.
- One YAML file is the truth — diff in git, search with grep, copy between machines. No Word document mystery formatting.
- 12 polished templates — academic, bauhaus, classic-serif, corporate, creative-accent, editorial, magazine, modern-minimal, monochrome-dark, noir, swiss, tech-dev — each with multiple color palettes. Same content, instant restyle.
- Multilingual by default — author
cv.de.yaml+cv.en.yamlside-by-side from one schema, switch via CLI flag. - High-fidelity PDF output — React + Puppeteer means your live browser preview is byte-identical to the exported PDF.
- CLI or browser —
npx @codevena/cvmake-cli build cv.yamlfor terminal users, the live editor for everyone else. - MIT, no lockin — your data stays on your machine. Fork the schema, fork a template, add your own. The project is small enough to actually read.
# 1. Scaffold a commented starter CV (cv.yaml)
npx @codevena/cvmake-cli init cv.yaml
# 2. Edit cv.yaml with your data, then render it
npx @codevena/cvmake-cli build cv.yamlNo clone required. init drops a ready-to-edit, schema-valid cv.yaml
(use --lang de for German). The first build downloads Chromium
(~150 MB, one-time) which is needed for high-fidelity PDF rendering.
Convert an existing jsonresume.org file and get all 12 templates instantly:
npx @codevena/cvmake-cli import resume.json cv.yaml
npx @codevena/cvmake-cli build cv.yamlgit clone https://github.com/Codevena/cvmake
cd cvmake
pnpm install
pnpm build # builds the workspace packages once
# Copy the example to your local-only CV (cv.*.yaml is gitignored)
cp data/cvs/example.de.yaml data/cvs/cv.de.yaml
# Render a PDF
pnpm cvmake build data/cvs/cv.de.yamlOutput PDF lands in out/cv.pdf by default.
| ID | Style |
|---|---|
academic |
Serif, two-column publication-style layout |
bauhaus |
Geometric shapes, primary palette, Futura |
classic-serif |
Traditional resume with serif typography |
corporate |
Restrained corporate single-column |
creative-accent |
Colored accent block, modern sans-serif |
editorial |
Magazine-style with strong typography |
magazine |
Display serif, italic, two-column body — Vogue-style |
modern-minimal |
Minimal, lots of whitespace |
monochrome-dark |
Dark theme, high contrast |
noir |
Cinematic dark, cream serif, gold accent, prose entries |
swiss |
Strict grid, Helvetica, red accent — pure information design |
tech-dev |
Developer-focused with code-style accents |
Each template ships with 3+ color palettes. List them all:
pnpm cvmake list-templates- Monorepo — pnpm 9 workspaces + Turbo
- Schema — Zod
- Rendering — React 18 + Puppeteer (headless Chrome → PDF)
- Web UI — Next.js 16 (App Router) + Tailwind CSS 4
- CLI — Commander 12
- Testing — Vitest, Playwright (e2e), visual regression via pixelmatch
(Maintainers only.) All 4 published packages bump in lockstep:
pnpm -r --filter "@codevena/cvmake-{cli,core,schema,templates}" \
exec pnpm version <major|minor|patch>
git add -p # review the version bumps
git commit -m "release: vX.Y.Z"
git tag "v$(node -p "require('./apps/cli/package.json').version")"
git push origin main --tagsThe tag push triggers .github/workflows/release.yml which runs the
full test matrix and publishes all 4 packages via the NPM_TOKEN
repo secret. Set the secret once via npm Granular Access Token
(codevena org, read+write, long expiration) at
https://github.com/Codevena/cvmake/settings/secrets/actions.
See CONTRIBUTING.md. Bug reports, template ideas, and pull requests welcome.
See ROADMAP.md for what's planned and CHANGELOG.md for what has shipped.
MIT — see LICENSE.











