cd /news/ai-tools/show-hn-ai-powered-job-application-f… Β· home β€Ί topics β€Ί ai-tools β€Ί article
[ARTICLE Β· art-52847] src=github.com β†— pub= topic=ai-tools verified=true sentiment=Β· neutral

Show HN: AI-powered job application framework built on Claude Code

An open-source AI-powered job application framework built on Claude Code allows users to automate job search, CV tailoring, cover letter writing, and interview preparation. The project, created by Mads Lorentzen, is independent of Anthropic and includes Danish job portal integrations but is designed to be adaptable to other regions.

read14 min views1 publishedJul 9, 2026
Show HN: AI-powered job application framework built on Claude Code
Image: source

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. β˜•

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.

Claude Code(CLI)- Python 3.10+ Bun(for Danish job search CLI tools)- LaTeX distribution with lualatex

andxelatex

:TeX Live,MacTeX,TinyTeX, orMiKTeX. The CV compiles withlualatex

(pdflatex often fails on modern MiKTeX installs withfontawesome5

font-expansion errors); the cover letter compiles withxelatex

becausecover.cls

requiresfontspec

. If using a minimal TeX install such as TinyTeX or BasicTeX, install the extra packages listed inSETUP.md. - Optional: pdftotext

frompoppler(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.

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

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.

claude
/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.

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

/setup

, /scrape

, and /apply

form the core workflow. Seven more commands extend it once your profile is in place:

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/interview

07-interview-prep.md

. Gaps get honest bridge answers, never invented experience.records what happened to an application - interview stages, offers, rejections, silence. It archives the submitted CV, cover letter, and posting text into/outcome

documents/applications/<company>_<role>/

, keepsoutcome.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.bridges/rank

/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.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/expand

/setup

to surface skills that documents alone don't make explicit.analyzes the gap between your profile and your tracked job postings (or a single posting via/upskill

/upskill <URL>

). 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.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/add-template

/apply

. SeeLaTeX templatesbelow.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/add-portal

Job search toolsbelow.

/reset

is also available, see Starting over below.

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 (<company>_<role>/)
β”œβ”€β”€ .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

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 LaTeXSpawn a reviewer agent that researches the company and critiques the draftsRevise based on the reviewer's feedbackCompile 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 against the extraction. Keywords the profile genuinely supports get added; genuine gaps stay visible, never stuffed.Present the final output with a verification checklist

All claims in the CV and cover letter are verified against your actual profile. The system never fabricates skills or experience.

PDF verification loop. Most LaTeX-resume templates produce "looks fine in the .tex" output that breaks in the PDF: job titles orphan to the next page, cover letters spill onto page 2, bullet fonts silently fall back to the body font. The/apply

command compiles and visually inspects every PDF and applies targeted fixes (\needspace

,\enlargethispage

, font-matching wrappers for list items) until the layout is clean. This runs automatically on every application.ATS verification on the PDF text layer. An ATS reads the PDF's embedded text, not the rendered page β€” and LaTeX can silently produce PDFs whose text extracts as garbage (icon glyphs where the email should be, interleaved lines from multi-column layouts)./apply

extracts the compiled CV's text layer withpdftotext

and verifies contact details, reading order, and the posting's keyword coverage against what a parser actually sees. Honesty rule enforced: a keyword the profile doesn't support is acknowledged as a gap, never stuffed in.Relevance-weighted CV cutting. When a CV overflows 2 pages, the workflow does not cut mechanically from the "oldest" section. It scores each candidate line by (a) relevance to the target posting, (b) uniqueness in the document, and (c) whether the cover letter depends on it, and cuts the lowest-total-score line first. An older-role bullet that hits posting keywords survives ahead of a recent-role bullet that does not.Drafter-reviewer separation. The drafter writes; a second Claude agent, spawned with a fresh context, researches the company and critiques the drafts. The drafter then revises. This catches missed keywords, weak framing, and generic language that a single pass often leaves in.Token-efficient reviewer dispatch. The reviewer agent receives drafts inline rather than re-reading them, and the verification checklist runs once at the end of the workflow rather than being duplicated by both agents. Note: the new compile-and-inspect step in Step 5 spends some of those savings on PDF rendering and layout iteration β€” the workflow trades some end-to-end token cost for a real reduction in broken PDFs reaching the user.

If you prefer editing files directly instead of using /setup

:

File What to change
CLAUDE.md
Your full profile (name, education, experience, skills, goals)
01-candidate-profile.md
Structured version of your CV data
02-behavioral-profile.md
Your behavioral assessment or self-assessment
04-job-evaluation.md
Skill match areas, career goals, motivation filters
05-cv-templates.md
Profile statement templates for different role types
07-interview-prep.md
Your STAR examples from actual experience
search-queries.md
Job search queries for your skills and location

