Sani's A-fare
Shared weekly meal-planning PWA
React + Vite + Supabase · Live, in daily use
A shared meal plan that knows your preferences, respects your constraints, learns from what you actually cook, and saves you an hour every week.
Why I built this
Every Sunday evening, my wife Sanchi would block off an hour to plan the week's meals. She'd decide what to cook, check what's in the fridge, balance nutrition and protein, plan for leftovers, and build a grocery list. I'd watch from the couch, exhausted for her.
We knew every input by heart. We had the same constraints every week — no dish repeated, Indian lunch paired with non-Indian dinner, leftovers the next day. We knew what we wanted as output: 14 meal slots filled intelligently. It felt like a perfect problem for automation.
So I built it. Defined the product, designed the UX, wrote the algorithm, built the frontend and database. We've used it every single week since launch. Sanchi hasn't spent a Sunday evening on this in months.
How it works
The app does three things:
- Maintains a library of recipes. Just title, source URL (Instagram, YouTube, blog), and notes. No ingredients, no instructions — you cook from the original link.
- Generates a weekly plan (Mon–Sun, 2 meals a day = 14 slots) with smart rules: no dish repeats within 3 weeks, Indian lunches paired with non-Indian dinners, leftovers auto-slot the next day, and loved meals weighted higher in the selection algorithm.
- Lets you swap any single slot without regenerating the whole week. If you're sick of what the algorithm picked for Tuesday, tap it, pick a different dish, and move on.
There's no grocery list export. With two people and a recipe library you've built over months, you glance at the source links and know what to buy.
The app
Weekly plan
Dish database
Dish detail
Swap dish
Edit recipe
Choose category
Recipe added
The app in action: plan, library, recipes, swapping, editing, and iOS Shortcut capture. Click any screenshot to view fullscreen.
The constraints
Five rules drive the plan generation. They're locked in — not configuration, not toggles — because constraint-driven design is what makes this feel personal:
- Love-weighted picks: Every ♥ you mark on a past meal increases its chance in future plans. The algorithm learns what actually stuck.
- Cuisine balance: Lunch prefers Indian. Dinner prefers non-Indian. Makes the meal variety feel intentional, not random.
- No repeats across 3 weeks: Prevents the same dish cycling every 2 weeks.
- Leftovers auto-slot: If a recipe has
cook_once_eat_twice, the next lunch or dinner is automatically marked as a leftover reference. - Swap, don't regenerate: Regenerating throws away 13 meals you were fine with. Swap preserves the mental model. You stay in control.
The stack
React 19 + Vite 7 for a snappy, installable PWA.
Supabase for the backend: Postgres for recipes and plans, Google OAuth for sign-in, Realtime for syncing across devices, and Deno Edge Functions for the iOS Shortcut capture that scrapes OG:title from recipe links.
Hosted on Vercel. Two people, shared household, no servers to manage.
What's next
The core product is stable. No bugs. We use it every week.
Next directions are about depth, not breadth:
Faster recipe capture — Improve the iOS Shortcut, maybe auto-suggest similar recipes when you save a new one.
Breakfast and snacks — Extend the planning grid to include breakfast, lunch, dinner, + snacks if the person actually wants to plan those.
Patterns — Show what meals we keep vs. swap. Which recipes are keepers? Which cuisines do we actually prefer? Let the data talk.