{"id":35198703,"url":"https://github.com/athola/simple-resume","last_synced_at":"2026-03-10T23:00:49.687Z","repository":{"id":323728586,"uuid":"664199359","full_name":"athola/simple-resume","owner":"athola","description":"Generate a simple, elegant PDF/HTML/LaTeX resume from YAML","archived":false,"fork":false,"pushed_at":"2026-03-06T23:56:39.000Z","size":6675,"stargazers_count":54,"open_issues_count":17,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-07T04:43:34.700Z","etag":null,"topics":["css","cv","html","latex","markdown","pdf-generation","portfolio","python","resume","resume-template","template","yaml"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/athola.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["athola"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"athola","thanks_dev":null,"custom":null}},"created_at":"2023-07-09T08:03:54.000Z","updated_at":"2026-03-07T00:20:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/athola/simple-resume","commit_stats":null,"previous_names":["athola/simple-resume"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/athola/simple-resume","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athola%2Fsimple-resume","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athola%2Fsimple-resume/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athola%2Fsimple-resume/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athola%2Fsimple-resume/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/athola","download_url":"https://codeload.github.com/athola/simple-resume/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athola%2Fsimple-resume/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30360486,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"ssl_error","status_checked_at":"2026-03-10T21:40:59.357Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["css","cv","html","latex","markdown","pdf-generation","portfolio","python","resume","resume-template","template","yaml"],"created_at":"2025-12-29T09:24:55.499Z","updated_at":"2026-03-10T23:00:49.671Z","avatar_url":"https://github.com/athola.png","language":"Python","funding_links":["https://github.com/sponsors/athola","https://buymeacoffee.com/athola"],"categories":[],"sub_categories":[],"readme":"![Simple-Resume preview screenshot](assets/preview.png)\n\n_Generate polished PDF and HTML resumes from a single YAML file._\n\n[![PyPI Downloads](https://img.shields.io/pypi/dm/simple-resume?style=flat-square)](https://pypi.org/project/simple-resume/)\n[![MIT License](https://img.shields.io/github/license/athola/simple-resume?style=flat-square)](https://github.com/athola/simple-resume/blob/main/LICENSE)\n[![Code Quality](https://github.com/athola/simple-resume/workflows/Code%20Quality/badge.svg)](https://github.com/athola/simple-resume/actions/workflows/code-quality.yml)\n[![Linting](https://github.com/athola/simple-resume/workflows/Linting/badge.svg)](https://github.com/athola/simple-resume/actions/workflows/lint.yml)\n[![Test Suite](https://github.com/athola/simple-resume/workflows/Test%20Suite/badge.svg)](https://github.com/athola/simple-resume/actions/workflows/test.yml)\n[![Code Coverage](https://codecov.io/gh/athola/simple-resume/branch/main/graph/badge.svg)](https://codecov.io/gh/athola/simple-resume)\n[![PyPI Version](https://img.shields.io/pypi/v/simple-resume.svg)](https://pypi.org/project/simple-resume/)\n\n# simple-resume\n\n`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.\n\n## Supported platforms\n\n- Python: 3.10+ (tested in CI)\n- OS: Linux, macOS, Windows. PDF output uses WeasyPrint; ensure Cairo/Pango/GTK are available on your platform (see [Usage Guide](wiki/Usage-Guide.md#system-dependencies)).\n\n## Installation\n\n```bash\n# With uv (recommended)\nuv add simple-resume\n\n# With pip\npip install simple-resume\n```\n\n## Why Simple-Resume\n\n- Keep your resume version-controlled as plain YAML.\n- Swap templates, palettes, and formats without rewriting content.\n- Pure-Python core with shell adapters; effects are testable and side-effect aware.\n- Bundled HTML templates and static assets prevent \"TemplateNotFound\" errors in wheels/editable installs.\n\n## Feature Comparison\n\n| Feature | simple-resume | JSON Resume | HackMyResume | Resume.io |\n|---------|---------------|-------------|---------------|-----------|\n| **Open Source** | Yes | Yes | Yes | No |\n| **Data Format** | YAML + JSON Resume | JSON | JSON/FRESH | Proprietary |\n| **Version Control** | Yes (Git-friendly) | Yes (Git-friendly) | Yes (Git-friendly) | No (Cloud-only) |\n| **Local Processing** | Yes (100% private) | Yes (100% private) | Yes (100% private) | No (Cloud storage) |\n| **Template System** | HTML + Jinja2 | JSON themes | Multiple formats | Web builder |\n| **LaTeX Support** | Yes | No | No | No |\n| **Python API** | Yes (Native) | No | No | No |\n| **CLI Tools** | Yes | Yes | Yes | No |\n| **Real-time Preview** | Yes (HTML + auto-reload) | No | No | Yes |\n| **Custom Themes** | Yes (Unlimited) | Limited | Limited | Limited (Paid only) |\n| **Color Palettes** | Yes | No | Limited (Basic) | Limited |\n| **Privacy** | Yes | Yes | Yes | No (Data stored on servers) |\n| **Setup Time** | 5 min | 10 min | 15 min | 2 min |\n| **Learning Curve** | Moderate | Easy | Easy | Easiest |\n\n*See [Detailed Comparison](wiki/Comparison.md) for full analysis and use case recommendations.*\n\n### Development setup\n\n```bash\ngit clone https://github.com/athola/simple-resume.git\ncd simple-resume\nuv sync --dev --extra utils   # or: pip install -e .[dev,utils]\n```\n\n## Quick start (CLI)\n\nCreate a minimal YAML in `resume_private/input/my_resume.yaml`:\n\n\u003e Note: JSON Resume (`*.json` from https://jsonresume.org) is also supported —\n\u003e drop it into your `input/` folder and `simple-resume` will auto-convert it at load time.\n\u003e\n\u003e Tip: Editor autocomplete is available via JSON Schema at\n\u003e `src/simple_resume/shell/assets/static/schema.json` (VS Code YAML extension supports schema association).\n\n```yaml\ntemplate: resume_no_bars\nfull_name: Jane Doe\nemail: jane.doe@example.com\nbody:\n  Experience:\n    - title: Senior Engineer\n      company: TechCorp\n      start: 2022\n      end: Present\n      description: |\n        - Lead microservices migration\n        - Improved latency by 40%\n```\n\nGenerate output:\n\n```bash\nuv run simple-resume generate --format pdf         # PDF\nuv run simple-resume generate --format html --open # HTML + open in browser\n```\n\nBuilt-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; static assets are in `.../assets/static/`.\n\n## Python API\n\n```python\nfrom simple_resume import generate, preview\n\n# Generate with format overrides\nresults = generate(\"resume_private/input/my_resume.yaml\", formats=[\"pdf\", \"html\"])\nprint(results[\"pdf\"].output_path)\n\n# Fine-grained control via GenerateOptions\nfrom simple_resume import GenerateOptions\n\nopts = GenerateOptions(formats=(\"pdf\", \"html\"), open_after=True)\n\n# Browser preview with live reload\npreview(\"resume_private/input/my_resume.yaml\")\n```\n\nFor batch operations:\n\n```python\nfrom simple_resume import ResumeSession\n\nwith ResumeSession(data_dir=\"resume_private\") as session:\n    session.generate_all(format=\"pdf\")\n```\n\n## ATS Resume Scoring\n\nScore resumes against job descriptions using multiple NLP algorithms:\n\n```python\nfrom simple_resume import score_resume\n\n# Score a resume against a job description\nresult = score_resume(\n    resume_text=\"Senior Python Developer with 5 years experience...\",\n    job_description=\"We are looking for a Senior Python Engineer with 5 years of experience...\"\n)\n\nprint(f\"Match score: {result.overall_score * 100:.1f}%\")\nprint(f\"Status: {result.metadata['scorer_names']}\")\n\n# Generate a detailed report\nfrom simple_resume import ATSReportGenerator\nfrom pathlib import Path\n\nreport_gen = ATSReportGenerator(\n    result=result,\n    resume_file=\"my_resume.yaml\",\n    job_file=\"job_description.txt\"\n)\nyaml_report = report_gen.generate_yaml()\n# Save to file (shell layer responsibility)\nPath(\"ats_report.yaml\").write_text(yaml_report)\n```\n\n**Available scoring algorithms:**\n\n- **TF-IDF + Cosine Similarity** (`TFIDFScorer`): Statistical term frequency analysis\n- **Jaccard + N-gram** (`JaccardScorer`): Set intersection and phrase overlap\n- **Exact Keyword** (`KeywordScorer`): Direct keyword matching with fuzzy tolerance and skills taxonomy\n- **BERT Semantic** (`BERTScorer`): Contextual embeddings via sentence-transformers (optional)\n\n```bash\n# Install with BERT support (optional)\nuv add simple-resume[bert]\n```\n\n**Skills Taxonomy (optional):** The keyword scorer can optionally integrate with external skills APIs (LinkedIn, O*NET) for expanded term recognition. This is offline-first—the hardcoded skills list works without configuration. Enable API integration via environment variables when needed.\n\nThe tournament system combines multiple algorithms using weighted averages to produce detailed scores. See [ATS API Reference](wiki/ATS-API-Reference.md) for the full scoring API, [ATS Scoring Rubric](wiki/ATS-Scoring-Rubric.md) for methodology, and [Similarity Algorithm Evaluation](wiki/Similarity-Algorithm-Evaluation.md) for algorithm benchmarks.\n\n## Customization\n\n- **Palettes**: `--palette \"Professional Blue\"` or `--palette path/to/palette.yaml`.\n- **Custom templates**: `--template custom.html` with `--templates-dir /path/to/templates`.\n- **LaTeX**: set `config.output_mode: latex` and compile with your TeX toolchain (see [Usage Guide](wiki/Usage-Guide.md#latex-output)).\n- **Color utilities**: `simple_resume.core.colors.get_contrasting_text_color` for accessibility checks.\n\n## Release workflow\n\nReleases are automated via GitHub Actions. To create a new release:\n\n```bash\n# Tag the version (must start with 'v')\ngit tag v0.1.2\ngit push origin v0.1.2\n```\n\nThe workflow builds the package, generates a changelog from commit history, and publishes a GitHub release with distribution artifacts.\n\n## Workflows \u0026 docs\n\n- **Guides**: [Getting Started](wiki/Getting-Started.md), [Usage](wiki/Usage-Guide.md), [Workflows](wiki/Workflows.md), [Path Handling](wiki/Path-Handling-Guide.md).\n- **API Docs**: [API Reference](wiki/API-Reference.md), [ATS API Reference](wiki/ATS-API-Reference.md), [API Stability Policy](wiki/API-Stability-Policy.md), [Shell Layer APIs](wiki/Shell-Layer-APIs.md).\n- **Architecture**: [Architecture Guide](wiki/Architecture-Guide.md) and `wiki/architecture/`.\n- **Migration**: [Migration Guide](wiki/Migration-Guide.md) (includes generate module reorganization notes).\n- **Development**: [Development Guide](wiki/Development-Guide.md), [Contributing](wiki/Contributing.md), [PDF renderer evaluation](wiki/PDF-Renderer-Evaluation.md).\n- **Samples**: `sample/` directory; `sample_dark_sidebar.html` preview.\n\n## Troubleshooting\n\n- `TemplateNotFound`: confirm installation includes packaged assets (bundled in wheels/editable installs); custom templates require `--templates-dir`.\n- PDF on Linux: install system libs `cairo`, `pango`, `gdk-pixbuf` (WeasyPrint requirement).\n- PDF rendering errors with WeasyPrint: `simple-resume` pins `pydyf\u003e=0.10.0,\u003c0.12.0` to avoid incompatible releases. If you override this constraint, PDF output may silently fail.\n- Case-variant `input/` directories: `Input/`, `INPUT/`, etc. are detected automatically (v0.2.5+). Earlier versions required lowercase `input/`.\n\n## Contributing\n\n1. Follow the [Development Guide](wiki/Development-Guide.md) to set up tools.\n2. Run `make lint` and `make test` (or `make check-all validate`) before opening a PR.\n3. Submit issues or ideas in [GitHub Issues](https://github.com/athola/simple-resume/issues) or discussions.\n\n## License\n\nMIT License. See [LICENSE](LICENSE).\n\n## Star history\n\n[![Star History Chart](https://api.star-history.com/svg?repos=athola/simple-resume\u0026type=date\u0026legend=top-left)](https://www.star-history.com/#athola/simple-resume\u0026type=date\u0026legend=top-left)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fathola%2Fsimple-resume","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fathola%2Fsimple-resume","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fathola%2Fsimple-resume/lists"}