v2.0.0 — plans, not weeks
Caution
Do not upgrade an existing install to this version — its migration deletes your meals and grocery items. Use v2.0.1 instead, which fixes the migration. Fresh installs are unaffected.
Meal plans are no longer chained to the calendar. A plan used to be "a week", and every meal a weekday slot — now a plan is whatever you're actually planning: a full week of dinners, a weekend of brunches, breakfast-lunch-dinner-snacks, or one big Sunday cook.
Highlights
- Plans of any size. A meal plan holds 1+ meals, each typed breakfast, lunch, dinner, or snack. The plan view groups meals under those headings instead of weekdays.
- A plan lifecycle. Plans move through upcoming → active → completed, with exactly one active plan at a time (enforced right down to the database). Push a plan while another is active and it queues as upcoming; promote it when you're ready; complete it when you've cooked through it.
- New Plans section in the app. The old "This Week" tab is now Plans with four sub-tabs — Active, Upcoming, Completed, and Favorites. Upcoming and completed plans show as cards listing their recipes; tapping one opens a full plan view with activate/complete actions.
- Named + favorite plans. Rename plans inline ("Meal Plan 3" until you do), and star the keepers — a plan needs a name before it can be favorited. Your assistant can recall favorite plans and rebuild them on request.
- Meal-typed recipes. Recipes carry meal types too — set explicitly or learned automatically from how they get planned. The recipe list gained meal-type filter chips, and search by type works over MCP.
- Grocery list follows the active plan. Same derived, section-grouped, check-off-preserving list — now tied to whatever plan you're cooking from rather than "this week".
MCP changes
The tool surface grew from 7 to 10 tools: push_meal_plan (now takes name, optional planId to revise, and typed meals — no more weekStart/dayOfWeek), list_meal_plans (filter by status or favorites), get_meal_plan, get_active_meal_plan, activate_meal_plan, complete_meal_plan, plus the existing recipe tools. The wire layer still tolerates small-model quirks (string numbers, "1/2", double-wrapped arrays) and now canonicalizes meal types ("Dinner", "SNACKS" → dinner, snack).
The agent skill was rewritten for the new model and moved: skills/weekly-meal-planning/ → skills/meal-planning/.
Breaking changes
push_meal_planarguments changed:{planId?, name?, meals: [{mealType, recipeId | recipe}]}—weekStartanddayOfWeekare gone. Revising a plan now means passing itsplanIdinstead of re-pushing the same week.get_recent_meal_plansandget_meal_plan_for_weekwere replaced bylist_meal_plansandget_meal_plan.- tRPC:
plans.byWeek/plans.currentwere replaced byplans.byId/plans.active(+activate,complete,rename,toggleFavoritemutations);get_recipereturnsusedInPlansinstead ofusedInWeeks.
Upgrading
- Back up
./data/(it's one SQLite file — copy the folder). docker compose pull && docker compose up -d— the database migrates automatically on boot. Existing weeks become plans named "Week of {date}": past weeks land in Completed, the current week becomes Active, future weeks become Upcoming. Weekday order is preserved as meal order and recipe meal types are backfilled from history.- Re-copy the agent skill from
skills/meal-planning/(the old path is gone), and refresh/reconnect the MCP server in your chat client so it picks up the new tool list. - Optionally verify with
scripts/verify-mcp.sh http://<host>:8090— it now pushes a test plan and marks it completed, so it never touches your active plan.