This is a collection of recipes we use on a regular basis, and will hopefully be used to produce a family cookbook, if I keep my act together this year. TLDR, if you're just here for recipes, you can find them in the recipes folder.
- RecipeMD: for the excellent markdown recipe format, and a few nice tools.
- Cookie: for quickly creating a new recipe
- Pandoc: for converting recipes into PDF, EPUB, HTML, and DOCX files
- poppler-utils: for its handy
pdfunitetool to assemble the cover, content, and grocery list into the final PDF - Scribus: for typesetting the cover page (static
.slasource, exported asCoverpage.pdf) - XeLaTeX: PDF generation engine via Pandoc; also used to render the versioned cover at build time
- Wikiti Pandoc Book Template
This project includes a Devbox configuration, to help you get a development environment going.
Steps to get the cookbook running on your local machine, with Devbox
- Make sure Devbox is installed
devbox shelldownloads requirements and launches a devbox development environment- skip down to the "how to use" section for commands you can run
NOTE: The first time you run devbox shell may take a while to complete due to
Devbox downloading prerequisites and package catalogs required by Nix. This
delay is a one-time cost, and future invocations and package additions should
resolve much faster.
The Makefile is based on the Wikiti Pandoc Book Template, with significant customization for this project.
| Target | Description |
|---|---|
make pdf |
Build cookbook.pdf — the main content PDF (no cover). Easiest for navigating by page number. |
make epub |
Build cookbook.epub with cross-chapter link resolution and page-reference stripping. |
make html |
Build cookbook.html (single-page HTML, page refs stripped). |
make docx |
Build cookbook.docx for Word. |
make final |
Assemble the full print-ready PDF: versioned cover + content + grocery list → RodmanPottingerFamilyCookbook.pdf. |
make release |
Auto-bump semver version from latest git tag, build all formats, create a git tag, and publish a GitHub release with artifacts. |
make check |
Validate all RecipeMD files and check horizontal-rule formatting. |
make stats |
Show cookbook statistics (recipe count, word count, PDF pages, git info). |
make clean |
Remove the build/ directory. |
Versions follow semver. The current version is set in VERSION in the Makefile, or derived from git tags when running make release. The version appears on:
- The cover page: generated at build time from
scripts/generate-cover.tex, showing the version and build date (e.g.3.0.0 — 2026-06-09) - The title page: in the metadata line below the title
make release # auto-bump patch → v3.0.0, build, tag, release
make release VERSION=4.0.0 # explicit version override
Recipes can use \label{name} (on its own line, typically after the attribution) and \pageref{name} in the text to create cross-references. For example:
\label{biga}
See the [Biga starter](./Biga.md) recipe for details (see page \pageref{biga}).- PDF: rendered as native LaTeX cross-references (correct page numbers after multiple passes)
- EPUB/HTML:
\pagereftext is stripped; links to other recipe files are rewritten as HTML anchors. A post-processing step (scripts/fix-epub-links.py) resolves cross-chapter fragment links in EPUB output.
The cover is generated fresh on every make final or make release build:
- The cover image is extracted from
Coverpage.pdf(exported fromCoverpage.slain Scribus) - A LaTeX template (
scripts/generate-cover.tex) renders the image with the centered version + build date overlay pdfuniteassembles cover + content +GroceryList.pdfinto the final PDF
To update the cover design, edit Coverpage.sla in Scribus and re-export to Coverpage.pdf.
Several make targets help catch common RecipeMD errors:
| Target | Description |
|---|---|
make check |
Full RecipeMD validation + HR formatting check |
make find-missing-units |
Find ingredient quantities missing units (e.g. 1* instead of *1 T*) |
make find-repeated-words |
Find duplicate words (e.g. the the) |
make find-missing-attribution |
List recipes with tags but no Source: line |
make check-hr-formatting |
Verify blank lines around horizontal rules |
make find-adjective-titles |
Find titles starting with an adjective (alphabetization check) |
make proofread |
Run all proofreading checks at once |
For most proofreading tasks, use make proofread to run all checks at once, or
refer to the individual targets in the table above. Some raw command alternatives:
ack "[1-9]\*"— find ingredient quantities missing units (alias formake find-missing-units)ack --ignore-file ext:css "\b([a-zA-Z]+'?[a-zA-Z]+)\s+\1\b"— find repeated words likethe thegrep -Pzl '(?s)^#[^\n]*\n\n\*.*\*' recipes/*.md— list recipes missingSource:linesgrep -Pzol '(?s)(?<!\n)\n---\n(?!.*---\n)' recipes/*.md— find HRs without blank lines around them