Published by FR Studios

Resume Pipeline

How I Automated My Resumes with Rust and Typst.

Manually adjusting Word or LaTeX files 20 times a day is soul-crushing. General “master” resumes lead to quick rejections in a competitive market, but spending 40 minutes tailoring a resume just to be ghosted is equally exhausting.

To fix this, I built a Rust-powered pipeline that separates data from presentation. A 5-second CLI wizard generates meticulously typeset, tailored resumes. Here is a look at how it works.

1. The Data Layer (YAML)

My entire professional history, including every job title, professional summary, project, and bullet point, is stored cleanly in multiple YAML files (experience.yaml, education.yaml, profile.yaml, etc.).

Using Rust and the serde crate, the application parses this data into strongly-typed internal Rust structs on startup. This acts as the single source of truth.

2. The Interactive Selection Engine (Ratatui)

Because not every application needs to showcase the same skills, I built an interactive Terminal User Interface (TUI) using Ratatui. The application guides me through a sequence of screens where I simply hit Space to toggle exactly what data I want to include.

  • Swap between different Job Titles and Professional Summaries.
  • Toggle entire roles or drill deep into an experience block to toggle individual bullet points on or off.
  • Omit contact information (like phone number or email) by pressing e or p.

3. The Pure Typst Compilation Boundary

Creating PDFs dynamically is historically painful. I turned to Typst, a modern and blazing-fast Rust-based typesetting system. To integrate it securely, I implemented the World trait for my application context. This sandboxed environment acts as a tightly controlled bridge into the Typst compiler, embedding fonts directly and injecting a frozen timestamp for deterministic builds.

4. Bridging Rust and Typst Parameters

Instead of injecting data by generating temporary JSON files, I bypass the filesystem altogether. Using derive_typst_intoval, I recursively serialize my filtered Rust structs into Typst Dict objects.

Inside the Typst layout template, traversing this data is simple:

#import sys: inputs
#let resume_data = inputs

#for job in resume_data.experience [
  #work_item(job.role, job.company, job.date)
  #for point in job.bullets [ - #point ]
]

The Result

The result is a fast, robust, and highly opinionated resume generator. With no dependencies beyond a single Rust binary, I can move through a five-second wizard and have a meticulously typeset PDF ready instantly. No AI hallucinations, no broken formatting, and no wasted time.

Try it yourself on GitHub →