A simple, plaintext recipe database for hackers.
Be aware my version of chowdown has diverged from the orignal name sake by quite a bit as I have changed and modifided things.
Serve the site locally with Jekyll in Docker:
docker run --rm -it -p 4000:4000 -v "$PWD:/srv/jekyll" jekyll/jekyll:4 jekyll serve --host 0.0.0.0 --livereloadThen open http://localhost:4000.
Run a one-time build test:
docker run --rm -it -v "$PWD:/srv/jekyll" jekyll/jekyll:4 jekyll buildIf you hit a permissions error like Permission denied ... /srv/jekyll/.jekyll-cache, use the Linux-safe variant:
docker run --rm -it -p 4000:4000 -v "$PWD:/srv/jekyll:Z" -u root jekyll/jekyll:4 jekyll serve --host 0.0.0.0 --livereloadAnd for build:
docker run --rm -it -v "$PWD:/srv/jekyll:Z" -u root jekyll/jekyll:4 jekyll buildThe recipes are stored in the collection "Recipes" (the folder /_recipes).
They are written in Markdown and contain a few special sections:
- The frontmatter, which contains:
- Title, Image, and Layout (which is "recipe")
- Ingredients (a list of things in the dish)
- Directions (a list of steps for the dish)
- Body content (for intros, stories, written detail)
Below is an example of most of the options you can use
---
layout: recipe
title: "Recipe Title Here"
image: image-name.jpg or https://url.tld/image.jpg # Replace with the image file or URL to one
imagecredit: URL to image credit # Optional: link to source of the image
tags: tag1 tag2 tag3 # List of tags or keywords related to the recipe
date_added: 2026-05-31 # Optional: Used by the "Recently Added" section
status: planned # Optional: Hide the recipe until it is ready to publish
reviewed: true # Optional: Marks a recipe as tested/reviewed
servings: 4 # Optional: Number of servings
prep_time: "10 mins" # Optional: Preparation time
cook_time: "30 mins" # Optional: Cooking time
total_time: "40 mins" # Optional: Total time
notes: |
Optional recipe notes shown near the top of recipe pages.
You can use multiple lines.
ingredients:
- Ingredient 1
- Ingredient 2, with quantity and preparation details if needed
- Ingredient 3, etc.
directions:
- Describe the first step here
- Continue with detailed steps
- Additional steps if needed
- Final steps
---
Optional markdown body content can go here.
If you need help with Markdown, here's a handy cheatsheet.
Add audio files to /sounds/timer/ to load them automatically in the recipe timer popup.
A component recipe is a special recipe made up of other recipes. To make a new component recipe:
- place your smaller, single recipes into the /_components folder
- make a new recipe like normal in the /_recipes folders
- in the frontmatter of this new recipe, include your recipes from the /_components folder (instead of the usual Ingredeints list)
If you want to backfill date_added in existing recipes, use:
python3 scripts/set_date_added_from_mtime.pyBy default this prefers git history (first commit date per file) and falls back to mtime when needed.
This runs a dry run and includes a safety stop if every derived date resolves to today.
To apply updates:
python3 scripts/set_date_added_from_mtime.py --writeIf you really expect all mtimes to be today, override the safety check:
python3 scripts/set_date_added_from_mtime.py --write --allow-all-todayOptional source controls:
# Force git-only attempt (falls back to mtime if file has no git history)
python3 scripts/set_date_added_from_mtime.py --source git
# Force filesystem modified time
python3 scripts/set_date_added_from_mtime.py --source mtime