I wanted to update my resume, and I wound up also building a resume generation pipeline. If you too are tired of fighting with a word processor to get your resume just right, and would prefer to fight with LaTeX and Python and Docker, then this post is for you!
I’ve made the relevant source code available on GitHub.
Goals
I wanted to treat my resume like code. I wanted it to live in a repo, have versioned changes, and have a build process. I wanted to be able to create reusable blocks for consistent styling. I wanted to have complete flexibility over how to style and format my resume.
This led me to LaTeX.
In addition to those goals, I had a few requirements:
- I needed reliable spellchecking.
- I needed a way to validate that the URLs in my resume were valid.
- I needed a reproducible dev environment.
Approach
I am sharing my approach in hopes that it will help someone else with similar goals:
- I found a resume template on Overleaf that I liked. Some of them looked too busy to me.
- I made a new repo with a single
resume.tex
file, pasting my chosen template. - I asked Claude to generate a Dockerfile with all the dependencies required for building
resume.tex
into a PDF. - I created a
Justfile
with a singlebuild
command that ran my Docker container to generate the resume. - I iterated on the resume and got styling help from Claude. Sometimes I’d paste a screenshot of the PDF and ask for visual feedback, then follow up with implementation help for specific suggestions.
- Once I was pretty happy with the resume, I used Claude Code to build a URL checker with Python. This tool just read the content of my
resume.tex
file and looked for URL strings with regex, and then made web requests to ensure I was getting a 200 OK or a redirect (301 or 302). It prints output and exits with a success or error status code. I don’t think I wrote any of this code by hand; Claude did a great job at generating it. - I updated my
build
command to call the URL checker before creating the PDF, and I verified that it would exit with a clear error and not proceed to make the PDF when an invalid URL was found. -
Spellchecking was the trickiest part. I ended up using LanguageTool via the
erikvl87/languagetool
Docker image. I had Claude write a Python script that (1) starts the Docker container and (2) sends the resume text to LanguageTool over its REST API.To prepare the text, I used pandoc to convert my .tex file to plain text. I also created an allowed-word dictionary (to avoid flagging tech terms) and filtered out whitespace-related errors I didn’t care about.
The tool caught more issues than a simple spellchecker, but missed some grammar edge cases. I might improve this in the future.
- Since my spellcheck script also returns a success or error exit code, I was able to hook it into my
build
process and have it error out if spelling errors are found.
Conclusion
I’m happy with the outcome: my resume looks clean, is up to date, and now lives in a system that makes it easy to maintain and iterate on. I can make changes to my resume.tex and run just build
to get a new PDF!