Generate polished PDF and HTML resumes from a single YAML file.
simple-resume is a Python 3.10+ CLI and library for converting structured YAML (or JSON Resume) into PDF, HTML, or LaTeX. Templates and static assets ship with the package so users can render without creating additional content.
- Python: 3.10+ (tested in CI)
- OS: Linux, macOS, Windows. PDF output uses WeasyPrint; ensure Cairo/Pango/GTK are available on your platform (see Usage Guide).
# With uv (recommended)
uv add simple-resume
# With pip
pip install simple-resume- Keep your resume version-controlled as plain YAML.
- Swap templates, palettes, and formats without rewriting content.
- Pure-Python core with shell adapters; effects are testable and side-effect aware.
- Bundled HTML templates and static assets prevent "TemplateNotFound" errors in wheels/editable installs.
| Feature | simple-resume | JSON Resume | HackMyResume | Resume.io |
|---|---|---|---|---|
| Open Source | Yes | Yes | Yes | No |
| Data Format | YAML + JSON Resume | JSON | JSON/FRESH | Proprietary |
| Version Control | Yes (Git-friendly) | Yes (Git-friendly) | Yes (Git-friendly) | No (Cloud-only) |
| Local Processing | Yes (100% private) | Yes (100% private) | Yes (100% private) | No (Cloud storage) |
| Template System | HTML + Jinja2 | JSON themes | Multiple formats | Web builder |
| LaTeX Support | Yes | No | No | No |
| Python API | Yes (Native) | No | No | No |
| CLI Tools | Yes | Yes | Yes | No |
| Real-time Preview | Yes (HTML + auto-reload) | No | No | Yes |
| Custom Themes | Yes (Unlimited) | Limited | Limited | Limited (Paid only) |
| Color Palettes | Yes | No | Limited (Basic) | Limited |
| Privacy | Yes | Yes | Yes | No (Data stored on servers) |
| Setup Time | 5 min | 10 min | 15 min | 2 min |
| Learning Curve | Moderate | Easy | Easy | Easiest |
See Detailed Comparison for full analysis and use case recommendations.
git clone https://github.com/athola/simple-resume.git
cd simple-resume
uv sync --dev --extra utils # or: pip install -e .[dev,utils]Create a minimal YAML in resume_private/input/my_resume.yaml:
Note: JSON Resume (
*.jsonfrom https://jsonresume.org) is also supported — drop it into yourinput/folder andsimple-resumewill auto-convert it at load time.Tip: Editor autocomplete is available via JSON Schema at
src/simple_resume/shell/assets/static/schema.json(VS Code YAML extension supports schema association).
template: resume_no_bars
full_name: Jane Doe
email: jane.doe@example.com
body:
Experience:
- title: Senior Engineer
company: TechCorp
start: 2022
end: Present
description: |
- Lead microservices migration
- Improved latency by 40%Generate output:
uv run simple-resume generate --format pdf # PDF
uv run simple-resume generate --format html --open # HTML + open in browserBuilt-in templates: resume_no_bars, resume_with_bars, demo (see src/simple_resume/shell/assets/templates/html/). Static assets are stored in .../assets/static/.
from simple_resume import generate, preview
# Generate with format overrides
results = generate("resume_private/input/my_resume.yaml", formats=["pdf", "html"])
print(results["pdf"].output_path)
# Browser preview with live reload
preview("resume_private/input/my_resume.yaml")For batch operations:
from simple_resume import ResumeSession
with ResumeSession(data_dir="resume_private") as session:
session.generate_all(format="pdf")Score resumes against job descriptions using multiple NLP algorithms:
from simple_resume import score_resume
# Score a resume against a job description
result = score_resume(
resume_text="Senior Python Developer with 5 years experience...",
job_description="We are looking for a Senior Python Engineer with 5 years of experience..."
)
print(f"Match score: {result.overall_score * 100:.1f}%")
print(f"Status: {result.metadata['scorer_names']}")
# Generate a detailed report
from simple_resume import ATSReportGenerator
from pathlib import Path
report_gen = ATSReportGenerator(
result=result,
resume_file="my_resume.yaml",
job_file="job_description.txt"
)
yaml_report = report_gen.generate_yaml()
# Save to file (shell layer responsibility)
Path("ats_report.yaml").write_text(yaml_report)Available scoring algorithms:
- TF-IDF + Cosine Similarity (
TFIDFScorer): Statistical term frequency analysis - Jaccard + N-gram (
JaccardScorer): Set intersection and phrase overlap - Exact Keyword (
KeywordScorer): Direct keyword matching with fuzzy tolerance - BERT Semantic (
BERTScorer): Contextual embeddings via sentence-transformers (optional)
# Install with BERT support (optional)
uv add simple-resume[bert]The tournament system combines multiple algorithms using weighted averages to produce detailed scores. See ATS Scoring Rubric for complete methodology.
- Palettes:
--palette "Professional Blue"or--palette path/to/palette.yaml. - Custom templates:
--template custom.htmlwith--templates-dir /path/to/templates. - LaTeX: set
config.output_mode: latexand compile with your TeX toolchain (see Usage Guide). - Color utilities:
simple_resume.core.colors.get_contrasting_text_colorfor accessibility checks.
Releases are automated via GitHub Actions. To create a new release:
# Tag the version (must start with 'v')
git tag v0.1.2
git push origin v0.1.2The workflow builds the package, generates a changelog from commit history, and publishes a GitHub release with distribution artifacts.
- Guides: Getting Started, Usage, Workflows, Path Handling.
- API Docs: API Reference, API Stability Policy, Shell Layer APIs.
- Architecture: Architecture Guide and
wiki/architecture/. - Migration: Migration Guide (includes generate module reorganization notes).
- Development: Development Guide, Contributing, PDF renderer evaluation.
- Samples:
sample/directory;sample_dark_sidebar.htmlpreview.
TemplateNotFound: confirm installation includes packaged assets (bundled in wheels/editable installs); custom templates require--templates-dir.- PDF on Linux: install system libs
cairo,pango,gdk-pixbuf(WeasyPrint requirement).
- Follow the Development Guide to set up tools.
- Run
make lintandmake test(ormake check-all validate) before opening a PR. - Submit issues or ideas in GitHub Issues or discussions.
MIT License. See LICENSE.
