ai-job-search README

The project's README from github.com/MadsLorentzen/ai-job-search. As one markdown file: README.md.

Pip, the courier bird

AI Job Search

The job search that runs on your machine.

MadsLorentzen%2Fai-job-search | Trendshift

CI

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.

This project has no affiliated cryptocurrency, token, or paid sponsorship program. Anything claiming otherwise is unauthorized and should be treated as a scam. The only ways to support the project are the Ko-fi link below and contributing on GitHub.

Does it actually work?

I'm a geophysicist by training. When my position was cut in late 2025, I built this framework to run my own job search - the same /scrape, /apply, and /interview workflow in this repo, used weekly, on my own career. I was upfront about it with every employer I spoke to, and instead of counting against me, it usually sparked a genuine technical conversation.

Sixty-nine tailored applications, twenty first interviews, and one signed contract later, I started as an AI engineer in June 2026. People kept asking whether this actually works. It got me hired. Now it's yours.

The longer version, including the full application funnel, is on LinkedIn.

Did this save you a Sunday of cover-letter writing? Consider a coffee.
Did it land you the job? Maybe two.
☕

Buy me a coffee at ko-fi.com

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 <url>
  |                |                     |
  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

Quick start

🎥 Prefer to see it in action first? The Next New Thing did a hands-on walkthrough of how the workflow is actually used, from setup to a finished application (recorded August 2026 - commands may have evolved since).

1. Fork and clone

gh repo fork MadsLorentzen/ai-job-search --clone
cd ai-job-search

[!IMPORTANT] A fork of this repo is always public — GitHub does not allow private forks of public repositories — and /setup (step 3 below) writes your personal data (name, contact details, employment history, salary expectations) into tracked files. If this copy is for your own job search rather than for contributing changes back, use a private repository with this repo as upstream instead — the two-minute recipe is in SETUP.md section 8, and every update workflow works identically. Fork only to contribute.

2. Install job search tools

PowerShell:

$tools = @("jobbank-search", "jobdanmark-search", "jobindex-search", "jobnet-search", "linkedin-search", "freehire-search")
foreach ($tool in $tools) {
  Push-Location ".agents/skills/$tool/cli"
  bun install
  Pop-Location
}

Bash / zsh / Git Bash:

for tool in jobbank-search jobdanmark-search jobindex-search jobnet-search linkedin-search freehire-search; do
  (cd .agents/skills/$tool/cli && bun install)
done

For linkedin-search and freehire-search the install is optional: both have zero runtime dependencies and run with plain bun; bun install only pulls TypeScript dev types.

3. 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.

4. 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.

5. 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 <paste the full job description here>

This runs the full workflow: evaluate fit, draft CV + cover letter, review with a second agent, revise, and present the final output.

Postings are treated as untrusted input (the workflow follows no instructions embedded in them and fetches no links from their body), but agentic defenses are instruction-level, not a sandbox - on an unfamiliar job board, skim what was fetched and written before you hit send. Details in SECURITY.md.

Other commands

/setup, /scrape, and /apply form the core workflow. Ten more commands extend it once your profile is in place:

/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 templates (LaTeX, Typst, ...)
│   │   ├── 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
│   │   ├── gmail-sync.md              # /gmail-sync auto-detect application status from Gmail
│   │   ├── interview.md               # /interview stage-specific prep pack + mock interview
│   │   ├── html-report.md             # /html-report generate application tracker dashboard
│   │   ├── notion-sync.md             # /notion-sync one-way pipeline view in a Notion database
│   │   └── 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)
│   └── freehire-search/               # freehire.me tech job aggregator (multi-market, REST API)
├── 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 (<company>_<role>/)
├── .github/workflows/ci.yml           # CI: LaTeX smoke compiles, skill lint, CLI typechecks
├── salary_lookup.py                   # Salary benchmarking tool (BYO data)
├── tools/
│   ├── check_framework_version.py     # CI check: framework_version bumped when skill files change
│   ├── check_upstream_updates.py      # Preview which personalized files an upstream update touches
│   ├── convert_salary_excel.py        # Convert salary Excel to JSON
│   ├── lint_skills.py                 # CI lint for skills, commands, settings.json
│   ├── robots_check.py                # Gate the browser-header retry against robots.txt
│   ├── security_guards.py             # CI guards: permission allowlist, gitignore rules, manifests
│   ├── upstream_triage.py             # Sort upstream commits into worth-reviewing vs probably-skip
│   ├── verify_layout.py               # Measure a compiled PDF's page layout (holes, orphans, footer collisions)
│   ├── verify_pdf.py                  # Verify a compiled PDF's page count and extractable text
│   └── README_SALARY_TOOL.md          # Salary tool setup instructions
├── job_scraper/                       # Scraper state (seen jobs, results)
├── gmail_sync/                        # /gmail-sync state (processed message IDs, last sync date)
├── 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:

  1. Parse the job posting (URL or text)
  2. Evaluate fit against your profile (skills, experience, culture, location, career alignment)
  3. Draft a tailored CV and cover letter in LaTeX
  4. Spawn a reviewer agent that researches the company and critiques the drafts
  5. Revise based on the reviewer's feedback
  6. 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.
  7. 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 against the extraction. Keywords the profile genuinely supports get added; genuine gaps stay visible, never stuffed.

