A modern, customizable CV/Resume builder that converts Markdown to a beautiful web page and PDF. Perfect for developers and tech professionals who want to maintain and host their CV on gh-pages.
- Write your CV in Markdown with YAML frontmatter for configuration
- Multiple language support
- Multiple theme options
- Automatic deployment to GitHub Pages
- PDF export
- Mobile-responsive design
- SEO-friendly meta tags, favicon, and social preview image per language
- Click Use this template on GitHub and create a new repository.
- Enable GitHub Pages:
- Go to repository Settings → Pages
- Set Source to GitHub Actions
- Edit your CV in
markdown-source/(start withcv.default.en.md). - Push to
master— the site deploys automatically.
Maintainers: enable Template repository in Settings → General so the Use this template button appears for everyone.
Alternatively, fork the repository and follow the same Pages setup.
Your site will be available at https://[your-username].github.io/[repository-name].
npm install
npm run devValidate and build:
npm run validate
npm run buildEach CV file starts with YAML frontmatter, followed by Markdown content:
---
$schema: ../config/cv.frontmatter.schema.json
lang: en
label: English
default: true
title: John Doe — CV
description: Senior Software Engineer with 8+ years of experience.
printLabel: Print / Save PDF
theme: github
favicon: favicon.svg
ogImage: assets/og-preview.svg
siteUrl: https://your-username.github.io/your-repository
---
# John Doe
## Senior Software Engineer
> [john.doe@email.com](mailto:john.doe@email.com)The $schema field enables IDE autocomplete via config/cv.frontmatter.schema.json. Regenerate it after schema changes:
npm run schema:generate| Field | Required | Description |
|---|---|---|
$schema |
no | JSON Schema path for IDE validation (e.g. ../config/cv.frontmatter.schema.json) |
lang |
yes* | Language code (e.g. en, de, ru) |
label |
no | Display name in the language switcher |
default |
no | Set to true for the default language |
title |
no | Browser tab title and social preview title |
description |
no | Meta description for SEO and social previews |
printLabel |
no | Text for the print/PDF button |
theme |
no | Theme preset: github, retro, or screen (default language only) |
favicon |
no | Path to favicon in public/ (e.g. favicon.svg) |
ogImage |
no | Path to social preview image in public/ (e.g. assets/og-preview.png) |
siteUrl |
no | Public site URL for absolute og:image and og:url (default language only) |
*If omitted, lang is inferred from the filename (cv.en.md → en, cv.default.en.md → en + default).
favicon, ogImage, and siteUrl can be set on the default language file and reused by other languages.
The CV body supports standard Markdown syntax:
- Use
#for your name - Use
##for main sections - Use
###for subsections or job titles - Use
>for contact information - Use
-or*for bullet points
See markdown-source/cv.default.en.md for a complete example.
| github | retro | screen |
|---|---|---|
![]() |
![]() |
![]() |
Available presets:
github— Clean, professional GitHub-style theme (default)retro— Classic paper-like themescreen— Modern, screen-optimized theme
Set the theme in the frontmatter of your default language file:
theme: retro- In Settings → Pages, enter your custom domain (e.g.
www.example.com). - Configure DNS:
- CNAME record:
www→<username>.github.io, or - A/AAAA records pointing to GitHub Pages IPs
- CNAME record:
- Set
siteUrlin the default language frontmatter so social previews use absolute URLs:
siteUrl: https://www.example.com- Optionally add
public/CNAMEcontaining your domain — GitHub Pages will include it in the deployment.
npm run validate # frontmatter + assets
npm run test # unit, integration, UI, and build smoke tests
npm run test:coverage # same tests + coverage report (optional)
npm run check # validate + typecheck + lint + test
npm run build # check + production buildCoverage report is generated locally at node_modules/.tmp/coverage/ (open index.html in a browser). This folder is temporary and is not committed to git.
GitHub Actions runs npm run build on every push and pull request.
The test suite lives in tests/ and covers:
tests/unit/— parsing, schema, validation, meta tagstests/integration/— all committed files inmarkdown-source/andpublic/tests/ui/— React pages, routing, and language switchingtests/smoke/— production Vite build
npm run validate checks frontmatter before every build:
- required fields and allowed values
- exactly one default language
- no duplicate
langcodes faviconandogImagepaths exist inpublic/themeandsiteUrlare only set on the default language file
The CV automatically deploys to GitHub Pages when you:
- Push changes to the
masterbranch - The GitHub Action validates, builds, and deploys your CV via GitHub Pages artifacts
- View your CV at
https://[your-username].github.io/[the-name-of-your-repository]
You can also trigger a manual deploy from Actions → Manual Deploy to GitHub Pages.
Your CV will look great on all devices — desktop, tablet, and mobile.
This project is licensed under the MIT License — see the LICENSE file for details.


