AJ89 downloadsStandardize recipe notes, parse ingredient amounts, and generate weekly shopping lists from a meal-plan canvas.
Plan a week of meals on an Obsidian canvas, keep recipe amounts in consistent metric measures, and generate a categorised shopping list from that plan.
The plugin ships with its own starter templates. You do not need Obsidian's Templates core plugin.
Support the project: Buy Me a Coffee
Settings → Weekly Meal Shopper.Run setup and choose where the editable canvas and recipe templates should live.Open or create meal plan canvas, then add recipe cards to it.Generate weekly shopping list from meal-plan canvas.Thirteen commands cover the everyday work. One-off and bulk actions live in settings instead, so the command palette stays short.
| Command | What it does |
|---|---|
| Open recipe view in current tab | Split ingredients/directions reading view |
| Open recipe card (planning view) | Recipe card modal, with add-to-canvas |
| Create recipe note from template | New blank recipe note |
| Transcribe recipe from URL entry (website/YouTube) | Imports a recipe from a link |
| Standardise current recipe (preview) | Shows the proposed changes for this note before writing |
| Calculate recipe macros | Per-serving energy and macros for this note |
| Open or create meal plan canvas | Opens the configured canvas, creating it if needed |
| Set active canvas as meal plan canvas | Asks whether this is the primary or second canvas |
| Add active recipe to meal plan | Asks whether it's a weekly meal, a project or hosting |
| Generate weekly shopping list from meal-plan canvas | Builds the shopping list |
| Apply frozen leftovers from meal-plan canvas | As above, and updates frozen portions |
| Manage frozen portions inventory | Edit frozen portions per recipe |
| Add ingredient override from current shopping list line | Recategorise an item from the list itself |
In settings: standardise all recipes, restore a backup, check recipes for problems, calculate macros for every recipe, transcribe an image folder, re-download the nutrition dataset, set a nutrition match, and manage frozen portions.
Seven groups, in the order you meet them:
Ingredients live in the ### Ingredients section in four slots: Amount ; Unit ; Ingredient ; Preparation. Blank slots stay empty, so 1; ; sweet potato; roughly chopped is one sweet potato, no unit, roughly chopped. The separator is configurable (;, ,, :, |). The body is the source of truth; the IngredientsParsed frontmatter field mirrors it and is refreshed automatically a couple of seconds after you edit a note.
Amounts are metric-first:
Rounding: grams and millilitres to 1 below 10, 5 up to 100, then 10; teaspoons to ¼, tablespoons to ½, cups to ¼; counts to ½, or ¼ below 1. Values a recipe's author wrote are never rounded, and amounts under ¼ cup are stored in tablespoons rather than rounded up.
IngredientsParsed also records where each amount came from (site-metric, dual-unit, converted or original) and keeps the exact unrounded value.
Transcribe recipe from URL entry fetches the page itself:
Imported ingredients are shown for review before the note is written, with a badge showing where each amount came from.
Standardise current recipe (preview) and Data & maintenance → Standardise all recipes run the same thing: a preview of every proposed line, before → after, grouped into ready, needs review and skipped. You choose what gets written.
180°C (160°C fan)..obsidian/plugins/weekly-meal-shopper/backups/ (the last 5 runs). Restore them from settings.MeasurementsVerified: true in its frontmatter and is skipped by later runs.Totals are aggregated unrounded across the plan, then each line is written as what you'd actually pick up:
(21 slices) bread, not 21 breads.pack-sizes.json, with what the recipes use alongside — (1 loaf) bread — recipes use 21 slices. The built-in sizes are typical Australian supermarket estimates and are editable in settings.(600 g, ≈ 4¾ cups) plain flour.Portions are listed at the top, because a blank one is counted as a single portion. A recipe whose ingredients can't be read is flagged there too instead of stopping the list.Calculate recipe macros. Per-serving figures are cached to frontmatter and written into the note's ### Nutrition section.Created in the plugin folder on first use, and editable:
| File | Holds |
|---|---|
ingredient-categories.json |
Shopping category rules |
unit-density-rules.json |
Grams per ml per ingredient. Layered over the built-in table; 0 switches one off |
unit-aliases.json |
Extra unit spellings |
pack-sizes.json |
How things are sold: bunches, bags, loaves, cans |
nutrition-*.json |
Nutrition dataset, live-lookup cache and manual matches |
Planning, parsing, standardising and shopping lists all work offline.
api.openai.com) is used only for image transcription and for pages with no structured recipe data, with your own API key stored in this vault's data.json. Standardising never sends your directions anywhere.fdc.nal.usda.gov, desktop only). The optional live-lookup fallback queries USDA (api.nal.usda.gov, your own free key) or Open Food Facts (world.openfoodfacts.org) for ingredients not found locally, and caches every result.No telemetry, no ads.
j/k navigation.Supported image formats for folder transcription: jpg/jpeg, png, webp, gif, bmp, heic/heif, tif/tiff, avif.