A fast CV generator that creates HTML and PDF outputs from JSON data.
Using GitHub Template (Recommended)
Click "Use this template" button at the top of this repository. This creates a fresh copy without the original author's content branch.
Then:
git clone https://github.com/YOUR_USERNAME/cv.git
cd cv
git checkout -b contentOr Fork (Manual cleanup required)
If you fork instead, delete the original content branch and create your own:
git clone https://github.com/YOUR_USERNAME/cv.git
cd cv
git push origin --delete content
git checkout -b content
git push -u origin contentEdit data/cv_data.json with your information:
{
"personal_info": {
"name": "Your Name",
"title": "Your Professional Title",
"email": "your.email@example.com",
"summary": "Your professional summary...",
"social_links": {
"LinkedIn": "https://linkedin.com/in/yourprofile",
"GitHub": "https://github.com/yourusername"
}
},
"github_sources": [
{ "username": "yourusername" }
],
"experiences": [],
"education": [],
"skill_categories": [],
"projects": [],
"languages": {},
"certifications": []
}Commit and push:
git add data/cv_data.json
git commit -m "Update CV data"
git push origin contentEnable GitHub Pages in your repository settings: Settings → Pages → Source: "GitHub Actions"
Your site will be live at https://yourusername.github.io/cv
This project uses two separate branches:
main- Application code (templates, styles, build system)content- Your CV data and blog posts
Keep these branches separate. Never merge content into main.
Create config/site.json on the content branch to customize your site. The main branch contains generic defaults as fallback.
Edit the navigation menu:
{
"menu": [
{ "label": "Home", "path": "index.html", "item_type": "home" },
{ "label": "CV", "path": "cv.html", "item_type": "cv" },
{ "label": "Projects", "path": "projects.html", "item_type": "projects" },
{ "label": "Blog", "path": "blog.html", "item_type": "blog" }
]
}Choose a color scheme:
{
"colorscheme": {
"name": "Dracula",
"source": "iterm2",
"url": "https://github.com/mbadolato/iTerm2-Color-Schemes"
}
}Available sources: iterm2, github, or local
Popular schemes: Dracula, Nord, Solarized, Gruvbox, Rose Pine
Configure fonts:
{
"fonts": {
"primary": "JetBrainsMono",
"fallback": "FiraCode, monospace",
"source": "nerd-fonts"
}
}Font sources: nerd-fonts, google-fonts, or system
Configure PDF output using Typst:
{
"typst": {
"theme": {
"name": "grotesk-cv",
"version": "1.0.2"
},
"customization": {
"layout": {
"paper_size": "a4",
"font": "HK Grotesk",
"font_size": "9pt"
}
}
}
}Paper sizes: a4, letter, legal, a3, a5, a6
The generator automatically fetches your GitHub projects and avatar. It uses multiple fallback strategies for reliability:
Authentication Priority:
GITHUB_TOKEN- Automatically provided by GitHub Actions (5,000 req/hr)GH_TOKEN- Optional user-provided token (5,000 req/hr)ghCLI - Falls back to gh CLI if installed- Public API - Unauthenticated requests as last resort (60 req/hr)
Setting a Token (Optional):
If you want to test locally with higher rate limits, set the GH_TOKEN environment variable:
export GH_TOKEN=your_github_token
cargo run --bin cvGitHub Actions automatically provides GITHUB_TOKEN, so no configuration is needed for deployment.
Cache System:
The generator caches GitHub data in cache/github_cache.json to avoid unnecessary API calls and speed up rebuilds. The cache is automatically managed and respects TTL settings.
All content files go on the content branch.
Edit data/cv_data.json with your professional information.
Create markdown files in content/blog/:
---
title: "Post Title"
date: 2024-01-15
published: true
---
Your content here.Create markdown files in content/pages/:
---
title: "Page Title"
slug: "page-slug"
---
Your content here.MIT License - see LICENSE file for details.