Skip to content

Multipixelone/resume

Repository files navigation

resume

Build Version License Pages Typst Nix

I maintain several versions of my resume for different kinds of work: acting, tech, childcare, food service, etc. This system lets me keep all the content in one place and generate tailored PDFs from it. It's built with Typst for typesetting and Nix flakes for reproducible builds, and it deploys to GitHub Pages on every versioned release.

Variants

Each variant is a thin entry file that merges base metadata with job-specific overrides, picks which content modules to include, and renders through a shared Typst layout. I only override what needs to change based on the job description: email address, header tagline, which personal details to show or hide, layout tweaks.

Variant File Purpose
Acting CV resumes/cv.typ Theatre and performance
Tech resumes/tech.typ Technology and IT positions
Work resumes/work.typ Events and operations
Nanny resumes/nanny.typ Childcare
Salt & Straw resumes/saltandstraw.typ Scooper
Salt & Straw SC resumes/saltandstraw-sc.typ Shift coordinator
Cover Letter resumes/cover-letter.typ General cover letter
Rep Sheet resumes/rep-sheet.typ Musical theatre repertory
Title Pages resumes/title-pages.typ Audition title pages

How It Works

The variant registry in variants.toml is the single source of truth β€” the Nix build, CI matrix, and quality checks all read from it. Every variant follows the same pattern:

resumes/<variant>.typ
  β†’ meta.typ: merge metadata/metadata.toml + metadata/<variant>-metadata.toml
  β†’ select modules from modules/
  β†’ render via src/lib.typ::cv()

All resume content (job history, skills, theatre credits, training) lives in TOML files under metadata/. Modules in modules/ load that data and format it into sections. The layout engine in src/ handles page structure, styling, and typography.

Building

Requires a Nix environment with flakes enabled.

nix build '.#resume'      # all resume PDFs
nix build '.#finn-rutis'  # composite headshot PDF
nix build '.#website'     # portfolio site

For local iteration without a full Nix build:

nix develop                  # enter dev shell (typst, typstyle, tinymist, etc.)
typst watch resumes/cv.typ   # live preview
typst compile --input commit="dev" --input version="2026-04-22" resumes/tech.typ

Adding a Variant

  1. Create a metadata override in metadata/<variant>-metadata.toml. Only include fields that differ from the base metadata/metadata.toml β€” everything else is inherited.

  2. Create an entry file at resumes/<variant>.typ that imports the override, selects which modules to include, and passes the merged metadata to the shared layout.

  3. Create new modules in modules/ if the job needs a section that doesn't already exist.

  4. Register the variant in variants.toml with the source filename, output name, expected page count, and whether metadata should be validated.

CI/CD and Quality Checks

Builds run on every push. Deployments to GitHub Pages happen only when VERSION changes on main. I use just bump <patch|minor|major> to trigger releases, and git-cliff generates changelogs from conventional commits.

The Nix flake runs these checks automatically:

  • typstyle β€” consistent Typst formatting
  • TOML validity β€” all metadata files parse correctly
  • Metadata completeness β€” merged metadata has all required fields
  • Output files β€” every registered variant produces a PDF
  • PDF page count β€” each variant matches its expected page count
Project structure
resumes/          # entry files per variant
src/              # layout templates and utilities
  β”œβ”€β”€ lib.typ     #   main layout (cv, coverLetter)
  β”œβ”€β”€ cv.typ      #   section/entry components
  β”œβ”€β”€ meta.typ    #   metadata merging
  └── utils/      #   styles, dict merge, language detection
modules/          # reusable resume sections
metadata/         # base + override TOML data files
packages/         # Nix derivations (resume, finn-rutis, website)
.github/          # CI workflows
variants.toml     # variant registry (single source of truth)

Commit Conventions

I use conventional commits so git-cliff can parse them:

feat(content): add new theatre credit
fix(reformat): tighten section spacing
refactor(template): simplify module loading

Scopes: content for resume text, reformat for layout changes, template for structural updates.

About

resume and website builder in nix

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors