An automated, ATS-optimized resume tailoring system built on . Paste a job description, get a tailored, quality-gated, one-page PDF — without hand-editing LaTeX.
Overview
An automated, ATS-optimized resume tailoring system built on . Paste a job description, get a tailored, quality-gated, one-page PDF — without hand-editing LaTeX. This repo ships with a ("Alex Morgan", a Data Engineer) so the whole pipeline runs end-to-end out of the box and compiles to a real demo PDF. Swap in your own details to make it yours. cover letter generation. A sixth skill (resume-cover-letter) writes a tone-gated, truth-checked one-page cover letter as a designed PDF — opt-in per role, reusing the resume's analysis. See CHANGELOG.md. sharing is caring. Job hunting is exhausting enough without spending an hour tweaking your resume for every posting. If tech can make that easier, everyone should have it — so here it is. Use it, fork it, pass it on. Tailoring a resume to each job posting is the single highest-leverage thing a job seeker can do for ATS (applicant tracking system) match rates — and the most tedious. For every application you have to: 1.
README
Resume Autopilot — Claude Code Resume Tailoring Agent
An automated, ATS-optimized resume tailoring system built on Claude Code. Paste a job description, get a tailored, quality-gated, one-page PDF — without hand-editing LaTeX.
This repo ships with a fictional sample persona (“Alex Morgan”, a Data Engineer) so the whole pipeline runs end-to-end out of the box and compiles to a real demo PDF. Swap in your own details to make it yours.
New in v3.0.0: cover letter generation. A sixth skill (
resume-cover-letter) writes a tone-gated, truth-checked one-page cover letter as a designed PDF — opt-in per role, reusing the resume’s analysis. See CHANGELOG.md.
Why this exists: sharing is caring. Job hunting is exhausting enough without spending an hour tweaking your resume for every posting. If tech can make that easier, everyone should have it — so here it is. Use it, fork it, pass it on.
The problem
Tailoring a resume to each job posting is the single highest-leverage thing a job seeker can do for ATS (applicant tracking system) match rates — and the most tedious. For every application you have to:
- Read the JD and figure out which keywords it actually weights
- Decide what to add, where, and what to cut to stay one page
- Edit LaTeX without breaking the layout
- Sanity-check metrics, buzzwords, length, and formatting
- Recompile and track what you sent where
Doing this by hand for 20+ applications a week is unsustainable. Doing it with a naive “rewrite my resume” LLM prompt burns tokens and produces inconsistent, often-fabricated output.
This repo is the engineered answer: a deterministic-script-first, LLM-second pipeline driven by a Claude Code agent, with hard quality gates and a fixed LaTeX template that the agent is forbidden to break.
Demo
A fully-worked example ships in jobs/example_company/ — the persona’s
resume tailored to a fictional Cloudpeak — Data Engineer posting:
| File | What it is |
|---|---|
jd.txt |
The job description |
analysis.md |
Claude’s full-mode tailoring strategy |
resume.tex |
The tailored LaTeX source |
AlexMorgan_Resume_Cloudpeak_DataEngineer.pdf |
The compiled one-page output |
The keyword script scored the master resume at 81% against this JD; after the agent executed the planned changes, the tailored resume scored 94% — passing all quality gates and staying on one page.
$ python scripts/keyword_match.py jobs/example_company/jd.txt master-1page/resume.tex
Match score: 81% (26/32 known JD keywords)
MISSING from resume (6) — sorted by JD emphasis:
- ci/cd ×2
- kubernetes ×2
- great expectations
...
ARCHETYPE: batch-DE
QUICK WINS — top 3 missing keywords by JD emphasis:
→ Add "ci/cd" to Skills > Programming & Tools (appears ×2 in JD)
→ Add "kubernetes" to Skills > Programming & Tools (appears ×2 in JD)
How it works
┌──────────────┐
JD → │ keyword_match│ deterministic, ZERO Claude tokens
│ .py │ → match %, missing keywords (ranked), archetype, quick wins
└──────┬───────┘
▼
┌──────────────┐
│ analysis.md │ Claude reads the script output (not the raw JD in quick mode)
│ (quick/full) │ → a concrete, line-by-line "Planned Changes" list
└──────┬───────┘
▼
┌──────────────┐
│ resume.tex │ Claude edits ONLY content — never the LaTeX preamble/spacing
│ (tailored) │ → reframes existing bullets, layers in missing keywords
└──────┬───────┘
▼
┌──────────────┐
│quality_check │ hard gate: 5+ metrics, 0 buzzwords, 0 first-person, 2+ soft-skill
│ .py │ signals, no duplicate bullets, LaTeX preamble untouched → must PASS
└──────┬───────┘
▼
┌──────────────┐
│ truth_check │ fabrication gate: every number must be traceable to your
│ .py │ masters/knowledge base — a made-up metric blocks the build
└──────┬───────┘
▼
┌──────────────┐
│finish_job.sh │ latexmk → named PDF → 1-page gate → re-score the EXTRACTED
│ │ PDF text (what an ATS parses) → abort if worse than master
└──────┬───────┘
▼
tracker.md append: company, role, date, match % (master -> tailored),
response, interview, status
Three engineering ideas make this work better than “ask an LLM to rewrite my resume”:
-
A deterministic script runs before the LLM.
keyword_match.pydoes the keyword gap analysis with zero tokens — ranking missing keywords by JD emphasis, detecting the role archetype, and suggesting placements. Claude never wastes tokens computing what a regex can. -
Token-budgeted analysis modes.
quickmode (~150 tokens) reads only the script’s pre-analysis block and writes the change list — ideal for 20+ applications/day.fullmode (~600 tokens) reads the JD for soft-signal extraction on target companies. You choose the spend per application. -
Quality gates that block bad output.
quality_check.pyfails the build if the resume has fewer than 5 metrics, any banned buzzword or first-person pronoun, too few soft-skill signals, duplicate bullets, or a modified LaTeX preamble (hash-checked against the master). The agent must fix FAILs before it is allowed to compile — so “looks done” can’t ship broken. -
It can’t lie for you.
truth_check.pycompares every number in the tailored resume against your masters andknowledge/files. A fabricated metric is an interview you’ll fail — so it’s a hard block, not a warning. -
It scores what recruiters’ software actually sees. The final match score runs against text extracted from the compiled PDF (the thing an ATS parses), not your source file — and the build aborts if tailoring somehow made the score worse than the master.
The LaTeX template (Jake’s Resume) is treated as immutable structure: CLAUDE.md forbids the
agent from touching the documentclass, geometry, spacing, fonts, or commands. It may only change
content between \begin{document} and \end{document}. This is what keeps every output consistently
one page and ATS-parseable.
The 6 skills
This repo doubles as an installable Claude Code plugin bundling six resume skills. Four are research/coaching tools you run periodically on your master resume; one is a surgical bullet editor and one is a cover-letter generator, both used inside the per-application workflow.
| Skill | What it does | When to use |
|---|---|---|
resume-diagnoser |
Simulates an ATS scan; flags auto-rejection risks and ranks the top 5 fixes | New master resume, or interview rate drops |
resume-recruiter |
Market-wide keyword intelligence for a role type; missing keywords + trending skills | Targeting a new role type |
resume-rewriter |
Rewrites every experience bullet with Google’s XYZ formula, layering in keywords | Full master-resume overhaul |
resume-hiring-manager |
30-min mock interview with scoring + hireability score + study plan | Night before a real interview |
resume-bullet-refiner |
Surgical single-bullet rewrites; asks for metrics instead of fabricating | Anytime a bullet feels weak |
resume-cover-letter |
Tailored one-page cover letter (4 beats, tone-gated, truth-checked) → PDF | A target company, after the resume passes — opt-in |
See SKILLS.md for the full when-to-use-what guide.
Install
Option A — as a Claude Code plugin (recommended)
From inside Claude Code, add this repo as a plugin marketplace and install the toolkit:
/plugin marketplace add domala81/resume-autopilot
/plugin install resume-autopilot@resume-autopilot-marketplace
(You can also point at a local clone: /plugin marketplace add ./resume-autopilot.)
The six skills are then available in any Claude Code session.
Option B — manual copy
Skills are just SKILL.md files. Copy them into your personal skills directory:
cp -r skills/* ~/.claude/skills/
Then clone the pipeline
git clone https://github.com/domala81/resume-autopilot.git
cd resume-autopilot
Open the folder in Claude Code and paste a job description to start tailoring.
Quickstart — tailor a resume for a job
First, strengthen your master. Your master resume is the ceiling: tailoring can only polish it, never fix it. Run the master loop in SKILLS.md (diagnoser → recruiter → rewriter → bullet-refiner) before tailoring anything, and again every 2–3 months.
- Open this repo in Claude Code.
- Paste a job description and say e.g. “full: tailor my resume for this Cloudpeak Data Engineer role.”
- Claude runs the pipeline: saves the JD → runs
keyword_match.py→ writesanalysis.md→ copies the master → executes the planned changes → runsquality_check.py→ compiles the PDF → updatestracker.md. - Find your tailored, one-page PDF in
jobs//.
Prefer to drive the scripts yourself? Two calls run the whole pipeline:
# save the JD to jobs//jd.txt first, then:
bash scripts/new_job.sh # setup + gap analysis
# ...edit jobs//resume.tex (or let Claude do it)...
bash scripts/finish_job.sh YourName_Resume__ "" # all gates + PDF + tracker
Between editing and finishing, one zero-token command puts your strongest evidence where the 6-second recruiter scan lands — the top of each role:
python3 scripts/reorder_bullets.py jobs//resume.tex jobs//jd.txt --apply
It only reorders — bullet text never changes (a built-in check guarantees it), and a % pin
comment after any bullet holds it in place.
Each underlying script also stands alone (keyword_match.py, quality_check.py, truth_check.py,
reorder_bullets.py, compile.sh) — see each script’s header for usage.
Repo structure
resume-autopilot/
├── .claude-plugin/ # makes the repo an installable Claude Code plugin + marketplace
│ ├── plugin.json
│ └── marketplace.json
├── CLAUDE.md # the agent's operating instructions — the per-application workflow
├── README.md # you are here
├── SKILLS.md # when-to-use-which-skill reference
├── skills/ # the 6 resume skills (auto-loaded by the plugin)
│ └── resume-*/SKILL.md
├── config.json # your identity + paths — edit this first
├── keywords/ # keyword data per role type (JSON, swappable) + guide
├── scripts/
│ ├── new_job.sh # one call: job folder + master copy + gap analysis
│ ├── finish_job.sh # one call: every gate → named PDF → tracker row
│ ├── keyword_match.py # zero-token JD↔resume gap analysis
│ ├── quality_check.py # metrics / buzzword / soft-skill / preamble / duplicate gate
│ ├── truth_check.py # fabrication gate — blocks untraceable metrics
│ ├── reorder_bullets.py # strongest JD-matching bullets to the top (pure reorder)
│ ├── compile.sh # latexmk → named PDF
│ ├── cover_letter_check.py # cover-letter tone gate: buzzwords + AI-tells + word count
│ └── cover_letter.sh # opt-in cover letter: tone + truth gate → compiled PDF
├── master-1page/ # one-page master + first-time setup guide (README)
├── master-full/resume.tex # full master — no page limit
├── knowledge/ # source-of-truth content the agent pulls from (+ setup README)
│ ├── skills.md experience.md projects.md achievement_bank.md certifications.md
├── jobs/ # one folder per application (+ how-it-flows README)
│ ├── tracker.md # application log: match delta, response, interview
│ ├── template_company/ # blank starting point
│ └── example_company/ # ← fully-worked demo (JD → analysis → tailored resume → PDF)
├── assets/jakes_resume.tex # the upstream Jake's Resume template, for reference
└── assets/cover_letter_template.tex # cover-letter LaTeX template (header matches the resume)
New here? Follow the setup guides in order: master-1page/README.md →
knowledge/README.md → jobs/README.md. Different career?
keywords/README.md.
Why this shape: the knowledge/ base is the single source of truth so the agent never
fabricates — it reframes real content. The master-* files are the canonical resumes; each job gets
its own folder under jobs/ so applications never collide and every tailored version is reproducible
from its .tex. The scripts are dependency-light and standalone so you can run the pipeline with or
without the agent.
Make it yours
Replace the fictional Alex Morgan persona with your own:
config.json— your name, email, phone, and output filename prefix. The truth check, PDF contact check, and finish script all read from here.master-1page/resume.texandmaster-full/resume.tex— edit only the content between\begin{document}and\end{document}. Leave the preamble alone — it’s hash-checked, and a drifted preamble fails the build. Full guide:master-1page/README.md.knowledge/— put your real roles, projects, achievements, and metrics here. The truth check only allows numbers it can trace to these files, so if it’s not written here, it can’t go on your resume. Guide:knowledge/README.md.CLAUDE.md— set the Target role line to the role you’re applying for.- The 6 skills — open each
skills/resume-*/SKILL.mdand replace theDefault context — REPLACE with your ownblock with your name, seniority, and stack. Forresume-cover-letter, map its centerpiece/differentiator categories to your realknowledge/stories. - The keyword bank —
keywords/data-eng.jsonis tuned for Data / AI / Cloud roles. Different field? Copy it, edit five JSON keys, pointconfig.jsonat your file — no code changes. Guide:keywords/README.md. - Delete
jobs/example_company/(or keep it as a reference) and clear the demo row fromjobs/tracker.md.
Prerequisites
- Claude Code — the agent runtime (install guide)
- A LaTeX toolchain with
latexmk— for PDF compilation. Quick install:- macOS:
brew install --cask mactex-no-gui(or the smallerbasictex) - Debian/Ubuntu:
sudo apt-get install texlive-latex-extra latexmk - Windows: install MiKTeX (bundles
latexmk)
- macOS:
- Python 3.8+ — for the keyword and quality scripts (standard library only, no pip installs)
- poppler (optional but recommended) — enables the PDF-text ATS checks
(
brew install poppler/apt-get install poppler-utils). Without it the pipeline still runs, scoring the.texsource instead of the extracted PDF text.
Credits & License
- Resume layout: Jake’s Resume (template, MIT).
- Everything else in this repo: MIT — see
LICENSE. Use it, fork it, make it yours.
Recommended Tools
Try a different keyword or remove a filter.
Install
npx skillfish add domala81/resume-autopilot