---
date: 2026-08-08
topic: family-dinner-planner
---

# Family Dinner Planner — Requirements

## Summary

A self-hosted Tandoor instance the family uses from their phones, plus a small Sunday planning agent that proposes five weeknight dinners against the household's real constraints, writes them into Tandoor, and produces an aisle-ordered grocery list for H-E-B or Randall's. Each boy owns one cooking night per week. The system tracks one number over time: how much of dinner is fresh rather than frozen.

---

## Problem Frame

Dinner currently gets decided at 5pm, when everyone is hungry and no one wants to think. The decision defaults to whatever the freezer offers: a bag of frozen vegetables steamed, a frozen breaded protein in the air fryer, and a rice dish. It reaches the table, but the deciding is the expensive part and it recurs every single evening.

Nothing has been tried before this — there is no abandoned app or whiteboard to learn from. The workaround is improvisation at the fridge door, and the one heuristic in play is "don't repeat the vegetable we just ate."

Two forces shape what a fix must respect. First, frozen food is not the enemy; it is the reliable fallback that makes a tired Wednesday survivable. The goal is to raise the fresh share gradually, not to eliminate frozen. Second, the two boys (9 and 11) want to cook and want to be useful, which is unused labor and unused enthusiasm.

The cost of the status quo is not a bad dinner. It is a nightly decision tax and a menu that drifts toward the freezer because that is the path of least resistance at the worst hour of the day.

---

## Key Decisions

**Reuse Tandoor; build only the planner.** Tandoor already provides recipe storage, meal plans, shopping-list generation, per-supermarket aisle ordering, ratings, cook tracking, and a family-facing web UI. The one thing it does not do is propose a plan against this household's constraints or measure the fresh ratchet. That is the named reason for writing any code at all, and the planning agent is the only component we maintain.

**Tandoor over Mealie.** Mealie orders shopping-list labels globally; per-store ordering is an open feature request. Tandoor supports per-supermarket category ordering natively. Because H-E-B and Randall's have different layouts and aisle order is the headline benefit, this difference decides the choice.

**Frozen nights are scheduled, not tolerated.** Two of five dinners are designated low-effort nights built around freezer staples, the steamer, and the air fryer. Planning them is what makes the other three fresh nights happen, and it means a tired Wednesday follows the plan instead of abandoning it. The planner picks which two nights each week rather than fixing them to weekdays, so the easy nights can land where the week needs them and the boys' nights can sit sensibly alongside.

**The ratchet starts low and stops short of the whole week.** The fresh-component target begins at 3 of 10 and its ceiling is 6, so a permanent share of the week stays frozen by design. A gentle start raises the odds that early weeks are wins, which is what keeps the loop running long enough to climb.

**The plan drives the weekly store trip; Costco is a standing list.** A five-day dinner plan cannot generate the biweekly Costco run, which is mostly pet food, bulk protein, frozen vegetable bags, staples, and individually packed kid snacks. Costco is modeled as a recurring staples list, not a derived one.

**Nightly one-tap logging over a Sunday batch review.** Higher fidelity was chosen over lower friction. This makes phone ergonomics load-bearing: the entire feedback loop and the fresh-share metric depend on the tap being trivial to perform.

**Dinners are composed from a grammar, not picked from a list.** Every dinner is protein + vegetable + carbohydrate. The planner generates against that template with variety rules, which matches how the family already cooks and makes constraint checking possible.

---

## Actors

- A1. James — runs the Sunday plan, does the weekly H-E-B/Randall's trip and the biweekly Costco run.
- A2. Wife — cooks and plans interchangeably with A1; reads the plan on her phone and needs no setup knowledge.
- A3. Boys (9 and 11) — each owns one cooking night per week; can mark a dinner cooked and rate it.
- A4. Planning agent — proposes the week, writes it to Tandoor, generates the list, reports the metric.
- A5. Tandoor — system of record for recipes, plans, lists, ratings, and cook history.

---

## Requirements

**Planning**

- R1. The planner proposes five weeknight dinners, each composed of a protein, a vegetable, and a carbohydrate.
- R2. No vegetable repeats on consecutive days.
- R3. The planner designates two of the five nights as low-effort nights suitable for freezer staples cooked in the steamer or air fryer, choosing which nights each week rather than fixing them to weekdays.
- R4. The remaining three nights meet the current week's fresh-component target (see R14).
- R5. One night per week is assigned to each boy, tagged as theirs, with a recipe appropriate to that child's age and skill.
- R6. The planner favors recipes not cooked recently and avoids anything cooked in the prior two weeks unless it is a rated favorite.
- R7. Every recipe carries a preparation-effort signal so the planner can distinguish a low-effort night from a fresh-cooking night.
- R8. A proposed plan is reviewable and editable by A1 or A2 before it becomes the week's plan.

**Shopping**

