Plan meals with weekly menus, shopping lists, batch cooking, budget tracking, dietary preferences. Uses recipes.sqlite and feeds shopping into the Instacart pipeline.
On first use, read setup.md for onboarding guidelines. Start helping naturally without technical jargon.
User wants to plan meals, generate shopping lists, track food budget, organize recipes, coordinate household eating, or reduce food waste.
~/.config/spratt/recipes/recipes.sqlite — structured recipes with JSON ingredients, tags, source URLs. Managed by the recipe-instacart skill.~/.config/spratt/orders/orders.sqlite — past grocery purchases with itemized data. Source of "what do we usually buy."python3 ~/.config/spratt/infrastructure/orders/purchase-cadence.py — analyzes reorder timing from order history.~/.config/spratt/meal-planner/
├── memory.md # Preferences + dietary info + household
├── weeks/ # Weekly meal plans
│ └── YYYY-WXX.md
├── inventory/ # What's in pantry/fridge
│ ├── pantry.md
│ └── fridge.md
├── templates/ # Reusable meal templates
│ └── {template-name}.md
└── archive/ # Past weeks for reference
No recipes/ or shopping/ subdirectories. Recipes live in SQLite. Shopping lists are generated inline and fed to the Instacart skill.
| Topic | File |
|---|---|
| Setup process | setup.md |
| Memory template | memory-template.md |
| Shopping optimization | shopping-guide.md |
| Batch cooking | meal-prep.md |
| Budget tracking | budget-tips.md |
Before any meal planning, read ~/.config/spratt/meal-planner/memory.md for:
Before suggesting meals, check recipes.sqlite:
sqlite3 ~/.config/spratt/recipes/recipes.sqlite "
SELECT id, name, tags, servings, prep_time, cook_time
FROM recipes ORDER BY last_made ASC NULLS FIRST
"
Prefer saved recipes over inventing new ones — these are recipes the household has already vetted. Reference by DB id in weekly plans.
To find recipes by tag or ingredient:
sqlite3 ~/.config/spratt/recipes/recipes.sqlite "SELECT id, name FROM recipes WHERE tags LIKE '%dinner%'"
sqlite3 ~/.config/spratt/recipes/recipes.sqlite "SELECT id, name FROM recipes WHERE ingredients LIKE '%chicken%'"
When user asks to plan meals:
For each shopping trip, generate the ingredient list:
Then offer two paths:
instacart skillDo NOT save shopping lists as files — they're ephemeral, generated from the weekly plan.
For any dietary restrictions or allergies:
When cooking for multiple people:
| Strategy | Typical Savings | When to Apply |
|---|---|---|
| Seasonal produce | 20-40% | Always check what's in season |
| Batch cooking | 30% time, 15% cost | Busy weeks |
| Protein rotation | 15-25% | Alternate expensive/cheap proteins |
| Pantry meals | 50%+ | End of budget cycle |
| Store brands | 10-30% | Most staples |
# Week YYYY-WXX
## Overview
- Budget target: $XXX
- Dietary focus: [any theme]
- Special events: [guests, holidays]
## Monday
**Breakfast:** [meal] | Prep: X min
**Lunch:** [meal] | Prep: X min
**Dinner:** [meal] | Prep: X min | Recipe: #ID (Name)
## Tuesday
...
## Batch Prep (Sunday)
- [ ] Cook rice for Mon/Tue/Wed
- [ ] Chop vegetables for week
- [ ] Marinate Thu chicken
## Ingredients Needed
[Generated from meals above, minus inventory on hand]
Reference recipes by SQLite ID: Recipe: #3 (Garlic Lemon Chilli Pasta)
When a meal plan includes a new recipe (not in the DB), save it using the recipe-instacart skill's flow:
sqlite3 ~/.config/spratt/recipes/recipes.sqlite "
INSERT INTO recipes (name, ingredients, instructions, tags, servings, prep_time, cook_time, saved_by)
VALUES (?, ?, ?, ?, ?, ?, ?, 'meal-planner')
"
Ingredients must be JSON: [{"name": "chicken breast", "qty": "2 lbs"}, ...]
Tags must be JSON: ["dinner", "quick", "indian"]
Proactively ask about inventory updates:
Check recent purchases to inform inventory:
sqlite3 ~/.config/spratt/orders/orders.sqlite "
SELECT items FROM orders WHERE source = 'instacart'
ORDER BY order_date DESC LIMIT 1
"
This skill ONLY:
~/.config/spratt/meal-planner/recipes.sqliteorders.sqliteThis skill NEVER: