{"id":47617864,"url":"https://github.com/bkuberek/mkcv","last_synced_at":"2026-04-01T21:44:05.345Z","repository":{"id":345820341,"uuid":"1185816255","full_name":"bkuberek/mkcv","owner":"bkuberek","description":"AI-powered CLI that generates ATS-compliant PDF resumes and cover letters tailored to job descriptions using a 5-stage LLM pipeline","archived":false,"fork":false,"pushed_at":"2026-03-20T23:18:41.000Z","size":1469,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-21T11:41:40.593Z","etag":null,"topics":["ai","anthropic","ats","career","cli","cv","job-search","llm","openai","pdf","pydantic","python","resume","typst"],"latest_commit_sha":null,"homepage":"https://github.com/bkuberek/mkcv#readme","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bkuberek.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-19T01:08:41.000Z","updated_at":"2026-03-20T23:18:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bkuberek/mkcv","commit_stats":null,"previous_names":["bkuberek/mkcv"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/bkuberek/mkcv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkuberek%2Fmkcv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkuberek%2Fmkcv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkuberek%2Fmkcv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkuberek%2Fmkcv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bkuberek","download_url":"https://codeload.github.com/bkuberek/mkcv/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkuberek%2Fmkcv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292498,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","anthropic","ats","career","cli","cv","job-search","llm","openai","pdf","pydantic","python","resume","typst"],"created_at":"2026-04-01T21:44:02.808Z","updated_at":"2026-04-01T21:44:05.338Z","avatar_url":"https://github.com/bkuberek.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mkcv\n\n[![CI](https://github.com/bkuberek/mkcv/actions/workflows/ci.yml/badge.svg)](https://github.com/bkuberek/mkcv/actions/workflows/ci.yml)\n[![Version](https://img.shields.io/github/v/tag/bkuberek/mkcv?label=version\u0026sort=semver)](https://github.com/bkuberek/mkcv/tags)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n[![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)\n\nAI-powered CLI tool that generates ATS-compliant PDF resumes tailored to specific job applications.\n\n## What is mkcv?\n\nmkcv 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.\n\n## Features\n\n- **5-stage AI pipeline** -- analyze JD, select experience, tailor content, structure YAML, review for ATS compliance\n- **Multi-provider AI** -- Anthropic (Claude), OpenAI (GPT), Ollama (local/free), OpenRouter (200+ models)\n- **Interactive mode** -- pause and review after each pipeline stage\n- **Cover letters** -- generate tailored cover letters alongside your resume\n- **Multiple themes** -- choose from built-in RenderCV themes (sb2nov, classic, moderncv, engineeringresumes)\n- **PDF + more** -- render to PDF, PNG, Markdown, or HTML via Typst\n- **Workspace model** -- organize knowledge base, config, and applications per company/role\n- **Smart defaults** -- per-stage model selection with budget and premium profiles\n- **Configurable** -- 5-layer config resolution (defaults, global, workspace, env vars, CLI flags)\n\n## Quick Start\n\n```bash\n# Install\npip install git+https://github.com/bkuberek/mkcv.git\n\n# Set up an API key (at least one provider)\nexport ANTHROPIC_API_KEY=sk-ant-...\n\n# Create a workspace\nmkcv init ~/Documents/cv\n\n# Edit your knowledge base with your career history\n$EDITOR ~/Documents/cv/knowledge-base/career.md\n\n# Generate a resume tailored to a job description\ncd ~/Documents/cv\nmkcv generate --jd https://example.com/job-posting.txt \\\n  --company Acme --position \"Senior Engineer\"\n```\n\n## Installation\n\nRequires **Python 3.12+**.\n\n### pip\n\n```bash\npip install git+https://github.com/bkuberek/mkcv.git\n```\n\n### pipx (isolated environment)\n\n```bash\npipx install git+https://github.com/bkuberek/mkcv.git\n```\n\n### uv\n\n```bash\nuv tool install git+https://github.com/bkuberek/mkcv.git\n```\n\n### From source\n\n```bash\ngit clone https://github.com/bkuberek/mkcv.git\ncd mkcv\nuv sync\nuv run mkcv --help\n```\n\nVerify the installation:\n\n```bash\nmkcv --version\nmkcv --help\n```\n\n## Usage\n\n### Set Up API Credentials\n\nmkcv needs at least one AI provider configured:\n\n```bash\n# Anthropic (default provider -- recommended)\nexport ANTHROPIC_API_KEY=sk-ant-...\n\n# OpenAI\nexport OPENAI_API_KEY=sk-...\n\n# OpenRouter (access 200+ models with one key)\nexport OPENROUTER_API_KEY=sk-or-...\n\n# Ollama (free, local -- no key needed, just have Ollama running)\n```\n\nAdd these to your shell profile (`~/.zshrc`, `~/.bashrc`) so they persist.\n\n### Create a Workspace\n\n```bash\nmkcv init ~/Documents/cv\n```\n\nThis creates an organized directory with your knowledge base, config, and a place for generated applications:\n\n```\n~/Documents/cv/\n├── mkcv.toml                    # Workspace configuration\n├── knowledge-base/\n│   ├── career.md                # Your career history (fill this in!)\n│   └── voice.md                 # Writing tone/style guidelines\n├── applications/                # Generated resumes go here\n└── templates/                   # Custom prompt overrides\n```\n\n### Generate a Resume\n\n```bash\n# Basic -- from a file\nmkcv generate --jd job_description.txt --kb career.md\n\n# From a URL\nmkcv generate --jd https://example.com/posting.txt --kb career.md\n\n# From clipboard (macOS)\npbpaste | mkcv generate --jd - --kb career.md\n\n# Workspace mode (KB from config, organized by company)\ncd ~/Documents/cv\nmkcv generate --jd job.txt --company DeepL --position \"Senior Engineer\"\n\n# Interactive mode -- review each stage before proceeding\nmkcv generate --jd job.txt --kb career.md --interactive\n\n# Budget mode -- use free local Ollama models\nmkcv generate --jd job.txt --kb career.md --profile budget\n\n# Resume from a specific stage (reuse previous artifacts)\nmkcv generate --jd job.txt --from-stage 3\n\n# Skip PDF rendering\nmkcv generate --jd job.txt --kb career.md --no-render\n```\n\n**Pipeline stages:**\n1. **Analyze JD** -- extract requirements, keywords, and priorities\n2. **Select Experience** -- choose the most relevant items from your knowledge base\n3. **Tailor Content** -- rewrite bullets with XYZ formula, weave in keywords\n4. **Structure YAML** -- produce RenderCV-compatible YAML\n5. **Review** -- ATS compliance check with scoring and suggestions\n\n### Generate a Cover Letter\n\n```bash\n# From a job description and resume\nmkcv cover-letter --jd job.txt --company Acme --position \"Senior Engineer\"\n\n# Using an existing application directory\nmkcv cover-letter --jd job.txt --app-dir applications/acme/senior-engineer/2025-01-15\n```\n\n### Render to PDF\n\n```bash\nmkcv render resume.yaml\nmkcv render resume.yaml --theme classic\nmkcv render resume.yaml --format pdf,png,md,html\nmkcv render resume.yaml --open    # Open PDF after rendering\n```\n\n### Validate Quality\n\n```bash\n# Validate a resume YAML (LLM-powered ATS check)\nmkcv validate resume.yaml\n\n# Validate against a specific JD for keyword coverage\nmkcv validate resume.yaml --jd job.txt\n\n# Validate knowledge base structure (no LLM needed)\nmkcv validate --kb knowledge-base/career.md\n```\n\n### Browse Themes\n\n```bash\nmkcv themes                      # List all available themes\nmkcv themes --preview sb2nov     # Detailed theme preview\n```\n\n### Workspace Status\n\n```bash\nmkcv status                      # Overview of workspace and applications\n```\n\n## Configuration\n\nConfiguration is resolved in 5 layers (later overrides earlier):\n\n1. **Built-in defaults** -- bundled with the package\n2. **Global user config** -- `~/.config/mkcv/settings.toml`\n3. **Workspace config** -- `mkcv.toml` in workspace root\n4. **Environment variables** -- `MKCV_` prefix\n5. **CLI flags** -- applied at runtime\n\nSee [`examples/mkcv.toml`](examples/mkcv.toml) for a fully-commented configuration reference.\n\n### Provider Profiles\n\nUse `--profile` to quickly switch provider configurations:\n\n| Profile | Provider | Best For |\n|---------|----------|----------|\n| `premium` (default) | Anthropic Claude | Highest quality output |\n| `budget` | Ollama (local) | Free, no API key needed |\n\n### Per-Stage Configuration\n\nConfigure different providers and models for each pipeline stage in `mkcv.toml`:\n\n```toml\n[pipeline.stages.analyze]\nprovider = \"anthropic\"\nmodel = \"claude-sonnet-4-20250514\"\ntemperature = 0.2\n\n[pipeline.stages.structure]\nprovider = \"openai\"\nmodel = \"gpt-4o\"\ntemperature = 0.1\n```\n\n### Environment Variables\n\nUse the `MKCV_` prefix with double underscores for nested keys:\n\n```bash\nexport MKCV_RENDERING__THEME=classic\nexport MKCV_PIPELINE__STAGES__ANALYZE__MODEL=claude-sonnet-4-20250514\n```\n\n## LLM Providers\n\n| Provider | Setup | Notes |\n|----------|-------|-------|\n| **Anthropic** | `export ANTHROPIC_API_KEY=sk-ant-...` | Default provider, Claude models |\n| **OpenAI** | `export OPENAI_API_KEY=sk-...` | GPT models |\n| **Ollama** | [Install Ollama](https://ollama.ai), run `ollama serve` | Free, local, no API key |\n| **OpenRouter** | `export OPENROUTER_API_KEY=sk-or-...` | 200+ models via single API key |\n\n[OpenRouter](https://openrouter.ai) 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`).\n\n## Contributing\n\nContributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on how to get started.\n\n## License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\n\n## Development\n\nFor detailed development setup, architecture documentation, and coding conventions, see [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md).\n\n## Built with AI\n\nThis project was built with the assistance of AI using [Spec-Driven Development (SDD)](https://github.com/Gentleman-Programming/agent-teams-lite), a structured workflow for planning and implementing features through proposal, spec, design, and task phases. Cross-session memory is powered by [Engram](https://github.com/Gentleman-Programming/engram), and code quality is enforced by [Clean Code skills](https://skills.sh/sickn33/antigravity-awesome-skills/clean-code).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbkuberek%2Fmkcv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbkuberek%2Fmkcv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbkuberek%2Fmkcv/lists"}