Anirudha
← Work
App I BuiltReact + SupabaseShared Household~10 min read

Sani's A-fare

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.

14meals planned per week
<1sto generate each plan
2household members, shared
livein daily use

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

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:

Phase 1

Faster recipe captureImprove the iOS Shortcut, maybe auto-suggest similar recipes when you save a new one.

Phase 2

Breakfast and snacksExtend the planning grid to include breakfast, lunch, dinner, + snacks if the person actually wants to plan those.

Phase 3

PatternsShow what meals we keep vs. swap. Which recipes are keepers? Which cuisines do we actually prefer? Let the data talk.