
Feeding a family of four every week is not hard in theory. It’s hard in practice because it’s a dozen small decisions repeated forever: what’s for dinner, does that have pork in it, will it fit in our genuinely tiny fridge, did we already buy that, is it Tuesday’s protein or Wednesday’s. None of that is interesting work. All of it has to happen anyway. So I asked Bo to take it over.
What I actually gave it to work with
Not a vague “figure out our groceries” request. A real spec: no beef or
pork (watch for hidden pork like gelatin and sausage casings), some
items need to be gluten-free, and our fridge is small enough that
buying in bulk just means throwing food away later. Plus an actual
weekly dinner rotation, a breakfast rotation, and a formula for the
kids’ school lunches. I turned all of it into one file so I’d never
have to re-explain it:
meal-preferences.md is the real
one, download it and swap in your own life.
Where it fell apart the first time
My first instinct was “buy in bulk from Costco, it’s cheaper.” Bo actually went and checked instead of assuming, and it turned out Costco splits perishables and non-perishables into separate delivery systems that don’t share a cart. Buying both in one Costco order isn’t one checkout, it’s two logins and two waits, which defeats the entire point of automating this. So we dropped Costco. Sometimes “obviously cheaper” loses to “obviously fewer decisions,” and I’d rather have my week back than save four dollars on paper towels.
What we landed on: one weekly order from a smaller grocery delivery service for anything fresh (produce, dairy, protein), and one monthly order from Amazon Subscribe & Save for the shelf-stable stuff, grouped onto a single delivery date. Two orders a month to think about instead of constant ad-hoc shopping.
The part that’s still manual, on purpose
Nothing gets ordered without me seeing the cart first. Bo builds the proposed order against the meal plan and the constraints, shows me the full cart with prices, and waits. I say go or I don’t. That’s not a limitation I haven’t gotten around to fixing, it’s the actual design. I don’t want an agent with a standing credit card authorization making food decisions for my kids without a human looking at it first.
The confirmation gate and the daily reminder cron
The order-building step reads the meal plan and constraints, checks the store’s live catalog (prices and stock change, so this runs fresh each time, not off a cached list), and flags anything that violates a rule: pork product, not gluten-free when it needed to be, or a non-perishable ordered on the wrong cadence. It outputs the cart plus those flags and stops. Nothing calls a “place order” endpoint until I respond.
Separately, a small cron job runs every morning and posts that night’s dinner from the rotation into our house chat, including any prep note (“Wednesday’s chicken is a double batch, thaw the salmon for Thursday tonight”). That part is fully automatic because worst case it’s wrong about dinner, not wrong about a charge on a card.
The “just for fun” technical bit
None of this needs to be complicated, and I want to be upfront that I’m not running a data center in the garage. It’s one Mac Mini with 32GB of unified memory, on all the time, running the assistant (OpenClaw) that everything in this blog comes from. Claude does the actual reasoning over an API. A smaller model runs locally on the same machine for the browsing/screenshot-heavy tasks, since those don’t need the biggest model to work well and it’s nice not to pay per screenshot. Here’s roughly how it fits together:
Problems I'm still actually facing
- Grocery sites don’t want to be automated. Selectors change, some flows need a real login session I have to refresh manually, and “add to cart” occasionally silently fails and needs a re-check.
- The local vision model is slower than I’d like for anything with a lot of screenshots. Fine for a nightly job, not something I’d want to sit and wait on.
- Catalog gaps are real: some items (bananas, a specific brand of waffles) just weren’t listed for delivery anywhere I checked, so those still get bought in person sometimes. The system flags the gap instead of pretending it doesn’t exist, which I’d rather have than a silently wrong order.
TLDR
Dropped the “buy everything from one big warehouse store” plan because it added checkouts instead of removing them. Landed on one weekly fresh-food order plus one monthly shelf-stable order, both built against a real meal plan and real dietary constraints, both shown to me as a cart before anything gets charged. A cron job handles the one piece that’s safe to fully automate: telling us what’s for dinner before I’ve had coffee. Still refining the store side. The meal-preferences.md file is the real one we use, not a sanitized example, so take it and make it yours.