The job search that runs on your machine is the pitch for MadsLorentzen/ai-job-search — roughly 35.8k GitHub stars, 12.2k forks, MIT license. Fork it (or clone into a private repo), fill a structured profile, and Claude Code evaluates postings, tailors LaTeX CVs and cover letters, spawns a reviewer agent, compiles PDFs, and ATS-checks the text layer before you submit.
It is not Anthropic-official. It is also not a silver bullet: creator Mads Lorentzen reported 69 applications → 20 first interviews → one offer in his own 2025–2026 search — proof the workflow can work, not a promise it will for you in every market.
TL;DR — what job seekers ask first
| Question | Direct answer |
|---|---|
| Repo? | github.com/MadsLorentzen/ai-job-search |
| Core flow? | /setup → /scrape → /rank (optional) → /apply → /outcome |
| What's special? | Drafter-reviewer split + mandatory PDF compile loop + ATS keyword pass |
| Private data? | Use private clone, not public fork — /setup writes PII to tracked files |
| Denmark only? | Portal CLIs are Danish; linkedin-search + /add-portal elsewhere |
| Cost? | Framework free (MIT); you pay Claude Code / API usage |
| Honest ceiling? | Better materials ≠ offers in a frozen or referral-heavy market |

Does it actually work?
Lorentzen — a geophysicist whose role was cut in late 2025 — built this to run his search. He was upfront with employers about using it; he reports it often sparked technical conversation rather than counting against him. By June 2026 he started as an AI engineer.
That story matters for expectations, not marketing:
- Volume still required — 69 tailored applications is real work.
- Conversion is human — interviews depend on timing, team fit, and luck.
- Automation ≠ networking — no slash command replaces warm intros.
- Market regime matters — AI-engineer hiring in 2026 ≠ every sector or geography.
Use ai-job-search to compress drafting and QA time, not to skip judgment on whether a role is worth pursuing.
Architecture: local files, agent pipeline
/setup /scrape /apply <url>
| | |
v v v
Profile files Search portals Evaluate fit (5 dimensions)
ready Dedupe + sort Draft CV + cover letter (LaTeX)
by fit Reviewer agent critiques
| |
v v
/rank (optional) Compile PDFs → inspect layout
batch shortlist ATS text extract → keyword score
Present checklist → you submit
The pattern mirrors loop engineering: explicit phases, handoffs, and a second agent with fresh context — applied to career outcomes, not pull requests.
Quick start: private clone → portal CLIs → /setup
1. Clone privately (recommended for job seekers)
Public forks expose profile data. From SETUP.md section 8:
git clone https://github.com/MadsLorentzen/ai-job-search.git my-job-search
cd my-job-search
git remote rename origin upstream
# Create empty private repo on GitHub, then:
git remote add origin git@github.com:YOU/my-job-search.git
git push -u origin master
Fork publicly only when contributing upstream.
2. Install job portal CLI tools (Bun)
for tool in jobbank-search jobdanmark-search jobindex-search jobnet-search linkedin-search freehire-search; do
(cd .agents/skills/$tool/cli && bun install)
done
linkedin-search and freehire-search run with plain bun — zero runtime deps; install pulls TypeScript dev types only.
3. Profile setup inside Claude Code
claude
/setup
Three paths: read populated documents/ (CV PDF, LinkedIn export, diplomas), paste a single CV, or interview walkthrough. Re-run safely as you add material — see documents/README.md.
4. Search and apply
/scrape
/rank
/apply https://jobindex.dk/job/1234567
Blocked URL? Paste the full description:
/apply <paste the full job description here>
Postings are untrusted input — the workflow ignores embedded instructions and does not follow links from posting bodies. Skim fetched content before send; see SECURITY.md.
Prerequisites
| Dependency | Why |
|---|---|
| Claude Code CLI | Slash commands + reviewer subagents |
| Python 3.10+ | Salary tooling and scripts |
| Bun | TypeScript portal CLIs |
LaTeX (lualatex, xelatex) | CV + cover letter PDF compile |
| pdftotext (optional) | ATS text-layer extraction — brew install poppler on macOS |
CV uses moderncv banking style. Cover letters use custom cover.cls with Lato/Raleway fonts under cover_letters/OpenFonts/.
Command reference beyond the core trio
| Command | Purpose |
|---|---|
/setup | Onboard profile — documents, CV paste, or interview |
/scrape | Multi-portal search, dedupe, fit-sorted results |
/rank | Parallel batch scoring; deal-breaker vetoes; hands off to /apply |
/apply | Drafter-reviewer + PDF + ATS pipeline |
/interview | Stage-specific prep from archived materials + mock interview |
/outcome | Record stages; archive CV/cover/posting; calibrate fit over time |
/expand | Enrich profile from GitHub, portfolio, Kaggle, syllabi |
/upskill | Skill-gap heatmap vs tracked postings |
/gmail-sync | Propose status updates from Gmail (batch approval) |
/notion-sync | Read-only pipeline view in Notion via MCP |
/add-template | Register custom LaTeX/Typst templates with test compile |
/add-portal | Scaffold a job-board CLI for your market |
/reset | Wipe profile or documents (type RESET to confirm) |
/outcome followup surfaces quiet applications and drafts channel-appropriate follow-ups — drafts only, never sends.
What makes /apply different
Drafter-reviewer separation
The drafter writes; a second Claude agent researches the company and critiques. Claims stay tied to your profile — no fabricated skills.
PDF verification loop
/apply compiles and visually inspects PDFs:
- CV: exactly 2 pages, no orphaned entry titles
- Cover letter: exactly 1 page, signature visible
- Fixes via
\needspace,\enlargethispage, font-matching list wrappers
ATS verification on the text layer
pdftotext extracts embedded text — contact fields as literal strings, sane reading order, keyword coverage without stuffing gaps your profile does not support.
Relevance-weighted CV cutting
Overflow lines are scored by posting relevance, uniqueness, and cover-letter dependency — not naive "delete oldest job first."
Job portals: Denmark shipped, everywhere extensible
| Skill | Portal / scope |
|---|---|
jobindex-search | Jobindex.dk |
jobnet-search | Jobnet.dk (government) |
jobbank-search | Akademikernes Jobbank |
jobdanmark-search | Jobdanmark.dk |
linkedin-search | Guest endpoints — -l "Berlin, Germany", -l "Remote" (personal use only) |
freehire-search | freehire.me REST API — tech roles, multi-market |
Run /add-portal with a board URL to scaffold a matching CLI. Auth-walled portals are declined.
Profile depth = output quality
Thin profile → generic applications. The README is explicit:
- Describe projects and measurable outcomes per role, not titles alone
- Put skills in context ("built churn ML pipelines in Python/scikit-learn" beats "Python, ML")
- Use
/expandafter/setupto surface competencies from public repos - Re-run
/setup --section searchwhen targeting shifts
Honest limits and hiring-market caveats
| Limit | Reality check |
|---|---|
| Not affiliated with Anthropic | You bring your own Claude Code subscription and accept model behavior |
| Token cost | /apply, /rank, and reviewer runs add up — budget like any agent workflow |
| LaTeX fragility | Wrong engine breaks moderncv/fontawesome5; follow README engine rules |
| Portal blocking | Some URLs need pasted descriptions; robots and rate limits vary |
| LinkedIn ToS | Automated search is against terms at volume — keep personal, low frequency |
| Instruction-level security | Not a sandbox; review materials before submit |
| Market headwinds | Layoffs, visa screens, and "posted but frozen" roles still waste cycles |
| No crypto affiliation | README warns scams claiming token sponsorship — only Ko-fi + GitHub are official |
Scam note: README states there is no affiliated cryptocurrency or paid sponsorship program.
This is a personal workflow framework, not HR-compliant hiring software. Accuracy and ethics remain yours — relevant if you touch AI and employment law themes.
Staying current with upstream
Track tagged releases in CHANGELOG.md rather than blind merges:
python3 tools/check_upstream_updates.py
python3 tools/upstream_triage.py
Full walkthrough in SETUP.md section 8.
Keep a factual profile separate from application wording
Create a source record for claims the framework may use: role dates, responsibilities, projects, qualifications, and outcomes you can substantiate. The application can emphasize different parts of that record for different jobs. It should not convert a job requirement into an experience claim merely because matching the words improves a score.
For example, a posting may request Kubernetes experience while your project used ordinary Docker containers. Explain the relevant container experience accurately and leave the Kubernetes gap visible. A convincing false match can create a difficult interview and damage trust; a documented gap can become a useful learning plan.
Have the reviewer compare the final CV against the source record, not only the posting. The framework repository provides the workflow; you remain the authority on your actual history. Mark uncertain achievements for your own confirmation before approving the PDF.
Review one complete application before scaling
Run the full process for one role you understand well. Inspect the fit assessment, chosen experience, cover-letter claims, rendered PDF, and extracted text. A clean-looking PDF can still have a confusing reading order or missing text in extraction. Check both artifacts rather than substituting one for the other.
Read the cover letter aloud. Does it explain a specific connection to the job, or merely repeat the employer's wording? Remove statements you cannot defend in an interview. The quality gate should improve the substance of the application as well as its layout.
Track outcomes with useful context
Record when you applied, which documents you sent, and the stage reached. Preserve the posting because it may disappear or change. If you revise the CV later, retain the submitted version so interview preparation reflects what the employer actually received.
Avoid treating a fit score as a probability of an offer. Hiring outcomes depend on factors the framework may not observe. Use scores to organize review, then compare them with outcomes over time to see where your own rubric misses important requirements. A smaller set of truthful applications with complete records is easier to improve than a large opaque submission queue.
The bottom line
ai-job-search is the most complete local, fork-and-own Claude Code career framework in August 2026: structured commands, verifier agents, LaTeX discipline, and outcome tracking — closer to a useful agent build than a one-shot resume prompt.
Clone github.com/MadsLorentzen/ai-job-search into a private repo, invest in /setup, treat /apply as a pipeline you iterate, and use /outcome so fit scoring learns from real results. Expect better PDFs and faster tailoring — not automatic offers.
Related on explainx.ai
- Build Useful AI Agents with Claude Code — smaller job shortlist agent pattern
- Claude Code Commands: Complete Reference — slash commands and custom skills
- What Are Agent Skills? — SKILL.md packages ai-job-search extends
- Loop Engineering with Claude Code — phased agent workflows
- Top 10 AI Agent Skills Directories — skills ecosystem context
- npx skills Install Guide — installing portal skills
- Forward Deployed Roles and the Future of Work — targeting non-obvious paths
- Sam Altman and Dario Amodei on AI Jobs — macro context for expectations
Source: MadsLorentzen/ai-job-search on GitHub (MIT; README and SETUP.md as of August 26, 2026).
Star counts, command set, and creator funnel stats reflect the public repository at publication time. Verify README before installing portal CLIs or submitting live applications.
