A unified command-line interface for generating job-specific resumes from a single YAML source. Supports fast template-based generation and AI-powered customization with full integration into application tracking.
- Single Source of Truth: Store all resume data in
resume.yaml - Fast Generation: Create any variant in <1 second using Jinja2 templates
- AI-Powered: Optional AI customization using Claude or OpenAI
- ATS Compatibility: Check resume optimization for automated screening systems
- Multiple Variants: 6 pre-configured variants (base, backend, ML/AI, fullstack, DevOps, leadership)
- Multiple Formats: Output to Markdown, LaTeX, or PDF
- Application Tracking: Built-in CSV tracking with analytics
- GitHub Integration: Sync projects automatically
- LinkedIn Integration: Import/export LinkedIn profile data (including full data archive with folder export)
- Schema Validation: Catch errors before generating
- Python: 3.8, 3.9, 3.10, 3.11, or 3.12 (tested in CI)
- LaTeX (optional, for PDF generation): See PDF Generation section
git clone https://github.com/anchapin/resume-cli.git
cd resume-cli
pip install -e .pip install -e ".[ai]"This installs the required AI API packages:
anthropicfor Claudeopenaifor GPT modelspython-dotenvfor environment variable management
Option A: Start from scratch (recommended)
Copy the example resume file and customize it:
cp resume.example.yaml resume.yaml
# Edit resume.yaml with your informationOption B: Import from existing resume
If you have existing resume files:
resume-cli init --from-existingThis parses resumes/base_resume.txt and creates resume.yaml.
# Generate base variant as Markdown
resume-cli generate -v v1.0.0-base -f md
# Generate backend variant as PDF
resume-cli generate -v v1.1.0-backend -f pdf
# List all available variants
resume-cli variantsresume-cli validateGenerate a resume from template or AI.
resume-cli generate [OPTIONS]
Options:
-v, --variant TEXT Resume variant (default: v1.0.0-base)
-f, --format CHOICE Output format: md, tex, pdf (default: md)
-o, --output PATH Output file path
--no-save Print to stdout without saving
--ai Use AI-powered generation (requires --job-desc)
--job-desc PATH Path to job description file (required for --ai)Examples:
# Generate Markdown resume (template-based)
resume-cli generate -v v1.0.0-base -f md
# Generate PDF with custom output path
resume-cli generate -v v1.1.0-backend -f pdf -o my-resume.pdf
# AI-customized for specific job
resume-cli generate --ai --job-desc job-posting.txt
# Preview without saving
resume-cli generate -v v1.2.0-ml_ai --no-saveNote: The --ai flag requires --job-desc. Without --ai, generation uses fast templates (<1 second).
List all available resume variants.
resume-cli variantsCheck ATS (Applicant Tracking System) compatibility score.
Analyzes resume against job description and provides actionable feedback for optimization.
resume-cli ats-check [OPTIONS]
Options:
--job-desc PATH Path to job description file (required)
-v, --variant TEXT Resume variant to check (default: v1.0.0-base)
--output PATH Save report as JSON fileScoring Categories:
- Format Parsing (20pts): Text extraction and formatting checks
- Keywords (30pts): Job keyword matching (uses AI if available, falls back to regex)
- Section Structure (20pts): Standard ATS sections validation
- Contact Info (15pts): Email, phone, location verification
- Readability (15pts): Action verbs, metrics, bullet points
Examples:
# Check ATS score for backend variant
resume-cli ats-check -v v1.1.0-backend --job-desc job-posting.txt
# Save report as JSON
resume-cli ats-check --job-desc job.txt --output ats-report.jsonSample Output:
ATS Score: 81/100 (81%)
Good! Your resume is ATS-friendly with room for improvement.
Category Breakdown:
✓ Format Parsing: 20/20
✗ Keywords: 14/30 - Missing: Kubernetes, CI/CD
✓ Section Structure: 20/20
✓ Contact Info: 15/15
✗ Readability: 12/15
Top Recommendations:
1. Add these keywords to skills or experience: Kubernetes, CI/CD
2. Add quantifiable metrics (e.g., 'increased by 30%')
Validate resume.yaml schema and data.
resume-cli validateGenerate a complete application package: AI-customized resume + cover letter.
Note: This command automatically uses AI customization when a job description is provided. No --ai flag is needed or available.
resume-cli generate-package [OPTIONS]
Options:
--job-desc PATH Path to job description file (required)
-v, --variant TEXT Resume variant (default: v1.0.0-base)
--company TEXT Company name (overrides extraction from job description)
--non-interactive Skip questions, use smart defaults
--no-cover-letter Skip cover letter generation
--output-dir PATH Output directory (default: config setting)
--include-github-projects Auto-select GitHub projects matching job technologiesOutput Structure:
output/{company}-{date}/
├── resume.md
├── resume.pdf
├── cover-letter.md
└── cover-letter.pdf
Examples:
# Interactive mode (asks questions for cover letter)
resume-cli generate-package --job-desc job-posting.txt --variant v1.1.0-backend
# Non-interactive mode (uses smart guesses)
resume-cli generate-package --job-desc job.txt --company "Acme Corp" --non-interactive
# With GitHub projects auto-selected based on job technologies (AI is automatic)
resume-cli generate-package --job-desc job-posting.txt --variant v1.2.0-ml_ai --include-github-projects
# Note: No --ai flag needed - AI customization is automatic with --job-descLog a job application to tracking CSV.
resume-cli apply COMPANY STATUS [OPTIONS]
Arguments:
COMPANY Company name
STATUS Application status
Options:
-r, --role TEXT Job role/title
-v, --variant TEXT Resume variant used
-s, --source TEXT Application source
-u, --url TEXT Job posting URL
-n, --notes TEXT Additional notesExamples:
# Log new application
resume-cli apply Google applied -r "Senior Backend Engineer"
# Update status
resume-cli apply Google interview -v v1.1.0-backend
# With details
resume-cli apply Stripe offer -r "Staff Engineer" -s "Referral" -u "https://stripe.com/jobs"Valid statuses:
applied- Application submittedinterview- Interview scheduledoffer- Offer receivedrejected- Application rejectedwithdrawn- Withdrew application
Show application tracking analytics.
resume-cli analyzeSync GitHub projects to resume.yaml.
resume-cli sync-github [OPTIONS]
Options:
--months INTEGER Number of months to look back (default: 3)Requirements:
- GitHub CLI (
gh) installed and authenticated - Run
gh auth loginfirst if needed
Import LinkedIn profile data into resume.yaml.
resume-cli linkedin-import [OPTIONS]
Options:
--data-file PATH Path to LinkedIn exported JSON, CSV, or folder (required)
--output PATH Output YAML file path (default: resume.yaml)
--merge Merge with existing resume.yaml instead of overwriting
--dry-run Preview changes without writing to fileImportant: Direct URL import is not supported due to LinkedIn API restrictions. You must export your LinkedIn data first.
To get all your data (experience, education, skills, certifications):
- Go to https://www.linkedin.com/psettings/member-data
- Click "Request data archive" (NOT just "Profile" data)
- Wait for LinkedIn to prepare your download (may take a few minutes to hours)
- Download the ZIP file containing your data
- Extract the ZIP file - you can use either:
- The extracted folder directly (contains Profile.csv, Positions.csv, Education.csv, Skills.csv, etc.)
- A single JSON file (e.g.,
profile.json) - A single CSV file (e.g.,
Profile.csv)
Note: The basic "Profile" export (Profile.csv) only contains basic fields (name, headline, summary). It does NOT include experience, education, skills, or certifications. You must request the full data archive to get those.
Examples:
# Import from extracted LinkedIn data folder (recommended for full data)
resume-cli linkedin-import --data-file /path/to/extracted/linkedin-folder/
# Import from exported JSON (creates new resume.yaml)
resume-cli linkedin-import --data-file profile.json
# Merge with existing resume.yaml
resume-cli linkedin-import --data-file profile.json --merge
# Preview changes before importing
resume-cli linkedin-import --data-file profile.json --dry-run
# Import to custom path
resume-cli linkedin-import --data-file profile.json --output my-resume.yamlField Mapping:
| LinkedIn Field | resume.yaml Field |
|---|---|
| firstName/lastName | contact.name |
| contact.email | |
| phone | contact.phone |
| location | contact.location |
| headline/summary | professional_summary.base |
| skills | skills.* (auto-categorized) |
| experience | experience |
| education | education |
| certifications | certifications |
Export resume.yaml data to LinkedIn-friendly format.
resume-cli linkedin-export [OPTIONS]
Options:
-v, --variant TEXT Resume variant to export (default: v1.0.0-base)
-o, --output PATH Output file path (default: output/linkedin-update.txt)
--format CHOICE Output format: linkedin, plain (default: linkedin)Examples:
# Export for LinkedIn update
resume-cli linkedin-export
# Export specific variant
resume-cli linkedin-export -v v1.1.0-backend
# Export to custom file
resume-cli linkedin-export -o my-linkedin-update.txt
# Export plain text format
resume-cli linkedin-export --format plainNote: LinkedIn has character limits for each field. You may need to trim bullets to fit LinkedIn's format.
Initialize resume.yaml from existing resume files.
resume-cli init [OPTIONS]
Options:
--from-existing Parse existing resume filesThe single source of truth for all resume data:
meta:
version: "2.0.0"
last_updated: "2025-02-03"
contact:
name: "Your Name"
credentials: ["P.E."]
phone: "555-123-4567"
email: "you@example.com"
location:
city: "City"
state: "ST"
zip: "12345"
urls:
github: "https://github.com/username"
linkedin: "https://linkedin.com/in/username"
professional_summary:
base: "Default summary for all variants..."
variants:
backend: "Specialized backend summary..."
ml_ai: "ML/AI focused summary..."
skills:
programming_languages:
- { name: "Python", level: "Expert", years: 8 }
cloud_devops:
- { name: "AWS", services: ["EKS", "EC2"] }
experience:
- company: "Company Name"
title: "Job Title"
start_date: "2022-04"
end_date: null # null = current
bullets:
- text: "Achievement description..."
skills: ["DevOps", "Kubernetes"]
emphasize_for: ["backend", "devops"]
variants:
v1.0.0-base:
description: "General software engineering"
summary_key: "base"
skill_sections: ["programming_languages", "cloud_devops"]
max_bullets_per_job: 4General software engineering with balanced focus on all skills.
Backend & DevOps specialization. Emphasizes backend technologies, cloud infrastructure, databases, and APIs.
ML/AI specialization. Emphasizes AI/ML frameworks, data engineering, model deployment, and Python/PyTorch.
Full-stack specialization. Emphasizes frontend and backend balance and modern web frameworks.
DevOps & Infrastructure specialization. Emphasizes Kubernetes, Docker, CI/CD, and cloud platforms.
Leadership & Technical Staff. Emphasizes architecture, mentoring, and technical strategy.
-
Install AI dependencies:
pip install -e ".[ai]" -
Create
.envfile with API keys:cp .env.template .env # Edit .env to add your keys -
Configure API keys in
.env:For Claude (Anthropic):
ANTHROPIC_API_KEY=your_key_hereFor OpenAI:
OPENAI_API_KEY=your_key_hereOptional: Custom API endpoints (e.g., for z.ai, OpenRouter, or other proxies):
ANTHROPIC_BASE_URL=https://api.z.ai/api/anthropic OPENAI_BASE_URL=https://your-custom-endpoint.com/v1 -
Configure provider in
config/default.yaml:ai: provider: anthropic # or openai model: claude-3-5-sonnet-20241022
For resume generation with AI:
# Use --ai flag with generate command
resume-cli generate --ai --job-desc job-posting.txt
# AI will:
# 1. Extract key requirements from job description
# 2. Reorder bullets to emphasize relevant experience
# 3. Highlight matching skills
# 4. Keep all content truthful (no fake experience)For complete application packages (resume + cover letter):
# generate-package automatically uses AI - no --ai flag needed!
resume-cli generate-package --job-desc job-posting.txt --variant v1.1.0-backend
# This generates both AI-customized resume AND cover letter"anthropic package not installed"
# Install AI dependencies
pip install -e ".[ai]""ANTHROPIC_API_KEY not set"
- Make sure you created a
.envfile from.env.template - Verify the API key is set correctly in
.env python-dotenvloads environment variables from.envautomatically
"OPENAI_API_KEY not set"
- Same troubleshooting steps as ANTHROPIC_API_KEY above
API connection errors
- Check your network connection
- Verify API key is valid
- If using custom
BASE_URL, verify the endpoint is correct
"AI generation failed, falling back to template"
- This is expected behavior when AI API fails
- The system automatically falls back to fast template generation
- Check API key validity and network connection to use AI features
- Set
ai.fallback_to_template: falsein config to fail instead of falling back
"No such option: --ai" with generate-package
- The
generate-packagecommand does not have an--aiflag - AI customization is automatic when you provide
--job-desc - Simply run:
resume-cli generate-package --job-desc job-posting.txt - Use
resume-cli generate --ai --job-desc ...if you only want an AI-customized resume without cover letter
Edit config/default.yaml to customize:
output:
directory: output
naming_scheme: "resume-{variant}-{date}.{ext}"
date_format: "%Y-%m-%d"
generation:
default_variant: v1.0.0-base
default_format: md
max_bullets: 4
ai:
provider: anthropic
model: claude-3-5-sonnet-20241022
fallback_to_template: true
# Multi-generation with AI Judge
judge_enabled: true # Use AI judge to select best of N generations
num_generations: 3 # Number of versions to generate for judge evaluation
# Optional: Custom API base URLs (can also be set in .env)
anthropic_base_url: ""
openai_base_url: ""
tracking:
enabled: true
csv_path: tracking/resume_experiment.csv
cover_letter:
enabled: true
formats: [md, pdf]
smart_guesses: true
tone: professional
max_length: 400
github:
username: your_username
sync_months: 3
# Auto-projects feature for generate-package
max_projects: 3
linkedin:
# LinkedIn import/export settings
import_merge_mode: merge # Options: merge, overwrite
export_format: linkedin # Options: linkedin, plain
output_directory: output # Default directory for LinkedIn exportsPDF generation requires LaTeX tools:
sudo apt-get install texlive-fullsudo dnf install texlive-scheme-fullbrew install mactex# Ubuntu/Debian
sudo apt-get install pandoc texlive-xetex
# Fedora/RPM-based
sudo dnf install pandoc texlive-xetexresume-cli/
├── resume.yaml # Single source resume data (gitignored - personal data)
├── cli/ # CLI package
│ ├── main.py # Entry point
│ ├── commands/ # Command implementations
│ ├── generators/ # Template + AI engines
│ ├── integrations/ # Tracking, GitHub, LinkedIn, etc.
│ └── utils/ # YAML parser, schema, config
├── resume_pdf_lib/ # Shared PDF generation library
├── templates/ # Jinja2 templates
│ ├── resume_md.j2
│ ├── resume_tex.j2
│ └── cover_letter_md.j2
├── config/ # Configuration files
│ ├── default.yaml
│ └── variants.yaml
├── output/ # Generated resumes (gitignored)
├── tracking/ # Application tracking CSV
├── requirements.txt # Python dependencies
└── setup.py # Package installation
- Run
resume-cli init --from-existingto create from existing files - Or copy
resume.example.yamltoresume.yamland customize
pip install -e ".[ai]"- Create
.envfile from.env.template - Add your API key to
.env - The system automatically loads variables from
.env
- Install LaTeX tools (see PDF Generation section above)
- Ensure
pdflatexorpandocis in your PATH
- Install GitHub CLI: https://cli.github.com/
- Required for
resume-cli sync-githubcommand
pytest- Add variant to
resume.yamlundervariants: - Optionally add variant-specific summary to
professional_summary.variants: - Run
resume-cli generate -v v1.X.Y-variant
- Create Jinja2 template in
templates/ - Add format choice to
generatecommand incli/main.py - Update
TemplateGeneratorincli/generators/template.py
MIT License - See LICENSE file for details.
Completed Features:
- ✅ Core CLI with template-based generation (Jinja2)
- ✅ Multiple output formats (Markdown, LaTeX, PDF)
- ✅ AI-powered resume tailoring (Claude/OpenAI)
- ✅ Cover letter generation (interactive + non-interactive)
- ✅ Application tracking (CSV-based analytics)
- ✅ GitHub project sync and AI enhancement
- ✅ AI Judge for multi-generation quality selection
- ✅ REST API server for programmatic access
- ✅ Schema validation and configuration management
- ✅ 6 pre-configured resume variants
- ✅ LinkedIn folder-based data archive import
Quality & Testing
- Comprehensive test coverage (pytest for all modules)
- Integration tests for CLI commands
- Mock testing for AI API calls
- Performance benchmarking for large resume.yaml files
User Experience
- Better error messages and actionable guidance
- Progress indicators for long-running operations
- Resume diff/comparison between variants
- "What changed" log when updating resume.yaml
Template Enhancements
- Additional resume templates (modern, minimalist, academic)
- Cover letter templates with different tones
- User-provided custom template support
- Template preview mode
Documentation
- Interactive tutorials for each command
- Video walkthrough for quick onboarding
- Troubleshooting guide for common issues
ATS Optimization
- ATS score checker (parse-friendly format validation)
- Keyword density analysis
- Resume format recommendations for popular ATS systems
- Export to ATS-friendly formats (plain text, docx)
Job Board Integration
- Indeed/LinkedIn job posting parser
- Automated application logging (with manual approval)
- Job search aggregator integration
Advanced Analytics
- Visual dashboard for application metrics
- Response rate heatmaps by company size/location
- Variant performance A/B testing tools
- Export analytics to CSV/JSON for external analysis
Multi-Device Support
- Mobile-responsive web interface
- Desktop application (Electron/Tauri)
- Cross-platform sync via cloud storage
- Offline mode with local AI models
Interview Preparation
- AI-generated interview questions based on job description
- Mock interview mode with AI interviewer
- Company research aggregation (news, culture, recent wins)
- STAR method response templates
Networking & Career Growth
- Connection finder (find alumni/connections at target companies)
- Salary research and market data integration
- Offer comparison tool with negotiation suggestions
- Personal branding assistant (LinkedIn, portfolio suggestions)
Enterprise Features
- Team collaboration mode (shared resume reviews)
- Template marketplace for resume designs
- Recruiter dashboard for hiring teams
- API rate limiting and usage analytics
Advanced AI Features
- Multi-language resume generation
- Video resume generation support
- Portfolio project recommendations
- Skill gap analysis vs. job requirements
Platform Expansion
- Browser extension for auto-fill applications
- Mobile app for iOS/Android
- Plugin ecosystem for third-party integrations
- White-label offering for career coaches
Help us prioritize! If you'd like to see a feature, please:
- Check existing GitHub issues
- Create a new issue with the
enhancementlabel - Include use cases and why it matters to you
Most requested (community-driven):
- 📊 ATS optimization tools
- 🌐 Web UI
- 📱 Mobile companion app
- 🤝 Collaboration features
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Submit a pull request
For issues or questions:
- Run
resume-cli validateto check for errors - Check documentation in
docs/ - Review
tracking/for application history