AI-Powered Resume & Cover Letter Automation Pipeline
Version: v4.3.0 Last Updated: February 07, 2025
Jobbernaut Tailor is a validation-first resume automation system that generates ATS-optimized, tailored resumes and cover letters at scale while maintaining quality through multi-stage validation and self-healing error recovery.
Quality > Speed > Cost
Every design decision prioritizes validation and error recovery over raw performance.
- Input validation (fail-fast)
- Pydantic schema validation (character limits, formats)
- Fact verification (hallucination detection) ⭐ NEW
- Quality thresholds (content quality)
- LaTeX compilation (PDF generation)
- Job resonance analysis (emotional keywords, cultural fit)
- Company research (mission, values, tech stack)
- Storytelling arc (cover letter narrative structure)
- Character limit enforcement (118 chars/bullet, 85 chars/skill)
- Format standardization (phone, dates, locations)
- LaTeX-based PDF generation
- Clean, parseable structure
- 3 levels: Low, Medium, High
- Bypasses AI detection (>95% success rate)
- Configurable per document type
- Maintains professional tone
- Automatic retry with progressive feedback
- Shadow failure tracking
- Incident logging to
learnings.yaml -
99.5% success rate after retries
- Process 10 jobs simultaneously
- 10x speedup vs sequential (100 jobs in ~12.5 min)
- Real-time progress tracking
- Independent job execution
# System Requirements
- Python 3.8+
- pdflatex (TeX Live or MiKTeX)
- 2GB RAM minimum
- Internet connection (API calls)# Clone repository
git clone https://github.com/Jobbernaut/jobbernaut-tailor.git
cd jobbernaut-tailor
# Install dependencies
pip install -r requirements.txt
# Set up environment
cp .env.example .env
# Edit .env and add your POE_API_KEY-
Set up master resume:
# Edit your master resume vim profile/master_resume.json -
Configure settings:
# Edit configuration vim config.json -
Add job applications:
# Add jobs to process vim data/applications.yaml
# Process all pending jobs
python src/main.py
# Output will be in output/ directory1. Job Resonance Analysis (intelligence)
↓
2. Company Research (intelligence)
↓
3. Storytelling Arc (cover letter narrative)
↓
4. Resume Generation (Pydantic validation + Fact Verification)
↓
5. Cover Letter Generation (quality validation)
↓
6. Resume LaTeX Rendering (Jinja2 template)
↓
7. Cover Letter LaTeX Rendering (Jinja2 template)
↓
8. Resume PDF Compilation (pdflatex)
↓
9. Cover Letter PDF Compilation (pdflatex)
↓
10-11. [Optional] Referral Documents
↓
12. Cleanup & Status Update
Processing Time: 60-90 seconds per job
Concurrent: 10 jobs in ~90 seconds (wall clock)
output/
└── TechCorp_Senior_Software_Engineer_job_001/
├── John_Doe_TechCorp_job_001_Resume.pdf
├── John_Doe_TechCorp_job_001_Cover_Letter.pdf
├── Referral_John_Doe_TechCorp_job_001_Resume.pdf (optional)
├── Referral_John_Doe_TechCorp_job_001_Cover_Letter.pdf (optional)
└── debug/
├── Resume.json
├── Resume.tex
├── CoverLetter.txt
├── CoverLetter.tex
├── Job_Resonance_Analysis.json
├── Company_Research.json
└── Storytelling_Arc.json
config.json:
{
"max_concurrent_jobs": 10,
"humanization": {
"enabled": true,
"levels": {
"resume": "medium",
"cover_letter": "high"
}
},
"reasoning_trace": false,
"file_paths": {
"applications": "data/applications.yaml",
"master_resume": "profile/master_resume.json"
}
}Intelligence Steps:
{
"intelligence_steps": {
"job_resonance_analysis": {
"bot_name": "claude-haiku-4.5",
"parameters": {
"thinking_budget": 0
}
},
"company_research": {
"bot_name": "claude-haiku-4.5",
"parameters": {
"thinking_budget": 0,
"web_search": true
}
},
"storytelling_arc": {
"bot_name": "claude-haiku-4.5",
"parameters": {
"thinking_budget": 0
}
}
}
}Content Generation:
{
"resume_generation": {
"bot_name": "gemini-3-pro",
"parameters": {
"thinking_level": "low"
}
},
"cover_letter_generation": {
"bot_name": "claude-haiku-4.5",
"parameters": {
"thinking_budget": 0
}
}
}Purpose: Prevent AI hallucinations in generated resumes
How It Works:
- Extract factual claims from generated resume
- Verify against master resume
- Detect hallucinations (fabricated facts)
- Retry with detailed feedback if found
Success Rate: >99% after retry
Hallucination Types Detected:
- Company name mismatches
- Job title fabrications
- Date inconsistencies
- Skill exaggerations
- Project inventions
Purpose: Make AI-generated content sound authentically human
3 Levels:
- Low: Minimal changes, ATS-safe
- Medium: Balanced approach (recommended for resumes)
- High: Maximum humanization (recommended for cover letters)
AI Detection Bypass: >95% success rate
Configuration:
{
"humanization": {
"enabled": true,
"levels": {
"resume": "medium",
"cover_letter": "high"
}
}
}Real-time visualization with Rich tables:
- Jobs processed / total
- Current step per job
- Retry attempts (API, validation, quality)
- Shadow failure tracking
- Incident logging
Example Output:
┌─────────────┬──────────────────────────┬─────────────────────┐
│ Job ID │ Company │ Current Step │
├─────────────┼──────────────────────────┼─────────────────────┤
│ job_001 │ TechCorp │ Resume Generation │
│ job_002 │ StartupXYZ │ Company Research │
│ job_003 │ BigTech Inc │ PDF Compilation │
└─────────────┴──────────────────────────┴─────────────────────┘
Automatic Retry with progressive feedback:
- API failures: Exponential backoff (max 2 attempts)
- Validation errors: Retry with error feedback
- Fact verification: Retry with hallucination details
- Quality issues: Retry with quality feedback
Failure Logging to learnings.yaml:
- Timestamp and context
- Failure type and details
- Retry attempts
- Recovery status
Sequential (v4.1):
- 100 jobs × 75s = 125 minutes
Concurrent (v4.2):
- 100 jobs ÷ 10 = 12.5 minutes
- 10x speedup
Validation Success Rate:
- Input validation: 100% (fail-fast)
- Pydantic validation: >99.5% (after retry)
- Fact verification: >99% (after retry)
- Quality thresholds: >99.5% (after retry)
- LaTeX compilation: >99.9%
Overall Success Rate: >99.5% after self-healing
Memory:
- Base: ~200MB
- Per concurrent job: ~50MB
- 10 concurrent: ~700MB total
CPU:
- Average utilization: 30-50%
- Peak during PDF compilation: 80-90%
- Architecture Guide - System design and 12-step pipeline
- Fact Verification - Hallucination detection system
- Humanization - Content humanization system
- Configuration - Setup and customization
- Tech Debt Analysis - Code quality assessment
- ✅ Fact verification system (hallucination detection)
- ✅ 3-level humanization system
- ✅ Progress tracking with Rich tables
- ✅ Shadow failure tracking
- ✅ Reasoning trace removal
- ✅ Semaphore-based concurrency (10x speedup)
- ✅ Real-time progress tracking
- ✅ Independent job execution
- ✅ Job resonance analysis
- ✅ Company research
- ✅ Storytelling arc generation
- ✅ Pydantic schema validation
- ✅ Automatic retry with feedback
- ✅ Quality thresholds
- ✅ Incident logging
- ✅ Jinja2 template rendering
- ✅ pdflatex compilation
- ✅ ATS-optimized formatting
- ✅ Basic resume generation
- ✅ Master resume integration
- ✅ Job description parsing
- Python 3.8+
- 2GB RAM
- 1GB disk space
- Internet connection
- Python 3.10+
- 4GB RAM
- 5GB disk space (for LaTeX)
- Stable internet connection
Python Packages:
pydantic>=2.0.0
pyyaml>=6.0
jinja2>=3.1.0
python-dotenv>=1.0.0
fastapi-poe>=0.0.36
rich>=13.0.0
System Packages:
- pdflatex (TeX Live or MiKTeX)
- Git (for version control)
Issue: LaTeX compilation fails
# Solution: Install TeX Live
sudo apt-get install texlive-full # Linux
brew install --cask mactex # macOS
# Windows: Download MiKTeX installerIssue: API rate limiting
# Solution: Reduce concurrent jobs
# In config.json:
{
"max_concurrent_jobs": 5 # Reduce from 10
}Issue: Fact verification false positives
# Solution: Adjust fuzzy matching threshold
# In src/fact_verifier.py:
FUZZY_MATCH_THRESHOLD = 0.80 # Lower from 0.85Issue: Content detected as AI
# Solution: Increase humanization level
# In config.json:
{
"humanization": {
"levels": {
"resume": "high", # Increase from medium
"cover_letter": "high"
}
}
}https://github.com/Jobbernaut/jobbernaut-extract
Complementary tool that automates the applications.yaml entry process. Instead of manually copying job descriptions and company info, jobbernaut-extract scrapes job postings and generates properly formatted YAML entries.
Use case: Batch-add 50 jobs to applications.yaml in minutes instead of hours.
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests (if applicable)
- Submit a pull request
This is source-available code under the PolyForm Noncommercial License 1.0.0,.
- Free for non-commercial use: View, modify, fork, and share with attribution.
- Commercial use: Contact me at srmanda.cs@gmail.com for permission and pricing.
See LICENSE for full terms.
Built with:
- Pydantic - Data validation
- Jinja2 - Template rendering
- Rich - Terminal UI
- Poe API - AI model access
- LaTeX - PDF generation
- FAANGPath - Resume and Cover Letter Templates
Version: v4.3.0 (Production Release)
Last Updated: February 07, 2025
Status: Production Ready ✅