Generate polished PDF and HTML resumes from a single YAML file.
simple-resume
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 you can render without creating additional content.
Why Simple-Resume
- Keep your resume version-controlled as plain YAML.
- Swap templates, palettes, and formats without rewriting content.
- Score resumes against job descriptions with built-in ATS algorithms.
- Pure-Python core with shell adapters; effects are testable and side-effect aware.
- Bundled HTML templates and static assets prevent "TemplateNotFound" errors in wheels and editable installs.
Feature Comparison
| 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 | Git-friendly | Git-friendly | Git-friendly | Cloud-only |
| Local Processing | 100% private | 100% private | 100% private | Cloud storage |
| Template System | HTML + Jinja2 | JSON themes | Multiple formats | Web builder |
| LaTeX Support | Yes | No | No | No |
| Python API | Native | No | No | No |
| CLI Tools | Yes | Yes | Yes | No |
| Real-time Preview | HTML + auto-reload | No | No | Yes |
| ATS Scoring | Built-in (4 algorithms) | No | No | No |
| Custom Themes | Unlimited | Limited | Limited | Paid only |
| Color Palettes | Yes | No | Basic | Limited |
See Detailed Comparison for full analysis.
Installation
# With uv (recommended)
uv add simple-resume
# With pip
pip install simple-resume
Platform requirements: Python 3.10+ on Linux, macOS, or Windows. PDF output uses WeasyPrint, which requires Cairo/Pango/GTK system libraries (see Usage Guide).
Quick Start
Create a YAML file in resume_private/input/my_resume.yaml:
JSON Resume (
*.jsonfrom jsonresume.org) is also supported — drop it into yourinput/folder andsimple-resumeauto-converts it at load time.Editor autocomplete is available via the JSON Schema at
src/simple_resume/shell/assets/static/schema.json.
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 + browser
Built-in templates: resume_no_bars, resume_with_bars,
resume_modern, resume_professional, resume_creative, demo.
Cover letters use the cover template.
See src/simple_resume/shell/assets/templates/html/ for all templates.
Python API
from simple_resume import generate, preview
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")
See API Reference and API Stability Policy for the full public surface.
ATS Resume Scoring
Score resumes against job descriptions using multiple NLP algorithms.
CLI
# Single resume
uv run simple-resume screen resume.yaml job.txt
# Score a PDF or HTML resume directly
uv run simple-resume screen resume.pdf job.txt
# Human reviewer mode (emphasizes semantic similarity)
uv run simple-resume screen resume.yaml job.txt --mode human
# Batch mode — rank all resumes in a directory
uv run simple-resume screen resumes/ job.txt --batch --top 5
# Batch with structured output and detail
uv run simple-resume screen resumes/ job.txt --batch --format json --verbose
Supported input formats: .yaml, .yml, .json, .txt, .md, .pdf, .html, .htm.
Python API
from simple_resume import score_resume
result = score_resume(
resume_text="Senior Python Developer with 5 years experience...",
job_description="Looking for a Senior Python Engineer..."
)
print(f"Match score: {result.overall_score * 100:.1f}%")
Scoring algorithms
- TF-IDF + Cosine Similarity — statistical term frequency analysis
- Jaccard + N-gram — set intersection and phrase overlap
- Exact Keyword — direct matching with fuzzy tolerance and skills taxonomy (800+ skills from O*NET and LinkedIn bundles)
- BERT Semantic — contextual embeddings via sentence-transformers
(optional:
uv add simple-resume[bert])
The tournament system combines algorithms using weighted averages with
mode-specific presets (--mode ats or --mode human).
See ATS API Reference for the scoring API,
ATS Scoring Rubric for methodology, and
Similarity Algorithm Evaluation
for benchmarks.
Customization
- 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
Documentation
Getting started: Getting Started, Usage Guide, Workflows, Path Handling
API: API Reference, ATS API Reference, Shell Layer APIs, API Stability Policy
Architecture: Architecture Guide, Lazy Loading, Migration Guide
Design: Color Schemes, PDF Renderer Evaluation
Samples: sample/ directory
Development
git clone https://github.com/athola/simple-resume.git
cd simple-resume
uv sync --dev --extra utils # or: pip install -e .[dev,utils]
Run checks before opening a PR:
make lint && make test # or: make check-all validate
Releases are automated via GitHub Actions — tag with v* and push:
git tag v0.1.2 && git push origin v0.1.2
See Development Guide and Contributing for full details. Submit issues or ideas in GitHub Issues.
Troubleshooting
- TemplateNotFound: confirm installation includes packaged assets;
custom templates require
--templates-dir. - PDF on Linux: install system libs
cairo,pango,gdk-pixbuf(WeasyPrint requirement). - PDF rendering errors:
simple-resumepinspydyf>=0.10.0,<0.12.0to avoid incompatible releases. Overriding this constraint may cause silent failures. - Case-variant
input/directories:Input/,INPUT/, etc. are detected automatically (v0.2.5+).
License
MIT License. See LICENSE.
Star History
Metadata
Release files for simple-resume 0.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| simple_resume-0.3.2.tar.gz | 919.3 kB | Without provenance | Details for simple_resume-0.3.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| simple_resume-0.3.2-py3-none-any.whl | Python 3 | none | any | Details for simple_resume-0.3.2-py3-none-any.whl |
Total release size: 1.9 MB
Release files / simple_resume-0.3.2.tar.gz
| Download URL | simple_resume-0.3.2.tar.gz |
|---|---|
| Size | 919.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
502c9da752498b572639903db909ada0fff23b264b0d81c83d5b5512d9bc3b6c
|
|
BLAKE2b-256 checksum How to use checksums |
121f0c75a117b6efe0f5401a38a99b77a9935dee0af3f43a223a404ab1940a5f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.20
|
Release files / simple_resume-0.3.2-py3-none-any.whl
| Download URL | simple_resume-0.3.2-py3-none-any.whl |
|---|---|
| Size | 1.0 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7c379f7371884536b730b3379475c6a785f5613a2e331c63ecaea4c330aa2007
|
|
BLAKE2b-256 checksum How to use checksums |
666e1b967f502bc7003a1ccdac251bc73ed4d18e9927e1a51a01f519e30782b3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.20
|
Security for simple-resume 0.3.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.