Victuals: Turning Old Cookbooks into a Daily Puzzle

2026-07-22 Wed 11:43 article clojure publish ui

Intro

I watch quite a lot of Northernlion playing the various daily -dles, and thought it would be fun to make one myself.

I decided to base it on recipes I could freely reuse. I wanted a mix of familiar and out-of-date ingredients to keep the puzzles balanced. Old public-domain cookbooks gave me plenty to work with: Oyster Cream, Scripture Cake, Parsnips Fried to Look Like Trout, Cupid Hedge-Hog's and A Calf's-Foot Pudding.

That became Victuals, a daily puzzle where you fill in the missing ingredients in an old recipe.

The Game

  • Each day has one recipe with its name hidden.
  • Between four and eight ingredients are removed from the method.
  • Repeated ingredients share a coloured underline.
  • A correct guess fills every occurrence.
  • There is no game-over state.

The recipe is the main clue:

Recipe Example

Take two ______; when the ______ be clean'd, boil them as for eating, draw out every bone...

The answer can be cleaned, boiled, boned and chopped. That narrows things down, although perhaps not in the most pleasant direction.

The pantry contains 279 accepted terms, including plurals, spelling variants and older names. Some broad guesses cover obvious forms:

  • egg covers yolk and white
  • lemon covers juice and peel
  • bread covers crumbs and stale bread

Making somebody guess lemon juice after they have already worked out lemon didn't add much.

Wrong Answers

A fixed number of lives felt unfair when an answer might be isinglass, coloured comfits or calf's foot. Every wrong guess spends a clue instead.

A miss does a few things:

  • marks the guess warm, tepid or cold based on its pantry family
  • adds a short note from Cook
  • unlocks an illustrated dinner-gossip card
  • moves a more useful pantry shelf to the front

A guess of cod when lobster is missing might prompt Cook to mention that the wanted catch has a shell and claws rather than fins.

The gossip becomes more useful with each miss. For A Calf's-Foot Pudding:

20260722-victuals-dinner-gossip.jpg

The deck starts with table talk, then adds cards about the bones being removed, dried fruit entering the kitchen, and the whole thing being tied in cloth and boiled.

  • After three misses, the decade and region are shown.
  • After six, the curator can reveal an ingredient.
  • The player can keep going for as long as needed.

Pantry Help

Autocomplete is useful when you have started typing, but not when you have no word in mind. The pantry browser shows only shelves which still contain a missing answer, so using it is quite a large hint.

Pantry finds are recorded separately from typed guesses and curator reveals:

Shared Result
Victuals No. 31
๐ŸŸฉ๐ŸŸฉ๐ŸŸฉ๐ŸŸฉ๐ŸŸฉ๐ŸŸฆ๐ŸŸฆ๐ŸŸจ
5 straight finds ยท 2 pantry finds ยท 1 curator reveal
4 clues used
Verdict: YUM

Can you uncover the lost recipe?
https://victuals.exe.xyz/recipes/2026-07-22

I originally counted everything found without a curator reveal as unassisted, but that made the pantry feel slightly dishonest.

The Look and Gossip

The UI sits somewhere between a newspaper, an old cookbook and a museum card. It uses warm paper colours, double rules and engraving-style images, but keeps the main type fairly plain. The recipe text is already unfamiliar enough.

Finishing reveals:

  • the dish's name and historical context
  • the original cookbook and page
  • image credits and source links
  • a modern food-safety note
  • ingredient, process and finished-dish etchings

The recurring gossip cast has a character guide covering jobs, speech habits and what each person can plausibly know. Servants see kitchen work, guests hear rumours, and the vicar moralises. This helped avoid six variations on a generic Victorian lady finding a suspicious parcel.

Content checks also make sure no card accidentally includes an accepted answer or alias.

Content and Code

I used LLMs for some content generation, but kept them away from the game rules.

The puzzle-building script takes a recipe transcription and prepares a reviewable package containing:

  • the masked method and historical context
  • six gossip scenes
  • pantry additions
  • prompts for the recipe illustrations

The result is checked for missing answers, accidental spoilers, unprofiled speakers and incomplete source credits.

Runtime Boundary

There is also an optional runtime model call for Cook's response to a wrong guess. It has a deterministic fallback and short timeout. The model does not:

  • decide whether a guess is correct
  • update the score
  • control the hint progression

The stack is deliberately small: server-rendered Clojure and Hiccup, Datastar for fragment updates, a little ClojureScript for browser interactions, and SQLite for votes. Progress lives in a signed cookie, so there are no accounts.

The main thing I like is that getting something wrong opens more of the game: another complaint from Cook, another bit of gossip, and a better idea of what happened in the kitchen.