Resume optimization tool that transforms any resume into a job-specific, ATS-friendly PDF.
- Any format in - LaTeX, plain text, markdown, HTML, PDF
- Optimized PDF out - Single-page, professionally formatted
- LLM-powered optimization - Tailors content to job requirements
- Minimal changes - Preserves your content, only restructures for fit
- No fabrication - Hallucination detection prevents made-up claims
- Opinionated formatting - Follows proven resume guidelines (one page, no fluff, etc.)
- Multi-filter validation - ATS simulation, keyword matching, structure checks
- Web UI + CLI - Streamlit dashboard or command-line
- Debug mode - Inspect optimization iterations
- Upload resume in any text format (content source only)
- Provide job posting URL or text description
- LLM extracts content and generates optimized HTML resume
- System runs internal filters (ATS simulation, keyword matching, hallucination detection)
- If filters reject, regenerates using feedback
- When all checks pass, renders HTML→PDF via WeasyPrint
# Install
uv sync
# Configure
cp .env.example .env
# Edit .env and add your GOOGLE_API_KEY
# Run web UI
uv run streamlit run src/hr_breaker/main.pyLaunch with uv run streamlit run src/hr_breaker/main.py
- Paste or upload resume
- Enter job URL or description
- Click optimize
- Download PDF
# From URL
uv run hr-breaker optimize resume.txt https://example.com/job
# From job description file
uv run hr-breaker optimize resume.txt job.txt
# Debug mode (saves iterations)
uv run hr-breaker optimize resume.txt job.txt -d
# List generated PDFs
uv run hr-breaker list- Final PDFs:
output/<name>_<company>_<role>.pdf - Debug iterations:
output/debug_<company>_<role>/ - Records:
output/index.json
Copy .env.example to .env and set your API key. All other settings have sensible defaults.
| Variable | Required | Description |
|---|---|---|
GOOGLE_API_KEY |
Yes | Google Gemini API key |
GEMINI_PRO_MODEL |
No | Model for complex tasks (default: gemini-3-pro-preview) |
GEMINI_FLASH_MODEL |
No | Model for simple tasks (default: gemini-3-flash-preview) |
GEMINI_THINKING_BUDGET |
No | Thinking tokens budget (default: 8192) |
MAX_ITERATIONS |
No | Optimization loop limit (default: 5) |
See .env.example for all available options (filter thresholds, scraper settings, etc.)
src/hr_breaker/
├── agents/ # Pydantic-AI agents (optimizer, reviewer, etc.)
├── filters/ # Validation plugins (ATS, keywords, hallucination)
├── services/ # Rendering, scraping, caching
│ └── scrapers/ # Job scraper implementations
├── models/ # Pydantic data models
├── orchestration.py # Core optimization loop
├── main.py # Streamlit UI
└── cli.py # Click CLI
Agents: job_parser, optimizer, combined_reviewer, name_extractor, hallucination_detector, ai_generated_detector
Filters (run by priority): 0. ContentLengthChecker - Pre-render size check
- DataValidator - HTML structure validation
- HallucinationChecker - Detect fabrications
- KeywordMatcher - TF-IDF matching
- LLMChecker - ATS simulation
- VectorSimilarityMatcher - Semantic similarity
- AIGeneratedChecker - Detect AI-sounding text
# Run tests
uv run pytest tests/
# Install dev dependencies
uv sync --group dev