ai-job-search (MadsLorentzen/ai-job-search)

Searching Database…

Что это такое?Фреймворк для подачи заявок на работу на основе ИИ, построенный поверх Claude Code. Вы делаете форк, заполняете свой профиль, и Claude оценивает вакансии, адаптирует ваше резюме, пишет сопроводительные письма и готовит вас к собеседованиям. Всё работает локально на вашем компьютере.
Это отдельное приложение или оно работает внутри Claude Code?Это не отдельное приложение. Это набор слэш-команд и навыков (например, /setup, /scrape, /apply, /interview), построенных поверх форкнутого git-репозитория со скриптами и шаблонами, и работает он внутри CLI Claude Code.
Как это запустить?Сделайте форк и клонируйте репозиторий, установите CLI-инструменты для поиска работы с помощью Bun, затем запустите /setup внутри Claude Code. /setup может прочитать папку с документами (ваше резюме и экспорт из LinkedIn), принять вставленное резюме или просто задать вам вопросы, чтобы составить ваш профиль.
Что нужно установить, помимо Claude Code?Python 3.10+, Bun для CLI-инструментов поиска работы и дистрибутив LaTeX с lualatex и xelatex (TeX Live, MacTeX, TinyTeX или MiKTeX), так как резюме и сопроводительное письмо — это документы LaTeX, которые компилируются в PDF.
Оно само отправляет заявки за меня?Нет, /apply составляет и компилирует PDF-файлы резюме и сопроводительного письма и проверяет ключевые слова для ATS-систем, но отправку делаете вы. Тексты вакансий рассматриваются как недоверенный текст, по которому рабочий процесс никогда не действует вслепую, а вам рекомендуют просмотреть загруженное и написанное, прежде чем нажимать «Отправить».
Инструменты поиска по порталам вакансий сделаны только для Дании?Готовые навыки поиска по порталам ориентированы на датский рынок труда (Jobindex, Jobnet, Akademikernes Jobbank), но основной конвейер оценки соответствия вакансии и подачи заявок не зависит ни от языка, ни от страны. Команда /add-portal может создать новый навык поиска для ваших местных сайтов с вакансиями.
Что делает команда /interview?Она собирает пакет подготовки к собеседованию для конкретного этапа из архива самой заявки (точный текст вакансии, резюме и сопроводительное письмо, которые реально читал интервьюер, прошлые отзывы), сопоставляет вероятные вопросы с вашими примерами по методу STAR, проводит пробное собеседование и даёт честные ответы-мостики, а не выдуманный опыт для закрытия пробелов.
Может ли оно отслеживать, что стало с моими заявками?Да, /outcome записывает в трекер этапы собеседований, офферы, отказы или отсутствие ответа. А /outcome followup отмечает заявки, по которым нет ответа 10+ дней, и составляет черновик короткого письма-напоминания (но никогда его не отправляет), основанного только на том, что вы уже отправили.
Можно ли использовать свой шаблон резюме вместо стандартного на LaTeX?Да, /add-template регистрирует свой шаблон резюме или сопроводительного письма на LaTeX, Typst или другом инструментарии, запоминает команду компиляции и правила оформления, выполняет обязательную тестовую компиляцию и подключает его к /apply.
Зачем делать форк репозитория, а не просто установить его как пакет?Проект задуман как то, что форкают и чем владеют: ваш профиль, заявки и трекер хранятся как файлы, которые отслеживает git, внутри вашей копии. Поэтому форк (или приватный репозиторий на его основе) делает весь ваш поиск работы самостоятельным и находящимся под вашим контролем.
Size
4.6 MB
Stars
48.9K
Age
7mo
Commits · 90 Days