Templated resume built with LaTeX, generated from YAML data via Jinja2, compiled and deployed automatically through GitHub Actions to GitHub Pages.
Live: cv.cosmdandy.dev
graph LR
A["cv-data.yaml<br/><i>(secret)</i>"] --> B["build.py<br/><i>(Jinja2)</i>"]
B --> C["cv-{lang}.tex<br/><i>(generated)</i>"]
C --> D["LaTeX"]
D --> E["cv-{lang}.pdf<br/><i>(artifact)</i>"]
E --> F["GitHub Pages<br/><b>cv.cosmdandy.dev</b>"]
G["index.html"] --> F
- CV content is stored in
cv-data.yaml(private, not in git) build.pyrenders Jinja2 template with YAML data for each language (ru, en)- LaTeX compiles generated
.texfiles to PDF - GitHub Actions deploys PDFs + landing page to GitHub Pages
- Personal data is injected at build time from
CV_DATAGitHub Secret (base64-encoded YAML)
Python 3.9+ with pip:
pip install -r requirements.txtLaTeX (for PDF compilation):
# macOS (via Homebrew)
brew install --cask mactex-no-gui
# or minimal installation:
brew install basictex
sudo tlmgr update --self
sudo tlmgr install latexmk collection-fontsrecommended collection-langcyrillic \
fontawesome raleway droidsans cmbright enumitem moresize
# Ubuntu/Debian
sudo apt install texlive-full
# or minimal:
sudo apt install texlive-base texlive-latex-extra texlive-fonts-extra \
texlive-lang-cyrillic texlive-fonts-recommended latexmk
# Arch Linux
sudo pacman -S texlive# 1. Create your data file from example
cp cv-data.example.yaml cv-data.yaml
# Edit cv-data.yaml with your real data
# 2. Generate .tex files only (no LaTeX needed)
make render
# 3. Generate .tex AND compile to PDF
make build
# 4. Build using example data (for testing)
make build-example
# 5. Open generated PDFs (macOS)
open output/cv-ru.pdf output/cv-en.pdf
# 6. Clean generated files
make clean# Generate .tex
python scripts/build.py --data cv-data.yaml --lang ru,en --output output/
# Compile to PDF
cd output
latexmk -pdf cv-ru.tex
latexmk -pdf cv-en.tex.devcontainer/ DevPod configuration
template/
developercv.cls LaTeX document class
cv.tex.j2 Jinja2 template (bilingual)
scripts/
build.py YAML + Jinja2 → LaTeX generator
pages/
index.html Landing page for GitHub Pages
.github/workflows/
build-deploy.yml CI/CD pipeline
cv-data.example.yaml Example data (public)
cv-data.yaml Real data (gitignored, injected via secret)
Makefile Local build commands
- Fork this repository
- Copy
cv-data.example.yamltocv-data.yamland fill in your data - Add
CV_DATAsecret to your GitHub repo:Then paste into GitHub → Settings → Secrets → Actions → New secret →# macOS base64 < cv-data.yaml | pbcopy # Linux base64 -w 0 < cv-data.yaml | xclip -selection clipboard
CV_DATA - Update
CNAMEwith your domain (or delete it forusername.github.io/cv) - Enable GitHub Pages: Settings → Pages → Source: GitHub Actions
- Push to trigger build and deploy
- Template: LaTeX (developercv class)
- Templating: Jinja2 with custom delimiters for LaTeX compatibility
- Data: YAML (single source → two languages)
- CI/CD: GitHub Actions
- Hosting: GitHub Pages
- Dev Environment: DevPod