As your priorities evolve, you can reconfigure just the job search without re-running the full profile setup:

/setup --section search

This re-runs the search configuration interview: which roles to target, which skills to search for, which locations, and which portals. It also suggests role types you may not have considered based on your profile.

The CV uses moderncv (banking style). The cover letter uses a custom cover.cls

with Lato/Raleway fonts.

To use your own template instead, run:

/add-template

Point it at your .tex

file (plus any .cls

/.sty

files or bundled fonts). The command interviews you for the template's instructions β€” compile engine, fonts and where they live, style rules to preserve, hard page limit β€” stores everything under templates/

, runs a mandatory test compile, and activates the template so /apply

drafts from it. Templates are stored with [PLACEHOLDER]

tokens instead of personal data, so they're safe to commit and share.

/add-template --list

shows registered templates/add-template --use <name>

switches between them/add-template --use default

reverts to the stock moderncv / cover.cls templates

If you prefer doing it by hand, the manual route still works: update the guidance in 05-cv-templates.md

and 06-cover-letter-templates.md

.

The four Danish CLI tools in .agents/skills/

(Jobbank, Jobdanmark, Jobindex, Jobnet) demonstrate the pattern for building a job-portal integration for a specific market. If you're in a different country, run:

/add-portal

Give it your local job board's URL. The command investigates the portal (search-URL pattern, result-page structure, robots.txt/access rules), scaffolds a CLI skill with the same structure, commands, and output contract as the shipped ones, and test-runs a live query before registering anything. Auth-walled portals are declined, and portals with restrictive terms get a prominent personal-use-only warning in the generated skill. The generated skill is market-specific and lives in your fork; the generator itself is the universal part.

Maintaining a fork adapted to your market or language? Add it to the Community forks & adaptations thread so others can find it.

For a country-agnostic starting point, the repo also includes ** linkedin-search** β€” a job-search skill built on LinkedIn's public, unauthenticated

jobs-guest

endpoints. It is field-agnostic, has zero runtime dependencies(runs with just

bun

), and takes the search location as an explicit flag, so it works for any market out of the box (-l "Berlin, Germany"

, -l "Mumbai, Maharashtra, India"

, -l "Remote"

, …). It is intended for personal use onlyβ€” automated access is against LinkedIn's Terms of Service, so keep volume low. See

.agents/skills/linkedin-search/SKILL.md

.The salary tool works with any salary data you provide (union statistics, Glassdoor exports, personal research, etc.). See tools/README_SALARY_TOOL.md

for the expected format and setup. If you don't have salary data, the salary step is simply skipped.

To wipe your profile data and start fresh:

/reset profile    # clears skill files, preserves framework rules
/reset documents  # deletes files from documents/ folder
/reset all        # both

/reset

shows exactly what will be deleted and requires you to type RESET

to confirm. Nothing is deleted until you do.

The single biggest factor in output quality is how much detail you put into your profile. A thin profile produces generic applications; a detailed one enables genuinely tailored results.

Role descriptions: Don't just list job titles. Describe what you actually did in each position: specific projects, tools used, responsibilities, and measurable achievements. The more material you provide, the more precisely the system can reframe your experience for different roles.Skills in context: Instead of listing "Python" or "project management," describe how and where you applied them. "Built ML pipelines for customer churn prediction in Python using scikit-learn" gives the system far more to work with than "Python, machine learning."All onboarding paths work: Whether you point/setup

at yourdocuments/

folder, paste a single CV, or walk through the interview, the principle is the same: richer input produces sharper output.

The framework supports two distinct modes of job searching:

Explicit targeting: You know which roles or sectors you want. The system helps refine and prioritize based on fit.Latent opportunity discovery: By analyzing your full history (not just job titles, but the actual work you did), the system can surface career paths you haven't considered. Transferable skills that map to unexpected industries, patterns in what you enjoyed or excelled at, or emerging roles that combine your domain expertise with new technology.

To get the most from this, invest time during /setup

in describing not just your experience, but what energized you, what drained you, and what you'd want more of. This context directly shapes how the system evaluates fit and which roles it surfaces during /scrape

.

Thinking about a PR? Read CONTRIBUTING.md first - it explains what gets merged, what lives in forks, and why.

Mikkel Krogholm(skills repo) for the job search CLI skills- Built with Claude CodebyAnthropic

MIT

── more in #ai-tools 4 stories Β· sorted by recency
── more on @claude code 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/show-hn-ai-powered-j…] indexed:0 read:14min 2026-07-09 Β· β€”