Meal Plan Reports
Render a report against a .menu file and the template receives a plan value: the week broken into days, meals and recipes, with every ingredient list already scaled.
{{ plan.start_date }} – {{ plan.end_date }}
{{ plan.total_meal_count }} meals · {{ plan.unique_recipe_count }} unique recipes
{% for day in plan.days %}
## {{ day.date }}
{% for meal in day.meals %}{% for recipe in meal.recipes %}
- {{ recipe.name }}
{% endfor %}{% endfor %}
{% endfor %}
Fields: plan.days, plan.all_ingredients, plan.total_meal_count, plan.unique_recipe_count, plan.start_date, plan.end_date. Each day exposes day.date, day.meals and day.ingredients; each meal exposes meal.recipes.
Weekly totalsCook Pro
plan.all_ingredients is the flat, scaled list for whole-plan aggregation, and day.ingredients gives you the same per day:
{% set wk = aggregate_nutrition(plan.all_ingredients) %}
Week: {{ wk.totals.kcal }} kcal · {{ wk.totals.protein_g }} g protein
{% for day in plan.days %}
{% set t = macros(day.ingredients) %}
{{ day.date }}: {{ t.kcal }} kcal
{% endfor %}
Allergens and confidence work the same as for a single recipe — wk.allergen_summary with the "allergens" include, and wk.confidence_breakdown; see the nutrition reference.
Variety checksCook Pro
category_servings(plan, slug) counts the meals containing at least one ingredient in a category (tree-aware), which powers targets like "two servings of oily fish a week":
{% import "ck" as ck %}
{{ ck.between(category_servings(plan, "omega3_source"), 2, 14, "Omega-3 servings") }}
Combine with the ck macros for a full week-in-review report that ends in a pass/fail summary.