resume-tailor
- repo:
- Waaangjl/resume-tailor
- lang:
- Python · LaTeX
- year:
- 2026 · active
A small Python tool takes a LaTeX résumé and a job description, then rewrites the bullets—and only the bullets—for that particular role. Its hard boundary is invention. If a bullet says I built a forty-tab cash-flow model in March 2025, the tool can change the verb, move the emphasis, or bring a more relevant result forward. It cannot turn forty tabs into fifty, or March into February.
Why I wrote it
SIPA's concentrated recruiting season is a treadmill: fifteen banks, ten consultancies, twelve climate funds, each wanting its own résumé and cover letter, somehow all due on the same Sunday. The tailoring is not intellectually hard. It is careful copy and paste, followed by dozens of tiny judgments about which bullet deserves to lead.
I did the first round by hand. By the seventh résumé, I noticed the same few edits repeating: changing tense, reordering the lead bullet, expanding "Python" to "Python (pandas, statsmodels)" when the existing facts and the job description called for it. Short, local rewrites under a hard constraint are something a language model is genuinely good at.
So I wrote it.
How it works
A .tex file goes in. The tool parses out each \item{...} bullet, builds a context of your full résumé, the JD, the role's seniority, and any guardrails you set, then asks a model to rewrite each bullet under three rules:
- Don't add facts. If a bullet doesn't have a number, the rewrite doesn't get to invent one.
- Keep proper nouns. Wood Mackenzie stays Wood Mackenzie; "a research firm" is not allowed as a substitute.
- Match the JD's vocabulary. If the JD says "valuation," the bullet doesn't say "modeling."
The output is a new .tex file and a colored diff, so every change can be inspected and any drift rejected. A separate flag applies the same constraints to a five-paragraph cover-letter template.
It can call Claude Code through claude -p, or any model supported by LiteLLM. I use Sonnet for most first passes and Opus when a résumé deserves another look.
What it doesn't do
- It doesn't typeset. You still run
pdflatex. - It doesn't track outcomes. There's no "résumé v3 got me an interview at firm Y" loop. I tried wiring one up and decided it was creepy.
- It doesn't tailor to culture, as in "this firm is collegial, write warmer." The model will do that if you ask, but the results were mediocre and I cut the feature.
Caveat
There is a real ethical line here. Tailoring is acceptable; fabrication is not. The three rules exist to keep the tool on the right side of that line. A user can still override them and ask the model to lie. I hope you will not.
Clone
git clone https://github.com/Waaangjl/resume-tailor
cd resume-tailor
pip install -r requirements.txt
python tailor.py --resume me.tex --jd job.txt --out me-tailored.tex
Repository: github.com/Waaangjl/resume-tailor.