Meal Planner
Audience: User, Org Admin, Developer, Support Related: Shopping Lists · Kitchen Inventory · Assigning And Scheduling · Email
Meal Planner supports organization-scoped week and month planning, configurable week start, meal slots, optional slot times, multiple recipes or manual items in a slot, recipe multipliers, moves, review, PDF/email output, shopping-list generation, and Day/Week/Month display rendering. Mobile provides a focused week workflow.
Meal Planner reuses Recipe Library, Shopping Lists, Kitchen Inventory, Displays, and Shop With rather than duplicating those systems.
Meal Planner is an organization-scoped planning workflow for building weekly household meal plans from existing recipes, Recipe Discovery results, and ingredient-style manual meal items.
It is available in both the Admin UI and Mobile UI:
- Admin UI supports week and month calendar planning, drag/drop style planning, day detail editing, review/share, shopping-list creation, and configuration links.
- Mobile UI is intentionally week-only and touch-first, with a Step 1 / Step 2 flow for choosing a day and planning that day.
Meal Planner does not replace Recipe Library, Recipe Discovery, Shopping Lists, Shop a List, Kitchen Inventory, or On Hand behavior. It chooses planned meals and hands shopping-relevant sources to the existing shopping-list workflow.
Goals
- Plan future meals on a calendar.
- Respect an organization-configured week start day.
- Use organization-configured meal slots such as Breakfast, Lunch, Snack, Dinner, and Dessert.
- Support recipe-backed meal entries without duplicating recipe records.
- Support manual/non-recipe entries such as
French fries,2 salad kits, orBurger sauceas shopping-relevant ingredient candidates. - Capture recipe multipliers with the shared display formatter, such as
1x,1 ¼x,1 ½x, and2x. - Generate shopping lists through the existing Shopping List services.
- Keep Kitchen Inventory / On Hand logic owned by Shopping Lists and Shop a List.
- Provide a readable meal-plan review surface and shareable PDF/email output.
- Render Meal Plan Day/Week/Month views to display targets without changing the Admin/Mobile planning UI.
- Optionally auto-show recipe-backed meal-plan entries on displays during configured meal-slot time windows.
- Store meal-slot start/end times as canonical
HH:mmvalues while displaying user-facing labels with the organization time format. - Keep organization scoping, permissions, auditability, and future hosted/SaaS readiness intact.
User-facing surfaces
Admin Meal Planner
Path:
/admin/meal-planner
Admin supports:
- Week view.
- Month view.
- Previous / Today / Next navigation.
- Organization-configured week start day.
- Day selection with a right-side Day view panel.
- Collapsible Day view panel so the calendar can use more horizontal space.
- Calendar slot abbreviations for compact display.
- Hover tooltips with full slot/item details.
- Add existing recipe to a slot.
- Add meal item to a slot, including approved Blackcap emoji characters.
- Launch Recipe Discovery from a slot.
- Edit recipe multiplier.
- Edit manual meal item details.
- Remove entries.
- Move item, slot, or whole day.
- Review Plan.
- Download meal plan PDF.
- Email meal plan PDF.
- Create Shopping List.
Meal-slot configuration uses native browser time inputs for start/end fields instead of free-form text, so values like 1500 are not accepted. Blackcap stores the values as canonical HH:mm. Native browser picker chrome can follow the browser/operating-system 12/24-hour preference, so the organization setting controls Blackcap's labels and saved/displayed formatting but cannot force the native picker popup itself into 24-hour mode on every PC.
The Admin layout follows the newer Blackcap scroll/viewport pattern: the page heading can scroll away, the main workspace can fill the viewport, and the Day view remains a single scroll region with smooth handoff to the page.
Mobile Meal Planner
Path:
/mobile/meal-planner
Mobile is week-only by design. It supports:
- Previous week / next week controls.
- Today button.
- Swipe week navigation from the week strip.
- Step 1: choose a day.
- Step 2: plan the selected day.
- Swipe day navigation from the Day view.
- Automatic working-week context updates when swiping into a different week.
- Add recipe.
- Add meal item.
- Launch Recipe Discovery from a slot.
- Edit recipe multiplier.
- Edit manual meal item details.
- Remove entries.
- Tap-based Move item, Move slot, and Move day flows.
- Show Week summary.
- Review Plan.
- Download/email meal plan PDF.
- Create Shopping List.
Mobile does not depend on long-press drag/drop. Move actions use a styled dialog with target day, optional date picker, target slot, placement, and append/replace choices.
Configuration
Meal Planner configuration lives under:
Configuration → Organization → Meal Planner
The configuration panel manages organization-scoped defaults:
- First day of week — fully flexible, such as Sunday, Monday, Wednesday, or any other weekday.
- Meal slots — organization-owned slots shown in the Day view and used for planning.
- Slot abbreviations — compact labels used in Admin calendar cells.
- Slot ordering — drag/drop ordering in the configuration panel.
- Optional slot start/end times — organization-level meal windows such as Breakfast 7:00-9:00 AM or Dinner 5:00-7:00 PM.
- Optional slot timezone — reserved for future hosted/multi-region behavior; local org defaults are normally sufficient.
- Slot archiving — hides a slot from new planning while preserving existing meal-plan entries.
- Display refresh delay — coalesces Current Meal Plan display pushes after meal-plan edits so local e-ink hardware is not rewritten after every recipe or note change.
Default slots are seeded as:
| Slot | Calendar abbreviation |
|---|---|
| Breakfast | B |
| Lunch | L |
| Snack | S |
| Dinner | D |
| Dessert | Ds |
The full slot name is used in the Day view, Review Plan, PDF output, shopping-list generation, and display rendering. Abbreviations are only for compact calendar display. Slot start/end times do not change manual planning behavior; they are only used by display auto-show scheduling when a display opts in.
Display refresh debounce
When the default e-ink display, hosted receiver, kiosk, or remote client is currently showing Current Meal Plan, Meal Planner edits mark the impacted display assignment as stale instead of pushing immediately. The periodic display-content runner performs the actual render/push after the quiet period.
The organization setting lives in the same Meal Planner configuration panel:
meal_planner.display_refresh_debounce_seconds
Default value: 300 seconds. Set it to 0 to restore immediate refresh behavior. For testing, 60 or 120 seconds is often a better balance between fast feedback and avoiding repeated local e-ink writes. The setting is organization-scoped, so one organization can use a shorter delay without changing another organization’s display behavior.
The runner responsible for due/stale display content is:
/home/pi/inky_env/bin/python3 /home/pi/Blackcap-Pi/run_display_content_refresh.py
Planning entries
Meal Planner has two primary entry types.
Recipe-backed entries
Recipe-backed entries reference an existing recipe in the current organization.
They store planning-specific details such as:
- plan date;
- slot;
- display order;
- quantity multiplier;
- source type, such as recipe library or Recipe Discovery.
The recipe name, description, ingredients, source URL, PDF, thumbnail, and editable recipe content still belong to the Recipe Library. Meal Planner does not duplicate recipe records or edit recipe titles.
Recipe multiplier editing uses a compact styled dialog. Values are normalized to quarter steps and shown as friendly labels:
1x1 ¼x1 ½x1 ¾x2x
When a shopping list is generated, the multiplier is passed to the existing shopping-list recipe ingredient logic.
Manual meal items
Manual entries are called meal items in the UI. Meal item names can include approved Blackcap emojis through the shared emoji picker. Unsupported emoji characters are validated using the existing emoji registry/cache behavior so e-ink and display rendering do not break.
Use Add meal item for non-recipe items such as:
- French fries
- 2 salad kits
- Burger sauce
- Fruit
- School lunch
- Takeout pizza
Manual meal items are treated as ingredient-style shopping candidates, not vague notes. They can capture:
- item name;
- quantity;
- unit / measurement;
- optional canonical ingredient text;
- optional notes;
- whether the item should be included in shopping-list generation.
This matches the behavior expected for recipe ingredients that cannot be reconciled directly. For example, a recipe ingredient such as Burger sauce, for serving (optional) and a manually planned Burger sauce meal item should both be able to flow into shopping-list review/canonical validation.
Manual meal items store fields such as:
item_quantity_labelitem_unitnormalized_namecanonical_namesearch_nameingredient_validation_statusinclude_in_shopping
If an item is not linked to a known canonical, it remains reviewable through the shopping/database cleanup flow rather than being silently discarded.
Add Recipe flow
From either Admin or Mobile Day view:
- Choose a meal slot.
- Select Add Recipe.
- Search the organization’s Recipe Library.
- Optionally filter by recipe type.
- Optionally add ingredient chips for multi-ingredient search.
- Review recipe cards with thumbnail, title, type/source metadata, and description.
- Set the multiplier on the recipe tile.
- Add the recipe to the selected date and slot.
The Add Recipe picker uses the existing organization-scoped recipe data and the token/auth-safe recipe thumbnail route based on public recipe ids. It does not create a recipe record and does not use made-it/completion photos as picker thumbnails.
Add meal item / Edit meal item flow
Manual meal items use a styled Blackcap dialog, not browser prompt() calls.
The same dialog is used for:
- adding a meal item;
- editing a meal item.
Fields include:
- item name;
- quantity;
- unit / measurement;
- canonical ingredient text;
- notes;
- include in shopping-list ingredient candidates.
The dialog title changes between Add meal item and Edit meal item based on context.
Display rendering and auto-show behavior
Meal Plan display rendering is separate from the Admin and Mobile planning UI. The planning screens continue to show individual recipe and manual entries, while display output summarizes each populated slot for readability.
Display rendering rules:
- Slot order follows the organization-configured meal slot order, not alphabetical order and not the order entries were first encountered.
- Week view renders only populated slot columns and orders them left-to-right by configured slot order.
- Day and Month card views use the same configured slot order.
- The first recipe-backed entry in a populated slot is treated as the main recipe.
- Remaining entries in the same slot, including non-recipe meal items and additional recipe-backed entries, are rendered as sides using
Main Recipe w/Side One and Side Two. - If a slot has no recipe-backed entries, the first visible item becomes the main item and remaining items become sides.
- Approved Blackcap emojis in recipe/item names remain visible in display text.
- Color/image-capable displays can include the main recipe thumbnail; B&W/e-ink displays remain text-first.
Display Detail includes an opt-in setting for auto-show timed Meal Plan recipes. When enabled, the periodic display-content refresh runner checks active meal slots with start/end times. If the display's default/current content is a Meal Plan Day/Week/Month view and the active slot contains recipe-backed entries, Blackcap temporarily shows the first recipe-backed entry, lists the virtual auto-show activity in Scheduled Display Content, and restores the display's default Meal Plan view after the slot ends. Non-recipe-only slots and slots without time windows are ignored. Auto-show is disabled by default.
Let’s Cook integration
When Let’s Cook is started from a meal-plan entry, the session keeps the selected recipe as the active cooking recipe and carries the parent meal-plan entry id. Other entries in the same meal slot become compact side reminders, matching the display-rendering convention. For example, a dinner slot with Spaghetti & Meatballs, Bread, and Salad can start a single-recipe Let’s Cook session for Spaghetti & Meatballs while showing Sides: Bread · Salad in Admin, Mobile, Kiosk, and the attached e-ink recipe header.
This is intentionally not true multi-recipe cooking. It is a lightweight reminder layer so the cook sees what else belongs with the meal without creating multiple recipe tabs, separate assignments, or multi-display orchestration.
Recipe Discovery integration
Meal Planner can launch Recipe Discovery with date/slot context.
Admin example:
/admin/recipe-discovery?meal_plan_date=2026-05-28&meal_slot_id=<slot_id>&return_to=meal_planner
Mobile example:
/mobile/recipe-discovery?meal_plan_date=2026-05-28&meal_slot_id=<slot_id>&return_to=mobile_meal_planner
When a recipe is saved from Recipe Discovery with Meal Planner context:
- The recipe is saved normally into the current organization.
- Editable recipe content and ingredient/search indexes are written normally.
- The normal recipe cache/PDF/image build is queued.
- A Meal Planner recipe-backed entry is created for the selected date/slot.
- The user returns to the Meal Planner context.
Recipe Discovery remains fully usable as a standalone recipe import workflow.
Moving entries
Admin
Admin supports planning moves at three levels:
- individual recipe/manual item;
- whole meal slot;
- whole day.
Calendar/day interactions support drag/drop style movement and append/replace conflict choices where needed. Dragging an item onto another calendar day opens a compact slot selector instead of assuming a target slot.
Mobile
Mobile uses tap-based move actions instead of relying on long-press drag/drop.
Supported actions:
- Move on a recipe/manual item;
- Move slot on non-empty meal slots;
- Move Day for the selected day.
The move dialog supports:
- current-week day chips;
- date picker for another date;
- target slot selection for item/slot moves;
- top/end placement for individual items;
- append/replace conflict choices for slot/day moves.
If a move targets a day outside the current working week, the selected date and working week context update after the move.
Week context and mobile navigation
Mobile Meal Planner state is based on:
selectedDate = exact day being planned
workingWeekStart = configured week containing selectedDate
Behavior:
- Previous/next week changes the working week.
- Today returns to the current real-world date/week.
- Tapping a day selects that day.
- Swiping the week strip changes the working week.
- Swiping the Day view changes the selected day.
- Swiping from the last day of one configured week into the next day updates the working week context.
- Show Week, Review Plan, and Create Shopping List use the currently selected/working week, not necessarily the real current week.
Show Week, Review Plan, and PDF/email sharing
Show Week
Show Week is a planning summary. It shows the working week and planned content in readable day/slot tiles.
It is not an editing surface.
Review Plan
Review Plan is a read-only review/share surface for the visible Admin range or the working Mobile week.
It shows only planned days/slots and includes:
- recipe thumbnail/fallback image;
- recipe name;
- multiplier;
- description;
- manual meal item quantity/unit;
- source link where available;
- recipe PDF link where available.
PDF and email
Meal Planner can generate a shareable meal plan PDF that follows the Review Plan structure with day sections, slot labels, recipe/manual item cards, images, descriptions, quantities, and links where possible.
Email PDF sharing uses an inline panel, not a browser prompt. It captures:
- recipient email address(es);
- optional message;
- optional sender name.
This is intentionally email/PDF sharing only. There is no Blackcap-to-Blackcap meal-plan share/import flow.
Shopping-list generation
Meal Planner creates shopping lists by handing selected meal-plan sources to the existing Shopping List services.
Supported selection behavior:
- selected days;
- selected slots;
- multiple days/slots;
- full visible/working week default when nothing is manually selected.
Admin and Mobile both default to the current working/configured week when nothing is selected. In Month view, Create Shopping List still defaults to the current configured week rather than the entire visible month.
Recipe-backed entries contribute recipe ingredients using the saved meal-plan multiplier.
Manual meal items contribute ingredient-style candidates when include_in_shopping is enabled. Items that are not confidently canonical-linked remain reviewable by the existing shopping/canonical validation flow.
Meal Planner does not directly manage:
- barcode scanning;
- purchased product capture;
- inventory intake;
- on-hand consumption;
- Kitchen Inventory quantity adjustments;
- grocery department cleanup.
Those responsibilities remain inside Shopping Lists, Shop a List, Kitchen Inventory, and Database Admin data-management workflows.
Recipe archive/delete dependency behavior
recipe_dependency_service.py checks recipe dependencies before archive/delete actions.
Rules:
- A recipe used in a future Meal Planner entry cannot be archived.
- A recipe used only in past Meal Planner entries, shopping lists, or sharing records can be archived after warning/confirmation.
- A recipe associated with any Meal Planner entry or shopping list cannot be hard deleted.
- Dependency checks are organization-scoped.
This protects future meal plans and prevents broken historical meal-plan/shopping-list references.
Data model
Migration 045_meal_planner.sql creates:
meal_plan_settingsmeal_slotsmeal_plan_entriesmeal_plan_shopping_list_links
Migration 046_meal_slot_abbreviations.sql adds configurable meal slot abbreviations.
Migration 124_meal_plan_display_refresh_debounce.sql adds the organization-scoped meal_planner.display_refresh_debounce_seconds setting used to coalesce Current Meal Plan display pushes.
All records are organization-scoped. Recipe references use (organization_id, recipe_id) so recipe IDs remain unique only within the owning organization.
No meal_plan_days table is currently required. A day is represented by entries grouped by organization_id + plan_date.
Service architecture
Core files:
inky_admin/blueprints/meal_planner.py
inky_admin/services/meal_planner_service.py
inky_admin/services/meal_planner_db_service.py
inky_admin/services/meal_planner_drag_service.py
inky_admin/services/meal_planner_review_service.py
inky_admin/services/meal_planner_shopping_list_service.py
inky_admin/services/display_content_refresh_service.py
inky_admin/services/recipe_dependency_service.py
inky_admin/templates/meal_planner.html
inky_admin/templates/mobile_meal_planner.html
inky_admin/static/css/meal_planner.css
inky_admin/static/css/mobile_meal_planner.css
inky_admin/static/js/meal_planner.js
inky_admin/static/js/mobile_meal_planner.js
Architecture pattern:
Blueprint route
→ service layer
→ meal planner DB/service helpers
→ centralized database service / repository layer
→ SQLite
Business logic should stay in services. Routes should remain thin, and templates should not own persistence or permission logic.
API / endpoints
Primary pages:
| Method | Path | Purpose |
|---|---|---|
GET |
/admin/meal-planner |
Admin Meal Planner. |
GET |
/mobile/meal-planner |
Mobile Meal Planner. |
Data and entry APIs:
| Method | Path | Purpose |
|---|---|---|
GET |
/admin/meal-planner/events |
Calendar range data. |
GET |
/admin/meal-planner/day/<date> |
Day detail with slots and entries. |
POST |
/admin/meal-planner/entries |
Create recipe-backed or manual entry. |
PATCH/POST |
/admin/meal-planner/entries/<entry_id> |
Update entry details. |
DELETE |
/admin/meal-planner/entries/<entry_id> |
Remove entry. |
POST |
/admin/meal-planner/entries/<entry_id>/move |
Move one item. |
POST |
/admin/meal-planner/slots/move |
Move a full slot. |
POST |
/admin/meal-planner/days/move |
Move a full day. |
GET |
/admin/meal-planner/recipe-search |
Organization-scoped recipe picker search. |
Configuration APIs:
| Method | Path | Purpose |
|---|---|---|
GET/PATCH/POST |
/admin/meal-planner/settings |
Read/update Meal Planner settings. |
POST |
/admin/meal-planner/slots |
Add meal slot. |
PATCH/POST |
/admin/meal-planner/slots/<slot_id> |
Update/archive slot. |
POST |
/admin/meal-planner/slots/reorder |
Save slot order. |
Review and shopping APIs:
| Method | Path | Purpose |
|---|---|---|
POST |
/admin/meal-planner/review |
Build Review Plan data. |
POST |
/admin/meal-planner/review.pdf |
Download Review Plan PDF. |
POST |
/admin/meal-planner/review/email |
Email Review Plan PDF. |
POST |
/admin/meal-planner/preview-shopping-list |
Preview shopping-list source set. |
POST |
/admin/meal-planner/create-shopping-list |
Create shopping list from selected meal plan dates/slots. |
Mobile uses the same JSON endpoints so behavior remains centralized.
Permissions
Meal Planner uses dedicated permissions:
meal_planner.viewmeal_planner.managemeal_planner.configuremeal_planner.movemeal_planner.deletemeal_planner.create_shopping_list
Permission checks are enforced server-side. Organization context is resolved from the authenticated user/session, not from client-supplied organization IDs.
Organization scope and security
Meal Planner data is organization-owned.
Expected behavior:
- Org users see only their organization’s meal plan.
- System admins see organization-scoped business data for their active organization context only.
- Recipe lookup must resolve through
(organization_id, recipe_id). - Recipe Discovery saves into the current organization.
- Shopping-list generation creates organization-owned lists.
- Move endpoints cannot cross organizations.
- Configuration updates apply only to the active organization.
- Direct endpoint calls with forged IDs should fail closed.
Testing checklist
Admin calendar
- Week view renders.
- Month view renders.
- Week start day is respected.
- Previous, next, and today controls work.
- Day selection opens the Day view.
- Collapsing the Day view gives the calendar more space.
- Calendar slot abbreviations appear.
- Hover tooltips show full slot/item names.
Admin Day view
- Slots show in configured order.
- Empty slots use the header/button area as the drop target.
- Multiple entries in one slot display fully.
- Recipe thumbnails appear when there is room.
- Manual entries can be added/edited with quantity/unit/canonical fields.
- Recipe-backed entries can be added with multiplier.
- Recipe multiplier edit dialog saves immediately.
- Entries can be removed.
- Day view scroll handoff feels smooth.
Mobile planner
- Mobile Meal Planner loads from
/mobile/meal-planner. - Week-only view respects configured week start day.
- Previous/next week controls work.
- Week strip swipe works.
- Today returns to the current date/week.
- Day chips show planned counts.
- Day swipe moves to previous/next day.
- Swiping across a week boundary updates working week context.
- Add Recipe works.
- Add meal item works.
- Recipe Discovery returns to the selected mobile date/slot.
- Recipe thumbnails appear in Day view.
- Show Week displays the working week, not always current week.
Move behavior
- Admin item move works.
- Admin slot move works.
- Admin day move works.
- Mobile item Move works.
- Mobile Move slot works.
- Mobile Move Day works.
- Moving to a date outside the current week updates the selected/working week context.
- Append/replace conflict behavior works.
Recipe Discovery
- Launch from Admin Meal Planner slot.
- Launch from Mobile Meal Planner slot.
- Save recipe normally.
- Cache build is queued.
- Meal plan entry is created with the right date/slot.
- User returns to the right Meal Planner context.
- Standalone Recipe Discovery still works.
Shopping-list generation checks
- Create from selected Admin days/slots.
- Create from selected Mobile days/slots.
- When nothing is selected, Admin defaults to the current configured week.
- When nothing is selected, Mobile defaults to the current working week.
- Recipe multipliers scale ingredients.
- Manual meal items become ingredient candidates when included.
- Uncanonicalized manual items remain reviewable.
- Existing Shopping List, Edit Shopping List, Shop a List, Kitchen Inventory, and On Hand behavior handles execution.
Review and share
- Review Plan shows only planned days/slots.
- PDF includes images, descriptions, quantities, multipliers, and day/slot structure.
- Email PDF panel opens inline.
- Email PDF sends with meal-plan wording.
- No Blackcap-to-Blackcap meal-plan sharing is exposed.
Meal Planner configuration checks
- Configuration → Organization → Meal Planner loads.
- First day of week saves and shows saved feedback.
- Slot add/edit dialog works.
- Slot abbreviation saves.
- Slot drag/drop order saves.
- Slot archive icon is centered and archives the slot.
- Archived slots stop appearing for new planning.
- Display refresh delay saves in the same Meal Planner panel and does not create a duplicate Meal Planner configuration page.
- When the active display content is Current Meal Plan, a burst of recipe/manual-note edits produces one deferred display refresh after the configured quiet period.
- Setting
meal_planner.display_refresh_debounce_secondsto0restores immediate refresh behavior.
Recipe dependency behavior
- Future meal plan references block archive.
- Past meal plan references warn before archive.
- Shopping list references warn before archive.
- Meal-plan/shopping-list references block hard delete.
- Cross-organization recipe IDs do not affect dependency checks.
Regression
- Recipe Library still loads and searches.
- Recipe Discovery still works standalone.
- Recipe cache queue remains unchanged.
- Recipe PDFs/images still render.
- Shopping Lists still work.
- Shop a List still works on Admin and Mobile.
- Kitchen Inventory / On Hand remains shopping-list-managed.
- Database Admin remains scoped/masked.
- No large logic was added to
inky_admin_app.py.
Deliberately not included
The first complete version intentionally avoids:
- copying an entire week forward;
- Blackcap-to-Blackcap meal-plan sharing/import;
- inventory-aware reductions inside Meal Planner;
- barcode/product capture inside Meal Planner;
- long-press-only mobile drag/drop.
Those can be considered later, but the current design keeps planning fresh and lets Shopping Lists own shopping/inventory execution.
Display Content Flow Completion Notes
- Recipe Library and Meal Planner now use page-local lightweight Send to Display(s) dialogs instead of redirecting to the Displays page. Recipe Library send is per recipe only; Meal Planner send targets the current day/week/month meal-plan content model.
- Display content summaries now treat Default as the primary state and suppress redundant Current rows when Current effectively matches Default after normalizing meal-plan and recipe settings.
Home Today & Tomorrow workflow
The Home dashboard embeds a focused Today & Tomorrow meal-planner workflow. It is not a full replacement for the Meal Planner page, but both day panels are operational:
- add recipes
- add manual items
- use Recipe Discovery
- edit/delete entries
- edit people served
- drag entries within the same day
- drag entries between today and tomorrow
- create a shopping list from selected day(s) or selected slot(s)
The day-level shopping buttons are toggles. A selected day is styled as selected and clicking it again clears that day. Selecting individual meal slots for a day clears that day-level selection. If nothing specific is selected, Home defaults the shopping-list creation to both today and tomorrow.
The selected Recipe Quick Actions recipe can be dragged into a Today/Tomorrow meal slot. The selected recipe card also provides Add to Meal Plan, which asks for day and slot for users who prefer a button-driven flow. When recipe servings are known, the meal-plan multiplier is calculated from the destination slot’s people-served value. When servings are unknown, Home falls back to the selected quick-action multiplier.
Recipe Library and Home add-to-plan actions
Recipe Library recipe cards include a direct calendar action immediately after Select Recipe. The popup supports any date and active slot, calculates people-served scaling through the shared recipe multiplier services, and offers only valid multiplier choices, including discrete/whole-unit restrictions. Its multiplier editor uses the same circular minus button, multiplier pill, circular plus button, and friendly denominator guidance as the Meal Planner entry editor.
Home keeps a focused workflow with Today, Tomorrow, and Other. Today and Tomorrow retain slot-based scaling. Other accepts only dates after tomorrow, loads active slots for that date, and adds the recipe without expanding Home into the full Meal Planner. The server validates the future-date boundary using the organization time zone.
Shopping-list selection guidance
The Admin Meal Planner makes the shopping-list scope explicit:
- With no Shop day/slot boxes selected, the button reads Create Weekly Shopping List and the displayed week is used.
- With one or more boxes selected, the button reads Create Shopping List and only the selected days/meal slots are used.
The helper text updates as selections change, weeks are rerendered, or the page is restored through browser navigation. The server remains authoritative: explicit selections are honored, while an empty selection is resolved from the displayed week anchor and organization week-start behavior. Home keeps its separate Today/Today-and-Tomorrow default.
Recipe search results in Meal Planner also include a compact View PDF link when a valid cached recipe PDF exists. It opens through the existing permission-checked recipe PDF route and does not disturb the current search dialog.