jbrechtel b775fd4f3f Recipe detail page with server-side HTML rendering
- Add Roux.Html.recipePage: full recipe detail page with:
  - Back navigation link
  - Title and metadata (servings, times, difficulty, etc.)
  - Ingredients summary list with quantities
  - Sections with named headings
  - Steps with inline element rendering:
    - Ingredients highlighted in pumpkin (with quantity badge)
    - Cookware in violet italic
    - Timers in azure with ⏱ icon
    - Comments in sand italic
    - Recipe refs as links
    - Line breaks
- Update Roux.Server: route /recipes/FILENAME to recipe page
  - Case-insensitive filename lookup, .cook extension optional
  - URL decoding for filenames
- Fix ingredient name parsing: restrict name characters to
  alphaNum + spaces/hyphens/apostrophes, preventing greedy
  consumption across special chars like ) and #
- Split name chars into pMultiNameChar (with spaces, before braces)
  and pSingleNameChar (without spaces, fallback)
- Suppress -Wname-shadowing in Html.hs (blaze-html exports clash
  with common variable names)
- All 26 tests passing, server smoke-tested with examples
2026-05-19 07:12:14 -04:00
2026-05-18 22:00:30 -04:00
2026-05-18 22:00:30 -04:00
2026-05-18 21:48:59 -04:00
2026-05-18 21:48:59 -04:00
2026-05-19 07:04:22 -04:00
2026-05-18 22:00:30 -04:00
2026-05-18 22:00:30 -04:00

Roux

Roux is a personal/family recipe management site.

It's intended to be low friction for entering recipes and tracking when you've cooked them.

Cooklang

Roux uses Cooklang (https://cooklang.org/) as a source of truth for all recipe content. Any recipe either starts in Cooklang or is immediately converted to Cooklang by one mechanism or another.

Other details

Cook history

Roux lets you track when you cook recipes. I like this because we cook a lot of different recipes and I like to be able to go back to find things I liked in the past so I don't forget about them.

Technical details

Development environment

Docker is used for all development tools. Nothing is required to be installed on the local machine except Docker.

Backend API: Haskell + SQLite

Frontend: Static HTML + Pico CSS

The actual backing for recipes themselves is a single cooklang directory with an in-process search index that gets rebuilt whenever a file is added to the directory.

Project structure:

cooklang-hs

A Cooklang parser written in Haskell.

roux-server

The webserver for Roux. Parses Cooklang files on disk, indexes them, renders HTML templates for presenting recipes.

S
Description
A recipe management site
Readme 1.8 MiB
Languages
HTML 82.5%
Haskell 15.7%
Python 1%
Shell 0.4%
Cooklang 0.3%
Other 0.1%