From MS Word to LaTeX to Markdown: Taking the stress out of managing my CV

Victor MitiVictor Miti
5 min read

As developers, we often embark on projects to scratch our own itch. My journey to building a simple CV management tool is one such story - a tale of evolving needs, changing career paths, and the continuous quest for simpler and more efficient ways of doing things.

The Problem with Traditional CV Management

Like many professionals, I started my career using Microsoft Word for my CV. As a civil engineer, this seemed perfectly adequate at first. However, the problems quickly became apparent: multiple versions scattered across my computer, formatting inconsistencies, and the constant struggle to maintain a coherent document history. Which file had that perfect project description I wrote a couple of months ago?

The problem wasn't just about managing versions. As someone who values efficiency and automation, the traditional word processor approach felt increasingly at odds with modern development practices. I wanted something that would:

  • Allow version control like my code

  • Support easy formatting without fighting with Word's layout engine

  • Generate a high quality PDF

  • Enable quick updates without needing a Word processor or dealing with complex formatting

The LaTeX Era

In August 2019, I made my first attempt at modernizing my CV workflow by moving to LaTeX. Using the moderncv package, I created a professionally formatted document and, more importantly, put it under version control in a private GitLab repository. This was a significant improvement – my CV was now in plain text, versioned, and generated a consistent PDF output with professional typesetting.

However, LaTeX came with its own set of challenges:

  • The TeX environment setup was non-trivial

  • Sometimes, making customizations meant diving deep into LaTeX internals

  • The development cycle was slow: edit, compile, check PDF, repeat

Career Transition and New Requirements

When I began contemplating a switch to tech in 2021/2022, I realized I needed to update my CV and tailor it to suit a tech role. I still wanted to maintain my Civil Engineering focused CV. While doing some research on writing tech-centric CVs, I realised I needed to do more than just updating my CV -- I needed to completely rewrite it and structure it in a different way. I didn't want to use LaTeX, so I had to figure out another way. My research led me to explore various alternatives, including JSON Resume and Prateek Agarwal's json_resume. The idea was appealing: structured data in JSON format, separate from presentation concerns.

While JSON Resume is an excellent project, I couldn't find templates that matched my vision, and I lacked the time and skills to create my own. I settled on json_resume, but found myself still not entirely satisfied. My solution evolved into a web project with hand-customized HTML templates. The workflow was functional but hacky:.

  • lite-server would serve the resume webpage

  • Puppeteer would generate PDFs from the served page

  • Changes required editing HTML and manual PDF regeneration

While this solved some problems, it introduced new ones. The setup was complex, not user-friendly, and felt more like a temporary hack than a sustainable solution. Surely, there has to be a better way.

The Markdown Renaissance

By 2024, frustration with my existing setup led me back to the drawing board. I discovered Eliseo Papa's markdown-cv project, which resonated with my goals of simplicity and flexibility: simple content authoring with the ability to produce both PDF and web outputs. However, I wanted more control over styling and didn't want to depend on Ruby/Jekyll.

Initially, I got caught in the trap of overthinking the solution. I considered using 11ty, a static site generator I was already familiar with and very fond of, but found myself in development hell – planning features without writing code.

The breakthrough came in September 2024 when I decided to strip away the complexity and focus on solving the core problem. I chose Vite for its simplicity and modern development experience, avoiding frameworks that might constrain the solution.

This led to my current project, which achieves several key goals:

  1. Simple Content Authoring: A single markdown file (with YAML frontmatter) for all CV content -- parsed using Marked

  2. Modern Development Experience: Built with Vite for fast development and building

  3. Automated PDF Generation: CI/CD pipeline that automatically generates PDFs using Puppeteer and optionally deploy a static site if I needed to link to an html version of my CV.

  4. Framework Independence: Vanilla JavaScript and SCSS, no frameworks

  5. Modern Styling: Using Phosphor Icons and responsive design

The architecture is intentionally simple:

  1. Write CV content in Markdown with YAML frontmatter

  2. Parse and transform to a responsive webpage

  3. Generate PDF through Puppeteer

  4. Automate builds and deployments through CI

Technical Highlights

The project taught me several valuable lessons:

1. Sometimes Less is More

Initially, I overthought the solution, considering frameworks like 11ty. By stepping back and focusing on core functionality, I created something more maintainable and useful.

2. Expanding Technical Skills

As a Python developer, this project pushed me to improve my JavaScript and frontend development skills. I worked with:

  • Vite for building and development

  • Vitest for testing

  • PDF-lib for PDF manipulation

  • SCSS for styling, including defining print styles

3. CI/CD Integration

The automated PDF generation through GitHub Actions and GitLab CI/CD made the tool truly practical for regular use.

Status Quo and Looking Forward

The current solution achieves my primary goals:

  • Single source of truth in Markdown

  • Version-controlled content

  • Automated PDF generation

  • Easy customization

  • Responsive web output

  • Simple development workflow

While the tool isn't perfect, it solves the real-world problem of maintaining a professional CV in a developer-friendly way. The journey from Word to this current solution reflects not just my personal growth as a developer but also the evolution of web technologies and development practices.

If you find this useful or have suggestions for improvement, I'd love to hear from you! The project is now open-source and available for anyone facing similar challenges in managing their CV. I'm sharing it with the community in hopes that others might find it useful or even contribute improvements.

Remember, sometimes the best solution isn't the most sophisticated one - it's the one that solves your problem while being maintainable and enjoyable to use.


Wanna try it out? Check out the GitHub repository for a demo, installation instructions and documentation.

0
Subscribe to my newsletter

Read articles from Victor Miti directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Victor Miti
Victor Miti

Building things with Python, Django & Wagtail. Learning something new everyday.