A professional development log built as a static site. Each engagement lives as a folder containing a Typst slide deck; metadata is extracted automatically and published to GitHub Pages.
portfolio/
{year}/
{Term}/
{VENUE}/
slides.typ ← source of truth (slides + metadata)
assets/ ← images referenced in slides
engagement.json ← generated by CI (do not edit by hand)
slides.pdf ← generated by CI
- Create the folder:
mkdir -p 2026/Fall/MYCONF/assets - Copy your
slides.typin, add the metadata block (see below) - Add any images to
assets/ - Push — CI handles the rest
Add this near the top of slides.typ, after your imports:
#metadata((
title: "Your Talk Title",
event: "Conference Name and Theme",
year: "2026",
term: "Fall", // Spring | Fall
venue: "MYCONF", // short slug matching folder name
location: "City, Country",
date: "2026-09-15", // ISO 8601
collaborators: (), // ("Name One", "Name Two") or ()
tags: ("topic", "another-topic"),
blurb: "One or two sentences for the site card.",
hero: "assets/your-hero-image.png", // wide, used on leaf page
thumb: "assets/your-thumb-image.png", // square-ish, used on landing card
)) <engagement>npm install
npm start # serves at http://localhost:8080The engagement.json files are committed alongside slides.typ so you can develop the site locally without running Typst. When you push, CI regenerates them from source.
On every push to main, GitHub Actions:
- Installs Typst
- Finds every
slides.typin the tree - Runs
typst queryto writeengagement.json - Runs
typst compileto produceslides.pdf - Builds the Eleventy site
- Deploys to GitHub Pages
Enable Pages in your repo settings: Settings → Pages → Source → GitHub Actions.
- Typst — slides and metadata source
- Polylux — slide layout for Typst
- Eleventy — static site generator
- GitHub Pages — hosting