A small, maintainable CV generator that turns structured profile data into clean HTML, Markdown, and PDF outputs.
The goal is not to replace design tools. The goal is to keep CV content versioned, reusable, multilingual, and easy to regenerate.
Open the live Vercel deployment
npm install
npx playwright install chromium
npm run validate -- --data ./data/example.cv.yml
npm run example:html
npm run example:markdown
npm run example:pdfThe example commands write generated files into ./output.
CV Builder reads a structured YAML data file and generates one or more CV outputs.
Input format:
YAML
Supported outputs:
HTML
PDF
Markdown
The default workflow is:
cv.yml -> HTML -> optional PDF
HTML is generated first so the result can be reviewed, adjusted, printed manually, or converted into PDF by the tool.
CVs are usually hard to maintain because the content and layout are mixed together.
This project separates:
data -> who you are, what you did, what to show
templates -> how the CV is structured
styles -> how the CV looks
outputs -> generated files
That makes it easier to:
- maintain one source of truth
- generate CVs in multiple languages
- adjust styling without rewriting content
- keep consistent HTML, Markdown, and PDF outputs
- version changes in Git
Validate your own CV source:
npm run validate -- --data ./path/to/your.cv.ymlGenerate a single output:
npm run generate -- --data ./path/to/your.cv.yml --format html
npm run generate -- --data ./path/to/your.cv.yml --format markdown
npm run generate -- --data ./path/to/your.cv.yml --format pdfGenerate all outputs for all languages defined in the source file:
npm run example:allAt minimum, your YAML source needs:
- profile.name
- profile.headline
- profile.contact.email
- content
The content object must contain at least one language key, such as en or de.
If settings.defaultLanguage is omitted, the first language key in content becomes the default.
Each language block can include:
- summary
- sidebar
- experience
- projects
- education
- certifications
- languages
- publications
Download the current example source and schema here:
data/example.cv.yml
schema/cv.schema.json
If you want an AI to help convert an existing CV into the required source file, keep the prompt short and strict:
Rewrite the attached CV into valid YAML for the attached schema. Keep only factual content from the source CV, preserve dates and employers, keep the result concise, and return YAML only.
This repository is Vercel-compatible with a small static frontend and Node.js API routes.
The deployed app provides:
- a browser UI for uploading/pasting CV YAML
- HTML and Markdown generation
- downloadable example data
- downloadable schema documentation
Use the browser's print dialog on the generated HTML if you want a PDF from the deployment.
After connecting the repo to Vercel, the root page at / serves the browser UI and the API routes provide the generated downloads.
cv-builder generate --data ./data/cv.yml --lang en --out ./output --format html
cv-builder generate --data ./data/cv.yml --lang en --out ./output --format pdf
cv-builder generate --data ./data/cv.yml --lang all --out ./output --format allcv-builder/
api/
data/
example.cv.yml
public/
schema/
cv.schema.json
src/
cli/
generator/
templates/
styles/
output/
README.md
package.json
vercel.json
The CV data file should support:
- shared profile data
- multiple languages
- summary sections
- sidebar sections
- work experience
- projects
- education
- certifications
- languages
- publications
- configurable visibility per output
A single CV data file can generate different language versions from the same source.
The first supported output is HTML.
PDF generation uses the same HTML and CSS through a browser-based renderer.
This keeps styling predictable and makes manual review easy before final export.
MIT