Infrastructure-as-Code for your resume. Single YAML source of truth, automatic multi-format generation, version-controlled career history.
Traditional resume builders force you into templates and web UIs. CV as Code treats your resume like infrastructure:
- Single Source of Truth β Edit YAML once, generate everywhere
- Version Control β Git history of your career evolution
- Multi-Language β Single data, multiple languages (EN/FR/IT)
- Automation β GitHub Actions auto-generates on every commit
- Privacy β Code stays private, CV is public on GitHub Pages
- Modern Stack β Python backend + React frontend
- Multi-Format β HTML / JSON / PDF from same source
- Privacy Controls β Sensitive info (email/phone) hidden in web interface
Your CV Data (YAML)
β
Python Generators (validate, transform)
β
Multiple Outputs (HTML, JSON, PDF)
β
GitHub Pages (public) + Git History (version control)
git clone https://github.com/YOUR_USERNAME/cv-as-code.git
cd cv-as-code# Backend
pip install -r backend/requirements.txt
# Frontend
cd web
npm install
cd ..Edit cv-data/cv_en.yml:
personal:
name: Your Name
email: your@email.com
phone: "+1-234-567-8900"
location: City, Country
birth_date: 1990-01-01
summary: "Your professional summary..."
experience:
- id: exp_1
company: Your Company
title: Your Title
period: 2020 - Present
location: City
technologies:
- Python
- Kubernetes
description: "Your achievements..."See CV_SCHEMA.md for complete documentation.
python backend/generate.pyGenerates:
dist/index.htmlβ Static HTMLdist/cv.jsonβ JSON APIdist/cv.pdfβ PDF export
# Start dev server (port 3000)
cd web && npm run devPush to GitHub and enable GitHub Pages:
git add .
git commit -m "Update CV"
git push origin mainGitHub Actions automatically:
- Generates HTML/JSON/PDF
- Builds React app
- Deploys to GitHub Pages
Your resume is now live at: https://YOUR_USERNAME.github.io/resume-as-code
- Multi-language support (EN/FR/IT) with externalized translations
- Dynamic language selector
- Dark mode toggle
- Version control (Git history)
- HTML/JSON/PDF exports
- Responsive design
- GitHub Pages deployment
- CI/CD automation
- Privacy controls (sensitive info hidden in web interface)
- Complete CV sections: Personal, Summary, Experience, Education, Skills, Projects, Certifications, Languages
- Resume PDF parser (local CLI)
- Multiple templates
- Skills proficiency levels
- Certifications with verification
- Timeline visualizations
- SEO optimization
- Theme customization UI
See ROADMAP.md for details.
The project uses English as the base language. Translation files (French,
Italian) only need to contain fields that require translation β all other data
is automatically inherited from cv_en.yml.
cv_en.yml (base) cv_fr.yml (overrides)
βββββββββββββββββ ββββββββββββββββββββ
personal: # Not needed - inherited
name: John Doe
email: john@example.com
company: Tech Corp # Not needed - inherited
summary: "Full-stack summary: "IngΓ©nieur
engineer..." full-stack..."
experience: experience:
- id: exp_1 - id: exp_1
company: Tech Corp title: "IngΓ©nieur Senior"
title: "Senior Eng" description: "DirigΓ©..."
period: 2021-Present
description: "Led..."
| Include (translated) | Exclude (inherited from English) |
|---|---|
summary |
personal (name, email, etc.) |
experience[].title |
experience[].company |
experience[].description |
experience[].period |
education[].degree |
experience[].technologies |
education[].description |
education[].school |
skills[].category |
education[].graduation_year |
projects[].title |
projects[].url |
projects[].description |
projects[].technologies |
languages[].name |
All URLs, dates, company names |
languages[].level |
List items (experience, education, projects) are matched by their id field:
# cv_en.yml
experience:
- id: exp_1
company: Tech Corp
title: Senior Engineer
# cv_fr.yml - only override translated fields
experience:
- id: exp_1
title: IngΓ©nieur Senior
# company inherited from Englishcv-as-code/
βββ cv-data/ # Your CV data
β βββ cv_en.yml # English (base - complete data)
β βββ cv_fr.yml # French (translations only)
β βββ cv_it.yml # Italian (translations only)
β βββ ui_translations.yml # UI text translations
β
βββ backend/ # Python infrastructure
β βββ generate.py # Main entry point
β βββ parsers/
β β βββ yaml_parser.py # Parse YAML + merge translations
β β βββ schema.py # Validate schema
β βββ generators/
β β βββ html_generator.py # β HTML
β β βββ json_generator.py # β JSON
β β βββ pdf_generator.py # β PDF
β βββ templates/
β βββ cv.html # Jinja2 template
β
βββ web/ # React frontend
β βββ src/
β β βββ App.jsx
β β βββ components/
β β βββ styles/
β β βββ utils/
β βββ public/
β β βββ cv.json # Generated
β β βββ cv.pdf # Generated
β βββ vite.config.js
β
βββ .github/workflows/
βββ deploy.yml # CI/CD pipeline
| Layer | Technology | Why |
|---|---|---|
| Data | YAML | Human-readable, version-controllable |
| Backend | Python 3.9+ | Parsing, validation, generation |
| Validation | Pydantic | Type safety, schema enforcement |
| Templates | Jinja2 | Flexible HTML generation |
| WeasyPrint | Pure Python, no browser needed | |
| Frontend | React 19 | Modern, component-based |
| Styling | Tailwind CSS | Utility-first, customizable |
| Build | Vite | Fast, modern bundler |
| Deploy | GitHub Pages | Free, automated |
- GETTING_STARTED.md β Detailed setup guide
- CV_SCHEMA.md β Complete YAML structure
- CUSTOMIZATION.md β Styling and theming
- ARCHITECTURE.md β System design
- ROADMAP.md β Future features
- CONTRIBUTING.md β How to contribute
# Edit cv_en.yml
nano cv-data/cv_en.yml
# Commit and push
git add cv-data/cv_en.yml
git commit -m "Update: Added new project"
git push
# β
GitHub Actions auto-generates outputs
# β
CV is live in ~30 seconds# For a data engineering position
git checkout -b feature/cv-dataeng
# Edit cv_en.yml emphasizing data/analytics skills
nano cv-data/cv_en.yml
# Generate PDF locally
python backend/generate.py
# Send dist/cv.pdf to recruiter
# Don't push this branchβit's local only
git checkout mainPublic website automatically shows language selector:
- English (default)
- FranΓ§ais
- Italiano
Users can switch languages on the fly.
Edit web/src/styles/App.css:
:root {
--primary: #2563eb; /* Primary color */
--secondary: #64748b; /* Secondary color */
--accent: #f97316; /* Accent color */
}Edit backend/templates/cv.html to modify layout, typography, etc.
Edit cv-data/cv_en.yml and backend/templates/cv.html in parallel.
- Push code to GitHub
- Enable GitHub Pages in repo settings
- GitHub Actions handles the rest
Your CV is live at: https://USERNAME.github.io/cv-as-code
The dist/ folder is fully staticβdeploy to:
- Netlify
- Vercel
- Firebase Hosting
- AWS S3 + CloudFront
- Any static host
- Private Repo β Source code stays private
- Public CV β Resume is publicly accessible via GitHub Pages
- No Backend β No server to compromise (static site)
- Git History β Only you control your data
- Python 3.9+
- Node.js 18+
- Git
- VS Code (recommended)
The project includes VS Code workspace configuration:
- Automatic Environment: VS Code will automatically use the virtual environment
- Recommended Extensions: Install suggested extensions for Python, React, and YAML
- Debug Configurations: Pre-configured launch options for running and debugging
- Tasks: Quick access to common development commands via Ctrl+Shift+P β "Tasks: Run Task"
# Clone repository
git clone https://github.com/YOUR_USERNAME/cv-as-code.git
cd cv-as-code
# Install dependencies
make install
# Generate CV outputs
make generate
# Run tests
make test
# Start development server
make devmake help # Show all available commands
make install # Install all dependencies
make generate # Generate CV outputs (HTML/JSON/PDF)
make test # Run test suite
make dev # Start development server
make build # Build for production
make clean # Remove generated files
make lint # Lint codeThe project includes automated tests for:
- PDF generation with professional styling
- Multi-language support
- Schema validation
- Output format verification
# Run all tests
make test
# Run specific test file
pytest tests/test_pdf_generation.py -vPre-commit hooks are configured to:
- Validate CV YAML schema
- Format Python code (black, isort, flake8)
- Format JavaScript/React code (prettier)
- Lint Markdown files
- Check for TODO/FIXME comments
- Auto-generate CV files on changes
# Install pre-commit hooks
pre-commit install
# Run hooks manually
pre-commit run --all-filesGitHub Actions automatically:
- Runs pre-commit checks on pull requests
- Executes test suite
- Builds and deploys on main branch pushes
- Validates CV data schema
- Ensures code quality standards
Contributions welcome! See CONTRIBUTING.md for guidelines.
- π¨ Templates β Minimal, sidebar, creative layouts
- π Translations β Spanish, German, Chinese, Japanese
- π Bug fixes β Quality improvements
- π Documentation β Guides, examples, tutorials
- β¨ Features β From ROADMAP.md
- Version: 1.0.0
- Status: Production-ready, actively maintained
- License: MIT
- Last Updated: January 2026
MIT β See LICENSE for details.
Free to use, modify, and distribute.
Inspired by:
- Infrastructure-as-Code principles
- Version control best practices
- Modern DevOps workflows
- Open an Issue
- Check Documentation
- See FAQ
Made with β€οΈ for developers who think infrastructure-first.
β If you find this useful, please star the repo!
