Renders tailored LaTeX CVs from a single master data file and archetype configurations. Each archetype targets a different job profile (MLOps, Customer Analytics, Forecasting, Ranking) by selecting roles, bullets, and skills from the shared master data.
uv sync
uv run cv-renderer list # show available archetypes
uv run cv-renderer render A # render archetype A → output/A.tex
uv run cv-renderer render A --pdf # also compile to PDF (requires TeX)
uv run cv-renderer validate --all # check all archetypes against master datadata/master.yaml ← all CV content (roles, skills, education, languages)
data/archetypes/A.yaml ← selects + orders content for a specific job profile
↓
cv_renderer/engine.py (resolve IDs, validate tiers, check evidence)
↓
cv_renderer/renderer.py + templates/cv.tex.j2 (Jinja2 → LaTeX)
↓
output/A.tex → output/A.pdf
| ID | Profile | Target roles |
|---|---|---|
| A | MLOps / ML Engineer | Pipeline ownership, SWE foundation |
| B | Customer Analytics DS | CLV, churn, calibrated probabilities |
| C | Forecasting / Ops DS | Time series, anomaly detection |
| D | Ranking & Experimentation | Ranking, LTV, A/B testing |
Archetypes are selectors — they reference IDs from master.yaml, never duplicate content. See data/archetypes/_CONTRACT.md for the full contract.
- Every role and skill ID must resolve against master data
- Core skills require evidence (role IDs where the skill was applied)
- Tier promotion is forbidden:
familiarskills cannot appear incore_order - Empty bullet lists are rejected
max_pagesis asserted against the compiled PDF
cv_renderer/
models.py # Pydantic models for master data + archetype YAML
engine.py # Resolution and validation logic
renderer.py # Jinja2 → LaTeX rendering
cli.py # Click CLI (render, validate, list)
templates/
cv.tex.j2 # LaTeX template
data/
master.yaml # All CV content
archetypes/ # Archetype YAML configs (A–D)
tests/ # 48 tests covering models, engine, renderer, CLI
Renders an archetype to LaTeX.
| Flag | Description |
|---|---|
--output, -o |
Output path (default: output/<ID>.tex) |
--pdf |
Compile to PDF via latexmk/pdflatex |
Validates an archetype against master data without rendering.
| Flag | Description |
|---|---|
--all |
Validate all archetypes |
Prints all archetype IDs and labels.
uv sync
uv run pytest # run tests
uv run ruff check # lintRequires Python 3.12+. PDF compilation requires a TeX distribution (texlive or similar) with latexmk.