How I manage my CV with LaTeX, Gulp, S3, and Bitly… and how you can do it too!

A CV is usually the first thing a potential employer sees about a candidate. It’s a document that is expected to reflect your personality, your work ethics, and your technical proficiency.

That’s why graphic designers usually have awesome, beautiful, and very colorful CVs. If I received any of these while looking for a graphic designer, I’d feel pretty confident they know what they’re doing.

As developers, our expertise lies in code, plain text files, and the tools to make the process more automated. I wanted a CV that would be similar to how I write software, so I designed a system involving LaTeX, Gulp, S3, and Bitly.

Why not use Google docs/Word/Writer?

These are very good text document editors, there is no learning curve involved in using them, and they offer a decent amount of formatting options. Recruiters always ask for the “MS Word .doc” version of my CV so they can replace my contact details with theirs, it sounds like a word processor would be the easiest way to go.

But where’s the fun in that?

MS Office is the goto word processor in most companies. It’s pretty good at opening documents created by itself, not so much at dealing with LibreOffice Writer or Apple Pages documents. I don’t use Windows, so I can’t create documents with MS Word. This means that I have to export the document to PDF anyway, to make sure it would look as I intended on any computer.

Word processors output binary files: a docx is actually some XML compressed in a zip archive.

On the other hand, LaTeX uses plain text files for input. It has been around for decades and is incredibly good at typesetting. Graduates use it to write theses, scientists use it to publish papers, authors for books; and if it’s good enough for Donald Knuth, it’s probably good enough for me too.

So, LaTeX produces high quality, typeset documents from plain text files. It’s battle tested, has a ton of documentation, and can output PDFs.

Why version my CV?

Don’t judge me, I love to tweak my CV. I will randomly come up with an idea on how to simplify it further or how to better phrase something, even if I’m not looking for a job.

My CV is LaTeX, which is code, and versioning often changing code is the natural thing to do. It makes it trivial to see past changes, revert modifications, and experiment.

Git is a staple of software development. I use it extensively for work; it’s the perfect fit for this project. And with it, I can do Semantic versioning via git tags with every iteration to get more visibility into the release history. Plus I get backups for free via GitLab or GitHub, and I can share the code with the world.

Ok, but Gulp and S3, isn’t that overkill?

With every change to the LaTeX document, I have to recompile it to PDF to see the effect. Going back and forth between vim, the terminal, and Preview is tedious and inefficient.

Gulp is a JavaScript task runner, this is exactly what I need to make the steps above automated and reproducible.

I have a work task that watches the LaTeX document for changes and recompiles it to PDF every time. I only need to run the command once and it will keep watching until I stop it. The PDF is loaded in a Preview window next to a vim window, and it live updates as soon as I save in vim. Pretty neat.

Releasing my CV involves several steps, it’s easy to forget about one and a waste of time to do it manually. I wanted an easy way to distribute my résumé when email isn’t an option. I settled on uploading it to a publicly accessible location linked to a short, memorable Bitly URL.

A major issue with having my CV public was that it contains personal information. My work history is on LinkedIn; but I’d like to keep my personal email and phone number private while still displaying them on my CV. I didn’t want to have two versions either: the paper copy must be an exact reproduction of the digital copy.

I went with a password protected zip archive hosted on S3. I give the password along with the URL; and because it’s a zip file, it can be opened on almost any platform. I am aware there are better archive formats, but none are as universal as zip.

S3 has an API, so Gulp can upload the file, set the proper permissions (read-only for the public, read-write for me), and use the Infrequent Access storage class. IA helps me reduce the storage costs by a factor of 2.4× while paying more for GET requests. This makes sense in that case because the file is stored for long period of times and sees low traffic.

The publish task does all this for me, once the commit is properly tagged: it compiles the document, puts it in a password protected zip archive, and sends it to S3 with the right settings. Done.

Recursion and self-replication are cool, even more so if it involves physical artifacts. So I put a link on my CV to download a digital copy of it (if you’re holding the paper version) or to obtain the latest version and make hardcopies of it (if you’re holding the digital version).

A custom LaTeX document class

There are excellent, free to use CV templates available online. However, they didn’t quite fit my needs: I wanted to display information in a different way than what the templates allowed and I wanted my CV to look unique.

It was a good opportunity to learn how to write LaTeX templates, and off I went to create my own. LaTeX can be unwieldy at time, conditionals or a variable number of arguments aren’t the most straightforward to write; the payoff was worth it though, I now have my own document class (template) and a very maintainable, plain text CV.

How you can do it too

I have open sourced the tool to accomplish all these tasks: and you’re welcome to use it for yourself.

To host your files on Amazon S3, you’ll need an AWS account (free for the first year, very reasonable afterwards considering the small file size and low traffic).

If you register on Bitly, you can create custom short URLs instead of a random string of characters and numbers. You also get analytics for free to measure clicks over time.


LaTeX is an amazing piece of software, the documents it produces look very professional, and the text is so well aligned you can put a ruler to the margins. The language can be intimidating at first, but it’s very well documented. I found the NASA’s documentation very helpful and the ShareLaTeX website is great for quickly experimenting in your browser.

Gulp is the JavaScript task runner dujour, it’s the perfect excuse to start playing with it. It will be relevant to most (any?) web related future project, and will make your life so much easier!

I highly encourage everyone to put in the time and use LaTeX for their CVs, but also any other document. The end result will look better, you’ll pick up a valuable skill, and versioning your CV is cool!

If this blog post inspired you to make the switch, I’d love to read about it in the comments!

I’m a software developer living in Canada, you can find me on Twitter (@pypouj), GitHub (coaxial), and LinkedIn.