From bd540e506fb8d570ca1aa5b9d2eaf6e65fe004c0 Mon Sep 17 00:00:00 2001 From: Josh Rogers Date: Thu, 14 May 2026 20:03:59 -0500 Subject: [PATCH] Backlog: structured multi-step recipe instructions Co-Authored-By: Claude Opus 4.7 (1M context) --- BACKLOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/BACKLOG.md b/BACKLOG.md index e220cde..770b503 100644 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -177,6 +177,23 @@ This is the "per-store ingredient memory" item above, stated from the user's per **Scope note:** the section pre-fill should be scoped to the family's own memory (`ProductStoreSection` rows they've created), not a global default — different families organize differently. +## Recipes + +### Structured multi-step instructions +Replace the single free-form instructions textarea with an ordered list of discrete steps, each in its own text box. + +**UX:** steps are numbered automatically. Users can add a step, remove a step, and reorder steps (drag or up/down arrows). Each step is a short textarea (2–3 rows) rather than a single-line input, to accommodate steps with sub-detail. + +**Data model:** a new `RecipeStep` entity — `(Id, RecipeId, SortOrder, Text)` — replaces the `Recipe.Instructions` string. Migration: split existing `Instructions` on double-newline (or numbered-list pattern) into individual rows; anything that doesn't parse cleanly lands as a single step. + +**API:** `Recipe` GET returns `steps: [{ id, sortOrder, text }]` instead of `instructions: string`. POST/PUT accept the same shape. The old `Instructions` column can be kept nullable for backward compatibility during the migration window, then dropped. + +**Backward compatibility:** the recipe detail view currently renders `instructions` as `whitespace-pre-wrap`. Switch it to a numbered `
    ` once steps are in place; the edit page replaces the textarea with the step list. + +**Open questions:** +- Keep `Instructions` as a migration fallback column, or do a single-step cutover migration? +- Should steps support rich text (bold ingredient names, timers) or stay plain text for v1? + ## Lists ### Block create-list flow when no stores exist