AI-powered CLI tool that generates ATS-compliant PDF resumes tailored to specific job applications.
mkcv takes your career knowledge base and a job description, then produces a polished, keyword-optimized resume through a 5-stage AI pipeline. Every resume is tailored to the specific role -- the AI analyzes requirements, selects the most relevant experience, rewrites bullets using the XYZ impact formula, and optimizes for applicant tracking systems.
- 5-stage AI pipeline -- analyze JD, select experience, tailor content, structure YAML, review for ATS compliance
- Multi-provider AI -- Anthropic (Claude), OpenAI (GPT), Ollama (local/free), OpenRouter (200+ models)
- Interactive mode -- pause and review after each pipeline stage
- Cover letters -- generate tailored cover letters alongside your resume
- Multiple themes -- choose from built-in RenderCV themes (sb2nov, classic, moderncv, engineeringresumes)
- PDF + more -- render to PDF, PNG, Markdown, or HTML via Typst
- Workspace model -- organize knowledge base, config, and applications per company/role
- Smart defaults -- per-stage model selection with budget and premium profiles
- Configurable -- 5-layer config resolution (defaults, global, workspace, env vars, CLI flags)
# Install
pip install git+https://github.com/bkuberek/mkcv.git
# Set up an API key (at least one provider)
export ANTHROPIC_API_KEY=sk-ant-...
# Create a workspace
mkcv init ~/Documents/cv
# Edit your knowledge base with your career history
$EDITOR ~/Documents/cv/knowledge-base/career.md
# Generate a resume tailored to a job description
cd ~/Documents/cv
mkcv generate --jd https://example.com/job-posting.txt \
--company Acme --position "Senior Engineer"Requires Python 3.12+.
pip install git+https://github.com/bkuberek/mkcv.gitpipx install git+https://github.com/bkuberek/mkcv.gituv tool install git+https://github.com/bkuberek/mkcv.gitgit clone https://github.com/bkuberek/mkcv.git
cd mkcv
uv sync
uv run mkcv --helpVerify the installation:
mkcv --version
mkcv --helpmkcv needs at least one AI provider configured:
# Anthropic (default provider -- recommended)
export ANTHROPIC_API_KEY=sk-ant-...
# OpenAI
export OPENAI_API_KEY=sk-...
# OpenRouter (access 200+ models with one key)
export OPENROUTER_API_KEY=sk-or-...
# Ollama (free, local -- no key needed, just have Ollama running)Add these to your shell profile (~/.zshrc, ~/.bashrc) so they persist.
mkcv init ~/Documents/cvThis creates an organized directory with your knowledge base, config, and a place for generated applications:
~/Documents/cv/
├── mkcv.toml # Workspace configuration
├── knowledge-base/
│ ├── career.md # Your career history (fill this in!)
│ └── voice.md # Writing tone/style guidelines
├── applications/ # Generated resumes go here
└── templates/ # Custom prompt overrides
# Basic -- from a file
mkcv generate --jd job_description.txt --kb career.md
# From a URL
mkcv generate --jd https://example.com/posting.txt --kb career.md
# From clipboard (macOS)
pbpaste | mkcv generate --jd - --kb career.md
# Workspace mode (KB from config, organized by company)
cd ~/Documents/cv
mkcv generate --jd job.txt --company DeepL --position "Senior Engineer"
# Interactive mode -- review each stage before proceeding
mkcv generate --jd job.txt --kb career.md --interactive
# Budget mode -- use free local Ollama models
mkcv generate --jd job.txt --kb career.md --profile budget
# Resume from a specific stage (reuse previous artifacts)
mkcv generate --jd job.txt --from-stage 3
# Skip PDF rendering
mkcv generate --jd job.txt --kb career.md --no-renderPipeline stages:
- Analyze JD -- extract requirements, keywords, and priorities
- Select Experience -- choose the most relevant items from your knowledge base
- Tailor Content -- rewrite bullets with XYZ formula, weave in keywords
- Structure YAML -- produce RenderCV-compatible YAML
- Review -- ATS compliance check with scoring and suggestions
# From a job description and resume
mkcv cover-letter --jd job.txt --company Acme --position "Senior Engineer"
# Using an existing application directory
mkcv cover-letter --jd job.txt --app-dir applications/acme/senior-engineer/2025-01-15mkcv render resume.yaml
mkcv render resume.yaml --theme classic
mkcv render resume.yaml --format pdf,png,md,html
mkcv render resume.yaml --open # Open PDF after rendering# Validate a resume YAML (LLM-powered ATS check)
mkcv validate resume.yaml
# Validate against a specific JD for keyword coverage
mkcv validate resume.yaml --jd job.txt
# Validate knowledge base structure (no LLM needed)
mkcv validate --kb knowledge-base/career.mdmkcv themes # List all available themes
mkcv themes --preview sb2nov # Detailed theme previewmkcv status # Overview of workspace and applicationsConfiguration is resolved in 5 layers (later overrides earlier):
- Built-in defaults -- bundled with the package
- Global user config --
~/.config/mkcv/settings.toml - Workspace config --
mkcv.tomlin workspace root - Environment variables --
MKCV_prefix - CLI flags -- applied at runtime
See examples/mkcv.toml for a fully-commented configuration reference.
Use --profile to quickly switch provider configurations:
| Profile | Provider | Best For |
|---|---|---|
premium (default) |
Anthropic Claude | Highest quality output |
budget |
Ollama (local) | Free, no API key needed |
Configure different providers and models for each pipeline stage in mkcv.toml:
[pipeline.stages.analyze]
provider = "anthropic"
model = "claude-sonnet-4-20250514"
temperature = 0.2
[pipeline.stages.structure]
provider = "openai"
model = "gpt-4o"
temperature = 0.1Use the MKCV_ prefix with double underscores for nested keys:
export MKCV_RENDERING__THEME=classic
export MKCV_PIPELINE__STAGES__ANALYZE__MODEL=claude-sonnet-4-20250514| Provider | Setup | Notes |
|---|---|---|
| Anthropic | export ANTHROPIC_API_KEY=sk-ant-... |
Default provider, Claude models |
| OpenAI | export OPENAI_API_KEY=sk-... |
GPT models |
| Ollama | Install Ollama, run ollama serve |
Free, local, no API key |
| OpenRouter | export OPENROUTER_API_KEY=sk-or-... |
200+ models via single API key |
OpenRouter is a good choice if you want access to Claude, GPT, Gemini, DeepSeek, and more through a single API key. Set provider = "openrouter" in your config and use OpenRouter model identifiers (e.g., anthropic/claude-sonnet-4).
Contributions are welcome! Please see CONTRIBUTING.md for guidelines on how to get started.
This project is licensed under the MIT License. See the LICENSE file for details.
For detailed development setup, architecture documentation, and coding conventions, see docs/DEVELOPMENT.md.
This project was built with the assistance of AI using Spec-Driven Development (SDD), a structured workflow for planning and implementing features through proposal, spec, design, and task phases. Cross-session memory is powered by Engram, and code quality is enforced by Clean Code skills.