Introduces scripts/pipeline/, a Mix project that runs as a post-export transformation pass over content/*.md before Quartz builds the site. Pipeline (scripts/export.exs phase 3): - Compiles and loads the Mix project at export time (cached after first run) - Applies a list of Transform modules sequentially over all .md files - Only rewrites files that were actually changed Citations transform (Pipeline.Transforms.Citations): - Resolves [cite:@key] and bare cite:key syntax produced by ox-hugo/citar - Resolution chain: Zotero BBT JSON-RPC → BibTeX file → DOI/bare-key fallback - Zotero probe uses a no-op JSON-RPC call (cayw endpoint blocks indefinitely) - Zotero resolver fetches PDF attachments via item.attachments, producing zotero://open-pdf/... links; falls back to zotero://select/library/items/... - BibTeX resolver parses .bib files with a simple regex parser (no deps) - DOI resolver is the always-succeeding last resort Configuration via env vars: BIBTEX_FILE — path to .bib file for fallback resolution ZOTERO_URL — Zotero base URL (default: http://localhost:23119) CITATION_MODE — silent | warn (default) | strict Adding future transforms requires only implementing Pipeline.Transform behaviour and appending the module to the transforms list in export.exs.
Quartz v4 — org-roam edition
"[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important." — Richard Hamming
Quartz is a set of tools that helps you publish your digital garden and notes as a website for free.
This fork adds first-class support for org-roam notes via ox-hugo.
🔗 Upstream documentation: https://quartz.jzhao.xyz/
Quick Start
Prerequisites
This project uses Nix. Enter the development shell, which provides Node.js 22, Elixir, and Emacs with ox-hugo:
nix develop
All commands below must be run inside this shell.
npm install
Building from org-roam notes
Your org-roam notes live in a separate directory. Point NOTES_DIR at it:
# Export notes to content/ and build the site
NOTES_DIR=/path/to/notes npm run build:notes
# Export, build, and serve with hot reload
NOTES_DIR=/path/to/notes npm run serve:notes
# Export only (wipes content/ and re-exports all .org files)
NOTES_DIR=/path/to/notes npm run export
The export script mirrors the subdirectory structure of your notes into content/
and generates a fallback index.md if your notes don't include one.
Building without org-roam notes
If you manage content/ directly with Markdown files:
# Build the site
npx quartz build
# Build and serve with hot reload
npx quartz build --serve
The site is generated in public/. When serving, visit http://localhost:8080.
Development
npm run check # type check + format check
npm run format # auto-format with Prettier
npm run test # run tests