Getting Her Recipes Into Dinder
The Pinterest API approval process runs one to two weeks, with no guarantee at the end. I wasn’t going to sit idle waiting for approval that may not come. I needed Dinder to work with her recipes whether Pinterest said yes or not, so I started designing for both outcomes at the same time.
The immediate move was URL paste. At minimum, it gave those 2,000 recipes an entry point into the app. She could paste a Pinterest recipe link directly into Dinder, the app would extract the ingredients, and it would land in her shopping list. Not elegant for 2,000 pins, but it meant the Pinterest integration wasn’t load-bearing. If approval never came, the feature still worked.
While that shipped, I started figuring out how to get her boards in at scale. I’d already connected Airtable to Claude on another project, so it was the natural starting point. Google Sheets was considered but would have required its own approval process, which defeated the point. I tried a few scrapers before finding one that worked. Titles, images, board names, and pin URLs, all extracted and uploaded to Airtable. She has over 20 boards, some organized by appliance, some by category, and one called “Yummy” that’s basically everything else. Over 2,000 pins across all of them.
The first export didn’t include destination URLs, just Pinterest pin URLs. Without the recipe URL there was nothing to extract ingredients from. But Pinterest pin URLs redirect to the source recipe page when followed. Dinder could follow that redirect server-side and land on the actual recipe. The data I needed was already in what I had.
Pinterest eventually approved the app. I moved from the Vercel subdomain to app.jarrodmurray.com, which Pinterest wanted anyway, a registered domain tied to a real entity with a live privacy policy. Both the Airtable integration and the URL paste stayed in the product. The approval unlocked a cleaner path, but the app didn’t need it to work.
From Meal Planner to Grocery Platform
With her recipes in the app, I started a discovery conversation with Claude about how groceries actually work in our household. Not just meal ingredients, the whole weekly shop. What came out of that conversation reframed everything: staples dominate our list. Bread, milk, eggs, things we buy every week regardless of what’s for dinner. Recipe ingredients are maybe 30% of what we actually purchase. Dinder was solving a fraction of the problem.
The bigger opportunity was getting everything into one place and pushing it directly into a cart. I researched what was actually available. Instacart was the clearest fit but ran a 30-40 day approval process. Walmart had no public API. Kroger’s Cart API was developer-friendly but required a Kroger account. Another approval process, another dependency, another wait. I’d just been through that with Pinterest. I wasn’t doing it again.
So I designed something custom. The first layer was named lists: a place to codify the staples we buy every week by store. Aldi gets our primary shop. Meijer covers whatever Aldi doesn’t carry or runs out of. The lists surface alongside meal ingredients when it’s time to generate the shopping list. One consolidated list instead of a mental one running alongside the app.
The second layer was getting that list into an actual cart. Aldi doesn’t have a public API, but their app has a “Buy It Again” tab, everything the household has purchased before, known brands, known sizes, already approved with our wallets. I brought that to Claude and it immediately recognized what it changed: the agent doesn’t need to guess. It checks purchase history first, uses it if there’s a match, and only flags something for review if nothing matches.
The key architectural decision was keeping the logic in code, not tokens. Navigation, search, adding to cart, all of that is deterministic, handled by code. AI makes exactly one call per ingredient: given these search results, which product is the right match? That’s it. The agent doesn’t decide which button to click. It doesn’t interpret the page. It answers one bounded question and code does the rest. When I’m ready to shop, Dinder generates a structured prompt, I paste it into the Claude in Chrome extension, the agent works through “Buy It Again,” builds the cart, and flags anything it can’t match. I review and submit. The repetitive part is handled. The judgment stays mine. The friction is gone.