- R9. Confirming a plan generates a grocery list for the weekly store trip, deduplicated and quantity-aggregated across the five dinners.
- R10. The weekly list is grouped and ordered by aisle for the specific store being shopped, with H-E-B and Randall's each having their own order.
- R11. A separate standing Costco list persists across weeks and holds recurring bulk items rather than plan-derived ingredients.
- R12. Both lists are usable from a phone in the store, with items checkable as they go in the cart.

**Feedback and measurement**

- R13. Each dinner can be marked cooked, swapped, or skipped in one tap from a phone, and rated.
- R14. The system tracks a weekly fresh-component share and compares it to the current target. Each dinner contributes two tracked components, protein and vegetable, so a five-dinner week has ten. The target starts at 3 and its ceiling is 6.
- R15. The target ratchets up by one fresh component only when at least four of the previous week's five dinners were cooked as planned; it ratchets back down one after two consecutive weeks below that.
- R16. A weekly summary reports the fresh share, adherence, and the target for the coming week via push notification.
- R17. Ratings and cook history feed the next week's proposal, so the library improves with use.

**Access**

- R18. The family reaches Tandoor from their phones without a VPN app dance or a login prompt on every visit.
- R19. The recipe library is seeded with enough recipes fitting the household's grammar that week one has real variety rather than a cold start.

---

## Key Flows

- F1. Sunday planning
  - **Trigger:** A1 or A2 starts the week's plan (or the agent runs on a schedule).
  - **Actors:** A1, A2, A4, A5
  - **Steps:** The agent reads recipes, ratings, and recent cook history from Tandoor; proposes five dinners honoring R1–R7; presents the proposal for review; on confirmation writes the plan into Tandoor and generates the aisle-ordered weekly list.
  - **Outcome:** A visible five-day plan and a store-ready list before the week starts.
  - **Covered by:** R1–R10, R19

- F2. Weeknight execution
  - **Trigger:** It is dinner time on a planned night.
  - **Actors:** A2, A3
  - **Steps:** Whoever is cooking opens the plan on a phone and sees tonight's dinner, its effort level, and whether it is a boy's night; cooks it, swaps it, or skips it; taps the result and optionally rates it.
  - **Outcome:** The decision was already made, and what actually happened is recorded.
  - **Covered by:** R5, R12, R13, R18

- F3. Weekly measurement and ratchet
  - **Trigger:** End of the week, before the next plan.
  - **Actors:** A4
  - **Steps:** The agent computes the fresh-component share and adherence from logged outcomes, adjusts next week's target per R15, and pushes the summary.
  - **Outcome:** The next plan is generated against a target grounded in what the family actually did.
  - **Covered by:** R14–R17

- F4. Shopping
  - **Trigger:** The weekly store trip, or the biweekly Costco run.
  - **Actors:** A1
  - **Steps:** Open the relevant list on a phone; walk the store in aisle order for the weekly trip, or work the standing list at Costco; check items off.
  - **Outcome:** One pass through the store without backtracking or forgotten items.
  - **Covered by:** R9–R12

```mermaid
flowchart TB
  H[Cook history, ratings in Tandoor] --> P[Sunday planner proposes 5 dinners]
  T[Current fresh target] --> P
  P --> R[Review and confirm]
  R --> W[Week plan in Tandoor]
  R --> L[Aisle-ordered store list]
  W --> N[Nightly one-tap outcome]
  N --> M[Fresh share + adherence]
  M --> T
  N --> H
```

---

## Agentic Version

**Objective metric:** weekly fresh-component share — the fraction of protein and vegetable components across the week's *cooked* dinners that were fresh rather than frozen — with plan adherence (dinners cooked as planned out of five) as the guard metric.

**Measurement mechanism:** derived from the nightly one-tap outcomes plus each recipe's component tags in Tandoor. A skipped night contributes to adherence, not to fresh share.

**Action space:** which recipes are proposed, which nights are designated low-effort, how aggressively the fresh target moves, which recipes get retired for staleness, and what enters the standing Costco list.

**Stopping condition:** the ceiling of 6 fresh components out of 10. The ratchet stops climbing once reached, and stops early if adherence cannot hold at the current target.

**Rollback / guardrail:** the adherence floor is four of five dinners cooked as planned. Two consecutive weeks below it ratchets the fresh target back down one component and restores an extra low-effort night. A plan is never written without human confirmation in the first tiers.

**Tier 1 — simple automation.** A scheduled job proposes the week from the recipe library using the grammar and variety rules, writes it after confirmation, and generates the list. The fresh target is set by hand. Metric is reported but not acted on.

**Tier 2 — semi-agentic.** The agent owns the ratchet: it reads the logged outcomes, moves the target per the guardrail, chooses the low-effort nights and the boys' assignments, and proposes recipes to retire or add. Plans still require a human confirm, and the weekly summary explains what it changed and why.

