My CV is a CI pipeline

One LaTeX file, a Makefile and GitHub Actions build every version of my CV, including dyslexia-friendly and high-contrast ones.

3 min read

Most people have a CV in Word. I have a CV with a build pipeline. Probably overkill, but hear me out.

My real CV lives in a private repo, so I made a public copy with a made-up person in it: cv-pipeline. You can see every version it builds on the live demo.

Why

I'm dyslexic, and editing a Word doc has always been a pain for me. The formatting moves around, and I end up with five copies called cv_final_v3. Text in a git repo is much easier. I change one line, I can see the diff, and the computer does the rest.

There's another reason too. I wanted my CV to be readable by people like me. So the pipeline doesn't just make one PDF. It makes a few.

What it builds

Everything comes from one cv.tex file. A small layout.tex turns features on and off with flags, and the Makefile builds each version:

  • Standard: the normal two-page CV.
  • Accessible: bigger line spacing, darker grey text, and clear heading bars.
  • Dyslexic: the same, but in the OpenDyslexic font.
  • Dyslexic inverted: yellow text on black, for people who find white pages hard to read.
  • Public: my work email instead of my phone number, for the version that lives on the internet.

Then Ghostscript makes print, archive and preview copies of each PDF.

Branches are applications

This is the bit I like most. Every job application gets its own branch. Push the branch, and GitHub Actions builds every version and deploys it to cv.benjamin.ie/<branch>/<date>/. A bot comments on the pull request with the links and checksums, so I can check every version before I send anything.

Merging to main updates the live site at cv.benjamin.ie.

A version for machines

These days a lot of CVs get read by software before a person sees them. PDFs, especially two-column ones, come out scrambled when a tool tries to read them.

I used to run the PDF through a document converter to get Markdown and JSON. It put things in the wrong order and turned my name into a 1 MB image. So I threw it out and wrote a small Python script that reads cv.tex directly. Now the pipeline also publishes:

  • cv.md for anything that reads Markdown
  • cv.json with structured sections, roles and links
  • cv.html, a plain web page that works in dark mode

The JSON went from 1.1 MB to about 10 KB. It's the same content, in the right order, every time.

Things I learned

  • Accessibility is a design choice, not a font. OpenDyslexic is wider, so my name ran into my contact details. Heading bars in the high-contrast version were unreadable at first. Each version needed its own fixes.
  • Delete old files when you deploy. I dropped a one-page summary version and it kept showing up, because the deploy only ever added files. Now it clears the folder first.
  • Small scripts beat big tools. A few hundred lines of standard-library Python was more reliable than a big converter.

Try it

Fork cv-pipeline, swap in your own details, and turn on GitHub Pages. Every pull request then gets its own preview link. The approach works for any LaTeX document: write once, build many, and let CI check it for you.