Today in Edworking News we want to talk about The Overengineered Resume with Zola, JSON Resume, Weasyprint, and Nix.
Maintaining a resume is not the most interesting use of time. Naturally, when I needed to bring my own up to date, I decided to spend a great deal more time on it and overengineer the process. I wanted a bunch of things that didn't necessarily fit together that well. Here's where I ended up. (And here's the actual output).
Building a Data-Driven Resume
I'm only aware of one standard for representing resume data: JSON Resume. I prefer using standards, although I'm disappointed there isn't a stronger ecosystem around this one. Most major HR applications don't even accept it. Instead of LaTeX, I decided to template my resume data into either Markdown or HTML and CSS and then render it as a PDF. This also gave me the flexibility to publish my resume as a webpage with a different stylesheet.
I already use the static site generator Zola to build my website. Zola's Tera template engine is quite fast and similar to Jinja2, making it very comfortable for me. The HTML-to-PDF tools are not vast, and most are eccentric in some respect. I brought back Weasyprint for this effort, having had some success with it in the past.
Here's how these components come together into a data-to-PDF pipeline:
Resume Data: Defined in a `resume.yaml` file, following the JSON Resume schema.
Template: Utilizes the Tera template language to structure the resume data into a readable format.
CSS: Styles the HTML elements.
PDF Rendering: Weasyprint converts the HTML to PDF.
The data validation via the YAML language server ensures semantic correctness. Below is the opening of my resume in YAML:
```yaml
yaml-language-server: $schema=URL_to_JSON_Resume_Schema
name: John Doe
title: Software Engineer
...
This approach automates resume rendering and provides various output formats from one source of truth.
Local Developer Experience
Tooling setup is critical for a smooth developer experience. I use NixOS instead of Docker for my local environment setup. With `nix-shell` and `direnv`, my tools become magically available whenever I enter my project directory. Here's a snippet from `shell.nix`:
```nix
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "resume-env";
buildInputs = [ pkgs.zola pkgs.weasyprint ];
}
This setup facilitates seamless command execution via a `justfile`:
```makefile
pdf: # Render the resume to PDF
weasyprint resume.html output.pdf
render: # Render and open PDF
just pdf && open output.pdf
By leveraging `yq`, the filename is dynamically generated from the resume data, ensuring an always up-to-date artifact.
Continuous Integration
Since the PDF is fundamentally a build product, I don't want it committed to source control. Enter GitHub Actions to automate this process. Here's a fragment of the workflow I added:
```yaml
name: Build Resume
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Nix
uses: cachix/install-nix-action@v12
- run: nix-shell --command "just pdf"
- uses: actions/upload-artifact@v2
with:
name: resume
path: output.pdf
This workflow ensures that the latest PDF is always ready for download from the latest commit. The same setup could support various distribution strategies, from website deployment to submodules.
The Result
While it remains "just a resume," the underlying engineering makes my developer brain happy. You can start indulging in similar technical adventures by cloning a template repository.
Remember these 3 key ideas for your startup:
Automate Repetitive Tasks: Leverage tools like Zola, Weasyprint, and continuous integration (CI) to automate labor-intensive tasks, saving valuable time.
Unified Data Sources: Use JSON or YAML schemas to maintain a single source of truth, enabling multiple output formats from the same dataset.
Flexible Environments: Utilize versatile development environments with tools like NixOS for seamless and reproducible local setups.
Edworking is the best and smartest decision for SMEs and startups to be more productive. Edworking is a FREE superapp of productivity that includes all you need for work powered by AI in the same superapp, connecting Task Management, Docs, Chat, Videocall, and File Management. Save money today by not paying for Slack, Trello, Dropbox, Zoom, and Notion.

For more details, see the original source.