**Tier 3 — fully agentic.** The agent plans without confirmation, sources and imports new recipes to fill gaps the library cannot cover, tunes the variety and effort rules against adherence, maintains the standing Costco list from consumption patterns, and escalates to a human only when the guardrail trips or a proposal falls outside learned family preferences.

---

## Success Criteria

- Zero 5pm improvisation nights in a normal week: the plan exists before Monday and is visible on a phone.
- The fresh-component share is measurably higher after eight weeks than in week one, without adherence degrading.
- The nightly tap is still happening in week four. If it is not, the feedback design failed and should fall back to a Sunday batch review.
- One pass through H-E-B or Randall's, with no backtracking and nothing forgotten.
- Each boy has cooked his night at least three times in the first month.
- The only code we maintain is the planning agent. If that stops earning its keep, deleting it leaves a working Tandoor behind.

---

## Acceptance Examples

- AE1. **Covers R2, R3.** Given Monday's dinner used broccoli, when the planner proposes Tuesday, then Tuesday's vegetable is not broccoli, and if Tuesday is a designated low-effort night the vegetable may still be a frozen bag.
- AE2. **Covers R13, R14.** Given a fresh-chicken dinner was planned for Wednesday but the family reached for frozen instead, when Wednesday is logged as swapped, then the week's fresh share counts the frozen components actually cooked, not the planned fresh ones.
- AE3. **Covers R15.** Given last week's adherence was three of five against a target of four fresh components, when the ratchet evaluates, then the target does not rise.
- AE4. **Covers R5, R3.** Given the 9-year-old's night falls on a designated low-effort night, when the plan is generated, then his recipe is an air-fryer or steamer dish he can run mostly himself.
- AE5. **Covers R9, R10.** Given two of the week's dinners both call for rice, when the weekly list is generated, then rice appears once with the combined quantity, positioned in the aisle order for the store being shopped.
- AE6. **Covers R11.** Given the Costco run happens in a week with no plan change, when the Costco list is opened, then it still holds the recurring staples and has not been emptied or regenerated from the dinner plan.

---

## Scope Boundaries

**Deferred for later**

- Integration with any grocery ordering, curbside, or delivery service.
- Pantry and freezer inventory tracking. The plan drives shopping rather than reacting to what is on hand.
- Breakfasts, lunches, and kid lunch-box planning, beyond snacks appearing on the Costco staples list.
- Cost and budget tracking per meal.
- Nutrition and macro targets beyond the fresh-versus-frozen signal.

**Outside this product's identity**

- A recipe website or anything published outside the household.
- A native mobile app. The family-facing surface is Tandoor's web UI on a phone.
- A general-purpose diet or fitness tracker. The only thing measured is the fresh ratchet and whether the plan held.

---

## Dependencies / Assumptions

- Tandoor runs self-hosted in Docker on ARM64 hardware, reachable from family phones over the existing Tailscale setup.
- Tandoor exposes an API sufficient for reading recipes, ratings, and cook history and for writing meal plans and shopping lists. Unverified — confirm when the instance is standing.
- Tandoor's cook tracking and rating features support the nightly tap and the "not cooked recently" rule. Reported by third-party comparisons rather than official docs; verify on standup.
- Plan generation runs on the local model, so proposing a week costs watts rather than tokens.
- The recipe library must be seeded before week one; an empty Tandoor produces no useful plan.
- Assumed that both A1 and A2 will read the plan on a phone rather than wanting it printed. If a paper copy on the fridge turns out to matter, that is a small addition.

---

## Outstanding Questions

**Deferred to planning**

- Whether the planner runs on a schedule or is invoked manually on Sundays.
- Whether the planner should read a calendar to inform which nights become the low-effort ones, or infer from the week's shape alone.
- How recipes get tagged with effort level and fresh-versus-frozen components — imported, hand-tagged once, or inferred.
- Whether the boys share the family account or get their own, which affects whose rating is whose.
- How the standing Costco list gets maintained as consumption changes.

---

## Sources / Research

- [Tandoor shopping documentation](https://docs.tandoor.dev/features/shopping/) — per-supermarket categories with configurable order; uncategorized foods are assigned once and remembered.
- [Mealie aisle-sorting discussion](https://github.com/mealie-recipes/mealie/discussions/2680) — label order is global; per-list ordering is an open request. Basis for choosing Tandoor.
- [Mealie AI providers](https://docs.mealie.io/documentation/getting-started/installation/ai-providers/) — OpenAI-compatible AI hooks, for reference if the tooling choice is revisited.
- [Tandoor vs Mealie vs KitchenOwl comparison](https://cooklang.org/blog/42-tandoor-vs-mealie-vs-kitchenowl/) — source for Tandoor's cook tracking and rut detection; secondary, verify on standup.
- [Mealie MCP server](https://mcpmarket.com/server/mealie) — evidence that agent-driven planning against a recipe manager is an established pattern.
