AI-powered resume tailoring system that adapts your base resume to specific job descriptions while preserving truthfulness.
This system intelligently tailors resumes to job postings by:
- Analyzing job requirements and your resume
- Scoring relevance of each bullet point
- Rewriting content for clarity (without fabrication)
- Filtering low-relevance bullets
- Reordering sections by relevance
- Generating tailored resumes in multiple formats
Key Principle: Preserve truth, improve signal-to-noise ratio.
- PDF Parsing: Layout-aware extraction preserving structure
- LLM Integration: Gemini and DeepSeek support with structured outputs
- Job Detection: Auto-extracts requirements from job descriptions
- Alignment Scoring: 0-1 relevance score per bullet with explanations
- Controlled Rewriting: Strict no-fabrication rules with hallucination detection
- Quality Validation: Automated checks for metric consistency, keyword stuffing
- Multiple Formats: Output as PDF, DOCX, or Markdown
- Chrome Extension: One-click tailoring from job boards (LinkedIn, Indeed, Greenhouse, Lever)
- REST API: Full-featured API with auto-generated docs
- Docker Support: Easy deployment locally or to cloud
- Python 3.11+
- uv (Python package manager)
- API key for Gemini or DeepSeek
- Docker (optional, for containerized deployment)
- Clone and setup:
cd backend
uv venv
source .venv/bin/activate # On macOS/Linux
# On Windows: .venv\Scripts\activate
uv pip install -r requirements.txt- Configure API keys:
cp .env.example .env
# Edit .env and add your API keys- Test the system:
# Parse a resume
python parse_resume.py path/to/resume.pdf
# Extract job requirements
python extract_job.py sample_job.txt
# Score alignment
python score_alignment.py path/to/resume.pdf sample_job.txt
# Complete pipeline
python assemble_resume.py path/to/resume.pdf sample_job.txtcp .env.example .env
# Edit .env with API keys
./start-docker.shAccess API at http://localhost:8000/docs
Parse Resume:
python parse_resume.py resume.pdfExtract Job Requirements:
python extract_job.py job_description.txt
python extract_job.py --text "Job description text here"Score Alignment:
python score_alignment.py resume.pdf job_description.txtRewrite Resume:
python rewrite_resume.py resume.pdf job_description.txt
python rewrite_resume.py resume.pdf job_description.txt gemini 0.6Complete Pipeline:
python assemble_resume.py resume.pdf job_description.txt
python assemble_resume.py resume.pdf job_description.txt --format pdf --threshold 0.4Quality Validation:
python validate_quality.py resume.pdf job_description.txtStart server:
cd backend
./start_server.shAPI Endpoints:
POST /api/parse-resume- Parse PDF resumePOST /api/extract-job- Extract job requirementsPOST /api/score-alignment- Score resume-job alignmentPOST /api/tailor-resume- Complete tailoring pipeline
Documentation:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
See backend/API_EXAMPLES.md for detailed usage.
-
Install extension:
- Open
chrome://extensions/ - Enable "Developer mode"
- Click "Load unpacked"
- Select
extensionfolder
- Open
-
Start backend:
cd backend ./start_server.sh -
Use extension:
- Navigate to job posting (LinkedIn, Indeed, etc.)
- Click extension icon
- Upload resume PDF
- Click "Tailor Resume"
- Download tailored resume
See extension/README.md for detailed instructions.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Chrome Extension (MV3) β
β ββββββββββββββββββββ ββββββββββββββββββββββββββββ β
β β Content Script ββββββββββΆβ Popup UI / Service β β
β β (Job Detection) β β Worker (API Client) β β
β ββββββββββββββββββββ ββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββ
β REST API
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FastAPI Backend (Python) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Resume Processing Pipeline β β
β β 1. Parse β 2. Extract β 3. Score β β
β β β β β β β
β β 4. Rewrite β 5. Assemble β 6. Validate β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββ ββββββββββββββββββββββββββββββββ β
β β PDF Parser β β LLM Orchestrator β β
β β (PyMuPDF/ β β (Gemini/DeepSeek + β β
β β pdfplumber) β β Instructor) β β
β ββββββββββββββββββββ ββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
backend/
βββ app/
β βββ models/ # Pydantic data models
β βββ parsers/ # PDF and text parsing
β βββ llm/ # LLM integration
β βββ pipeline/ # Processing pipeline
β βββ api/ # FastAPI endpoints
βββ tests/ # Test suite
βββ *.py # CLI tools
βββ requirements.txt # Python dependencies
extension/
βββ manifest.json # Extension configuration
βββ content.js # Job detection
βββ background.js # Service worker
βββ popup.html/js # UI and logic
βββ config.js # Environment config
cd backend
pytest tests/See extension/TESTING.md for comprehensive testing checklist.
- Unit tests for parsers, models, and pipeline components
- Integration tests for API endpoints
- Manual testing guide for extension
./start-docker.shSee DEPLOYMENT.md for detailed guides:
- AWS ECS + Fargate ($10-30/month)
- GCP Cloud Run ($0-10/month with free tier)
- Azure Container Instances ($10-20/month)
Extension supports multiple environments:
- Local:
http://localhost:8000 - Staging: Configure in extension settings
- Production: Configure in extension settings
- API keys stored in environment variables
- Secrets management for cloud deployment
- CORS configured for extension
- Input validation on all endpoints
- Quality validation prevents bad outputs
LLM Costs (per resume):
- Gemini Flash: ~$0.01-0.02
- DeepSeek: ~$0.005-0.01
Infrastructure:
- Local: Free (your machine)
- Cloud: $0-30/month depending on platform and usage
Tips:
- Use DeepSeek for lower costs
- Cloud Run scales to zero (pay per use)
- Set relevance threshold higher to reduce processing
"No job detected"
- Refresh page and wait 2-3 seconds
- Use manual input fallback
"Failed to tailor resume"
- Check backend is running
- Verify API keys are configured
- Check quality validation didn't fail
"Quality validation failed"
- Lower relevance threshold
- Check for metric changes in rewrite
- Review validation report
Extension can't connect
- Verify backend URL in extension
- Check CORS configuration
- Look at browser console for errors
See DEPLOYMENT.md for more troubleshooting tips.
- API Examples:
backend/API_EXAMPLES.md - Extension Guide:
extension/README.md - Extension Testing:
extension/TESTING.md - Deployment Guide:
DEPLOYMENT.md
- Parse Resume: Extract structured data from PDF
- Extract Job: Analyze job description for requirements
- Score Alignment: Rate each bullet's relevance (0-1)
- Rewrite Bullets: Improve clarity without fabrication
- Assemble Resume: Filter, reorder, and format
- Validate Quality: Check for hallucinations and issues
- No Fabrication: Strict rules prevent inventing experience
- Metric Consistency: Detects if numbers were added/changed
- Hallucination Detection: Multiple checks for false content
- Content Loss Prevention: Warns if too many bullets removed
- Keyword Stuffing Detection: Flags unnatural repetition
This is a personal project, but suggestions are welcome!
MIT License - See LICENSE file for details
Built with:
- FastAPI for the API
- Instructor for structured LLM outputs
- PyMuPDF & pdfplumber for PDF parsing
- ReportLab for PDF generation
- Google Gemini & DeepSeek for LLM capabilities
For issues or questions:
- Check documentation in respective folders
- Review troubleshooting section
- Check browser/server console logs
Status: Production Ready β
All 12 planned tasks completed. System is fully functional for local use and ready for cloud deployment.