The actual problem

I had a 500+ recipe library in AnyList. The recipes were there. The problem was the weekly gap between "we should eat at home more" and actually knowing what to buy at Kroger on Saturday.

Every approach I tried had the same failure mode: the planning part happened in one place, the recipes in another, and the shopping list in a third. There was always a translation step where I had to hold everything in my head at once. That's the step that breaks down when you're tired or distracted or both.

I needed the AI to live where the system already lives, not pull me into a new one.

How it works

It's not one clever prompt, it's a folder. Everything Roux knows lives in plain files on my computer, organized so that "what does Claude need to know" maps directly to "what file is that in":

Roux/ ├── CLAUDE.md # the system prompt: rules, tone, how the week runs ├── family.md # household profile + the staples/snacks checklist ├── inventory.md # pantry / fridge / freezer, current counts ├── stores/ │ └── this_week.md # this week's sales, refreshed by /deals ├── weekly/ │ ├── current/ │ │ ├── meal_plan.md # this week's 7 dinners │ │ └── grocery_list.md │ └── archive/ # past weeks, closed out by /week-used └── .claude/ └── commands/ # the 5 commands below, one markdown file each ├── deals.md ├── plan.md ├── shop.md ├── inventory-add.md └── week-used.md

The rules live once, in CLAUDE.md, not re-typed into a chat every Saturday. State lives in the other files, not in a conversation history that eventually scrolls away. Each command in .claude/commands/ is itself just a markdown file, an instruction Claude reads and executes against whatever's currently in the other files. Nothing here is a custom app; it's a folder structure a plain-text editor could open, which is exactly why it hasn't needed a rewrite since week one.

building this in Codex instead of Claude Code? rename CLAUDE.md to AGENTS.md, codex won't read a claude-flavored filename. everything else in the folder stays the same.

/deals pulls the week's sales before anything gets planned. /plan builds seven dinners against the pantry, the rules, and the actual 500+ recipe library, not a generic suggestion engine, and writes the result to weekly/current/meal_plan.md. I push back, swap things out, say "something faster on Tuesday," and it re-plans against the same files instead of starting over.

/shop turns meal_plan.md into grocery_list.md, organized by store section, and, via an MCP integration into AnyList, writes it straight into the app and pushes the dinners onto the AnyList meal calendar, no copy-paste. After Kroger pickup, /inventory-add takes a pasted receipt and reconciles it against inventory.md directly. I never re-type a count.

An early version of /shop generated grocery_list.md purely from that week's meal_plan.md, and silently dropped anything that wasn't tied to a specific dinner: snack crackers, coffee, the kids' lunch staples. I found out at checkout, with a full cart and no bagels. The fix wasn't a smarter prompt. It was a persistent staples checklist in family.md that /shop now walks item-by-item against inventory.md on every single run, independent of what's actually cooking that week.

What changed

I stopped dreading it. That's the unglamorous, completely real outcome.

More specifically: we cook at home more often because the friction of planning is gone. /week-used closes the loop: it deducts what actually got cooked from inventory.md and moves the week from weekly/current/ to weekly/archive/, guarded by a change log so a plan I edited mid-week (I always edit the plan mid-week) never double-counts or silently drops inventory.

How it was built

Claude Code MCP server (AnyList) markdown as state slash commands receipt reconciliation

The hard part was never the prompts. It was treating plain files as the actual source of truth instead of relying on the model to remember our preferences across sessions, so a fresh Claude instance behaves identically to the one from six months ago, without me re-explaining a single household rule.