Show HN: AI-powered job application framework built on Claude Code
An open-source AI framework that uses Claude Code to automate job applications: evaluating postings, tailoring CVs, writing cover letters, and preparing for interviews.
Uh oh!
There was an error while loading. Please reload this page.
Notifications You must be signed in to change notification settings
Fork 5.2k
Star 17.8k
BranchesTags
Open more actions menu
Folders and files
NameName
Last commit message
Last commit date
Latest commit
History
50 Commits
50 Commits
.agents/skills
.agents/skills
.claude
.claude
.github
.github
cover_letters
cover_letters
cv
cv
documents
documents
job_scraper
job_scraper
templates
templates
tests
tests
tools
tools
upskill
upskill
.gitignore
.gitignore
CLAUDE.md
CLAUDE.md
CONTRIBUTING.md
CONTRIBUTING.md
LICENSE
LICENSE
README.md
README.md
SETUP.md
SETUP.md
claude_animation.gif
claude_animation.gif
salary_lookup.py
salary_lookup.py
Repository files navigation
An AI-powered job application framework built on Claude Code. Fork it, fill in your profile, and let Claude evaluate job postings, tailor your CV, write cover letters, and prepare you for interviews.
Note: This is an independent open-source project and is not affiliated with, endorsed by, sponsored by, or maintained by Anthropic. Anthropic and Claude Code are referenced only to describe the toolchain this workflow uses.
Did this save you a Sunday of cover-letter writing? Consider a coffee.
Did it land you the job? Maybe two. ☕
What this is
A structured workflow that turns Claude Code into a full-stack job application assistant. The core workflow (self-profiling, fit evaluation, and the drafter-reviewer application pipeline) is language- and country-agnostic. The job portal search skills are built for the Danish market (Jobindex, Jobnet, Akademikernes Jobbank, etc.), but the pattern is designed to be swapped for your local job boards.
/setup /scrape /apply | | | v v v Fill in Search job Evaluate fit your profile portals Score & recommend | | | v v v Profile Present matches Draft CV + Cover Letter files ready with fit ratings (LaTeX, tailored) | | v v Pick a match Reviewer agent critiques -> /apply -> Revise -> Final output
The framework encodes career guidance best practices, including structured evaluation criteria, forward-looking cover letter framing, and optional salary benchmarking.
Prerequisites
Claude Code (CLI)
Python 3.10+
Bun (for Danish job search CLI tools)
LaTeX distribution with lualatex and xelatex: TeX Live, MacTeX, TinyTeX, or MiKTeX. The CV compiles with lualatex (pdflatex often fails on modern MiKTeX installs with fontawesome5 font-expansion errors); the cover letter compiles with xelatex because cover.cls requires fontspec. If using a minimal TeX install such as TinyTeX or BasicTeX, install the extra packages listed in SETUP.md.
Optional: pdftotext from poppler (macOS: brew install poppler, Debian/Ubuntu: apt install poppler-utils, Windows: choco install poppler) — used by /apply's ATS parseability check on the compiled CV. If missing, the check degrades gracefully to a visual keyword review.
Quick start
- Fork and clone
gh repo fork MadsLorentzen/ai-job-search --clone cd ai-job-search
- Install job search tools
PowerShell:
$tools = @("jobbank-search", "jobdanmark-search", "jobindex-search", "jobnet-search", "linkedin-search") foreach ($tool in $tools) { Set-Location ".agents/skills/$tool/cli" bun install Set-Location "..\..\..\.." }
Bash / zsh / Git Bash:
cd .agents/skills/jobbank-search/cli && bun install && cd ../../../.. cd .agents/skills/jobdanmark-search/cli && bun install && cd ../../../.. cd .agents/skills/jobindex-search/cli && bun install && cd ../../../.. cd .agents/skills/jobnet-search/cli && bun install && cd ../../../.. cd .agents/skills/linkedin-search/cli && bun install && cd ../../../..
For linkedin-search the install is optional: it has zero runtime dependencies and runs with plain bun; bun install only pulls TypeScript dev types.
- Set up your profile
claude
Then inside Claude Code:
/setup
/setup offers three paths: read your documents/ folder if you have one populated (CV PDF, LinkedIn export, diplomas, reference letters, past applications), import a single CV pasted in chat, or walk through an interview. It auto-detects what you have and asks. Documents-folder mode is idempotent and safe to re-run as you add more material; see documents/README.md for the layout.
- Search for jobs
/scrape
This searches multiple job portals for positions matching your profile, deduplicates results, and presents them sorted by fit. Pick a match to run /apply on it directly — or, when a scrape returns more jobs than you want to eyeball, run /rank to batch-score them all against the fit framework and get a ranked shortlist first.
- Apply to a job
/apply https://jobindex.dk/job/1234567
If the URL can't be fetched (some job portals block automated access), you can paste the job description directly instead:
/apply
This runs the full workflow: evaluate fit, draft CV + cover letter, review with a second agent, revise, and present the final output.
Other commands
/setup, /scrape, and /apply form the core workflow. Seven more commands extend it once your profile is in place:
/interview preps you for a scheduled interview on a tracked application. It builds a stage-specific prep pack from the application's archive (the exact posting, the CV and cover letter the interviewer actually read, feedback recorded from earlier rounds), researches the company and interviewers with a verify-before-use rule, maps likely questions to your STAR examples, and offers a mock interview following the roleplay protocol in 07-interview-prep.md. Gaps get honest bridge answers, never invented experience.
/outcome records what happened to an application - interview stages, offers, rejections, silence. It archives the submitted CV, cover letter, and posting text into documents/applications/_/, keeps outcome.md in the format /setup Path A parses, and updates the tracker. Once a few applications resolve, it points you back to /setup to calibrate the fit framework from what actually got interviews.
/rank bridges /scrape and /apply: it batch-scores all newly scraped postings against the fit framework (parallel agents fetch each posting and score the five evaluation dimensions) and returns a ranked shortlist with honest per-job strengths and gaps. Deal-breakers veto, deadlines get urgency flags, dead postings get marked expired. Pick a number and it hands off to the full /apply workflow.
/expand enriches your profile by scanning public sources you've already linked in it (GitHub repos, portfolio site, Kaggle, Google Scholar) and looking up syllabi for named courses and certifications. Discovered competencies are added to your profile with a source tag. Useful right after /setup to surface skills that documents alone don't make explicit.
/upskill analyzes the gap between your profile and your tracked job postings (or a single posting via /upskill ). Produces a prioritized heatmap of skill gaps and a learning plan with web-searched study resources and time estimates. Useful for career planning between applications.
/add-template registers your own LaTeX CV or cover letter template in place of the stock ones. It captures the template's instructions (compile engine, fonts, style rules, page limit), runs a mandatory test compile, and wires the template into /apply. See LaTeX templates below.
/add-portal generates a job-portal search skill for a job board in your market. It investigates the portal (search URL pattern, result structure, access rules), scaffolds the CLI skill from the same structure as the shipped ones, and test-runs a live query before registering. See Job search tools below.
/reset is also available, see Starting over below.
File structure
ai-job-search/ ├── CLAUDE.md # Main candidate profile + workflow rules ├── .claude/ │ ├── commands/ │ │ ├── apply.md # /apply workflow (drafter-reviewer) │ │ ├── setup.md # /setup onboarding (documents folder, CV import, or interview) │ │ ├── expand.md # /expand competency enrichment from documents and online presence │ │ ├── add-template.md # /add-template register custom LaTeX templates │ │ ├── add-portal.md # /add-portal generate a job-portal search skill for your market │ │ ├── rank.md # /rank triage scraped jobs into a ranked shortlist │ │ ├── outcome.md # /outcome record application results, archive materials │ │ ├── interview.md # /interview stage-specific prep pack + mock interview │ │ └── reset.md # /reset wipe profile data or documents folder │ ├── skills/ │ │ ├── job-application-assistant/ # Core application skill │ │ │ ├── SKILL.md # Skill definition │ │ │ ├── 01-candidate-profile.md # Your education, experience, skills │ │ │ ├── 02-behavioral-profile.md# PI/DISC/personality assessment │ │ │ ├── 03-writing-style.md # Tone, structure, do's and don'ts │ │ │ ├── 04-job-evaluation.md # Scoring framework for job fit │ │ │ ├── 05-cv-templates.md # LaTeX CV structure + tailoring rules │ │ │ ├── 06-cover-letter-templates.md # LaTeX cover letter templates │ │ │ └── 07-interview-prep.md # STAR examples + interview framework │ │ ├── job-scraper/ # Job search orchestration │ │ └── upskill/ # /upskill skill gap analysis and learning plan │ └── settings.json # Claude Code permissions (shared, scoped) ├── .agents/skills/ # Job portal CLI tools │ ├── jobbank-search/ # Akademikernes Jobbank (Denmark) │ ├── jobdanmark-search/ # Jobdanmark.dk (Denmark) │ ├── jobindex-search/ # Jobindex.dk (Denmark) │ ├── jobnet-search/ # Jobnet.dk (Denmark, government portal) │ └── linkedin-search/ # LinkedIn public job listings (country-agnostic) ├── cv/ │ └── main_example.tex # moderncv LaTeX template ├── cover_letters/ │ ├── cover.cls # Custom cover letter LaTeX class │ ├── cover_example.tex # Example cover letter (structural reference + CI smoke test) │ └── OpenFonts/ # Lato + Raleway fonts ├── templates/ # Custom templates registered via /add-template │ └── README.md # Folder layout instructions ├── documents/ # Career source materials for /setup Path A and /expand │ ├── README.md # Folder layout instructions │ ├── cv/ # Master CV (PDF or .tex) │ ├── linkedin/ # LinkedIn profile export (PDF) │ ├── diplomas/ # Degree certificates and transcripts │ ├── references/ # Reference letters │ └── applications/ # Past application records (_/) ├── .github/workflows/ci.yml # CI: LaTeX smoke compiles, skill lint, CLI typechecks ├── salary_lookup.py # Salary benchmarking tool (BYO data) ├── tools/ │ ├── convert_salary_excel.py # Convert salary Excel to JSON │ ├── lint_skills.py # CI lint for skills, commands, settings.json │ ├── security_guards.py # CI guards: permission allowlist, gitignore rules, manifests │ └── README_SALARY_TOOL.md # Salary tool setup instructions ├── job_scraper/ # Scraper state (seen jobs, results) ├── upskill/ # /upskill report output (markdown reports per run) ├── job_search_tracker.csv # Application tracking spreadsheet └── SETUP.md # Detailed setup guide
How /apply works
The /apply command runs a drafter-reviewer workflow with mandatory PDF compilation:
Parse the job posting (URL or text)
Evaluate fit against your profile (skills, experience, culture, location, career alignment)
Draft a tailored CV and cover letter in LaTeX
Spawn a reviewer agent that researches the company and critiques the drafts
Revise based on the reviewer's feedback
Compile and inspect both PDFs: lualatex for the CV, xelatex for the cover letter. Claude reads the rendered pages and iterates on the LaTeX until the CV is exactly 2 pages with no orphaned entry titles, and the cover letter is exactly 1 page with the signature visible and fonts consistent.
ATS-check the CV: extract the PDF's text layer (pdftotext, optional dependency) and verify it the way an ATS parser sees it — contact details present as literal text, no garbled glyphs, sane reading order — then score the posting's keyword coverage agai
[truncated for AI cost control]