github cooklang/cookcli v0.39.0

3 hours ago

0.39.0 (2026-10-24)

⚠ BREAKING CHANGES

  • release: the release archives are renamed to cook---[-]. cook update in 0.38 and older looks for cook-<triple> and reports "No asset found": install 0.39.0 by hand from the releases page once, and cook update works again.

Features

  • a menu can use another menu as one of its meals (#609) (d99192b)
  • format: show exact fractions the same way in every output (#677) (c0f69f6)
  • pantry: list items as rows, like the aisle page (#653) (ee335c3)
  • pantry: new sections from Add item, rename sections, edit pantry.conf as text (#629) (2a2ed08)
  • publish a JSON Feed at feed.json next to the Atom and RSS feeds (#679) (d22424c)
  • release: version the binary archives and name them by platform (#650) (4cede71)
  • server: --proxy-strips-prefix for proxies that remove --url-prefix (#773) (5c63947), closes #772
  • shopping-list: --from / --to for some days of a menu (#612) (6e22411)
  • ui: open sub-recipes and shopping list recipes at their scale (#686) (7c2f48b)
  • web: ask before leaving a page with unsaved changes (#674) (845a8f2), closes #519
  • web: choose optional ingredients for the shopping list (d3e96bd)
  • web: choose optional ingredients for the shopping list (d61c42f)

Bug Fixes

  • build: advertise the web feeds on static pages built with --feed (#676) (94c27e5), closes #595
  • ci: build the Linux glibc binary in manylinux_2_28 (#662) (aea109c)
  • ci: give each release target its own Rust cache (#657) (459a0e9)
  • cli: resolve config from -b for every command (#734) (5074ec5)
  • collapse runs of spaces in names typed for new files (#768) (831d186)
  • completions: exit cleanly when the output pipe closes (4c42a15)
  • completions: exit cleanly when the output pipe closes (#708) (aedc970)
  • core: drop the spurious servings warning on >> metadata (#713) (#743) (8442b2b)
  • doctor: warn once on a unit-less textual timer (#745) (3a4cb02)
  • editor: close [- -] comments mid-line, highlight quantities (#663) (3506f6a)
  • editor: highlight nameless timers, mid-line comments and escapes like the parser (#667) (2700d3d)
  • format: don't split hyphenated words when wrapping cooklang (#700) (#735) (41e5ad9)
  • format: escape a literal backslash as \textbackslash{} in LaTeX (#744) (4448e2b)
  • format: escape for typst string literals, not markup (#739) (b0e62ff)
  • format: escape user text in markdown output (#746) (ad1cbb3)
  • format: keep multiline metadata inside document comments (#740) (218a5b2)
  • format: re-emit the = scaling lock in cooklang source (#737) (6191ef7)
  • format: read schema.org durations through cooklang's parser (#705) (#741) (6262693)
  • format: write exact quantities in cooklang source (#701) (#736) (a09f41d)
  • import: escape the scraped title in YAML frontmatter (#730) (892ef64)
  • logout: remove a corrupt session file instead of keeping it (#716) (#727) (f53a4dd)
  • pantry: quote the item name in load warnings, log them once on the server (#776) (a268a71)
  • pantry: refuse add collisions with a different kind of entry (#748) (b3d738d)
  • pantry: refuse quantities and dates the file cannot read back (#753) (cc795bd)
  • parser: strip a UTF-8 BOM before parsing recipes (#742) (c93fd51)
  • point out aisle.conf lines written like a # or -- comment (#688) (1c495d2), closes #687
  • refuse scales and quantities that cannot round-trip (#722) (#755) (7366e50)
  • seed: fail on per-file write errors instead of exiting 0 (#707) (#725) (2edb7e8)
  • seed: report create_dir_all failure instead of panicking (#706) (#724) (32bac24)
  • server: hold recipe_image to the recipe-extension rule (#750) (5822cf8)
  • server: keep pantry edits inside /api/pantry (#666) (ad7c9a9)
  • server: keep recipe references inside the collection (#749) (42bcbe2)
  • server: keep requests inside the collection once links resolve (#751) (7ad607f)
  • server: keep the server's paths out of what it sends (#670) (7341a28)
  • server: say on the shopping list when the pantry file could not be used (#691) (73b35fc)
  • server: say why a change was refused after signing out (#683) (c18ae1a), closes #675
  • server: serve only recipes and pictures from the recipe folder (#668) (0b24597), closes #658
  • shopping-list: error clearly on a directory without recipes (#723) (#732) (5e4e822)
  • shopping-list: list a reference that cannot be scaled instead of failing (#684) (538a85b)
  • shopping-list: merge case variants into one item (#694) (#747) (ab74ace)
  • shopping-list: refuse -o that would overwrite an input recipe (#731) (9f2aa15)
  • shopping-list: refuse scaling a recipe that makes nothing (#752) (91cd1e4)
  • shopping-list: scale a reference to half servings without rounding (#681) (4abe520), closes #680
  • update: compare versions semantically, not as strings (#729) (94d7162)
  • update: error cleanly on an unlisted arch or OS (#720) (#728) (ea1abf4)

Don't miss a new cookcli release

NewReleases is sending notifications on new releases.