-
-
Landing Page
-
Login Page
-
Receipt Upload Menu
-
Receipt Scanning Process
-
Ingredients Identified from the reciept
-
Current Pantry
-
Shopping List
-
Explore Recipes (recipes for which you may not have all the ingredients)
-
Curated Page
-
Recipe (from curated page: you have all the ingredients)
-
Automatic pantry update after making a meal
-
Upload Menu
-
Dish Recognition Feature
-
Dish Recognition + Recipe Breakdown
-
Curated Weekly Meal Schedule
mise en feast
Inspiration
Americans throw out about a third of the food they buy. Most of it isn't a decision. It's the spinach that slid to the back of the fridge, the half carton of cream nobody remembered, the "I'll cook that this week" that never happened. Every pantry app we tried fixed this by making you log everything you buy and everything you eat, which nobody does for more than four days. We wanted the opposite: an app that knows what's in your kitchen without you telling it, and turns "what's going bad" into "here's dinner."
What it does
mise en feast turns a grocery receipt into dinner.
- Scan a receipt and the pantry fills itself.
GV MLK 1GALbecomes Milk, 1 gal, with a shelf life, a serving count, and an estimate of how fast a household your size goes through it. Non-food lines get set aside, not deleted. - The pantry runs itself. Quantities fall on their own over time. When an estimate hits zero the app asks "Still have this?" instead of guessing, and buying the same thing again stacks as a new batch instead of overwriting the older one's expiry.
- Swipe to dinner. Dishes are dealt as cards, ordered by what's expiring first. Curated is strictly what you can cook right now with what's on the shelf. Explore is one to three ingredients away, and those ingredients drop straight onto the Shopping List. "I made this" takes the servings out of the pantry.
- A weekly plan, three meals a day, built from your pantry and your preferences, with the week's missing ingredients added to the list in one tap.
- A kitchen helper you can talk to: "what can I make in 15 minutes," "I finished the milk," "put lemons on my list," "no heavy cream, what do I use?" It reads and updates your real pantry through a small set of guarded tools.
- Cook Mode, full screen, one step at a time, with "simmer 10 min" turned into a tappable timer.
- A kitchen report: how many items you used before they expired this week, and roughly what that saved you.
Every recipe is cross-checked against the pantry before it's shown, every dish gets its own generated photo, and the whole thing works in light and dark on a phone.
How we built it
- Frontend: plain HTML, CSS and ES modules. No framework, no build step. A swipe deck with real spring physics, glass controls, and one shared token file for the cream-and-emerald theme.
- Receipt reading and recipes: a FastAPI backend calling Gemini with structured JSON schemas: one call to read the receipt photo, a two-pass "brainstorm, then write the recipes" flow for the deck, and one call for the seven-day plan.
- The assistant: Claude on Amazon Bedrock with tool use. The model never touches the database. It calls tools like
mark_food_gone,add_to_shopping_listandsuggest_substitutions; the backend validates each call and hands the frontend a structured action to apply through its normal path. - Pantry math: deterministic and local. Current amount = initial − burn rate × days − what cooking used. Shelf lives and burn rates come from a food catalog; units are standardized (g / ml / pcs / pack) so "1.4 lb" and "635 g" mean the same thing everywhere.
- Data: Supabase for auth and per-user persistence with row-level security, localStorage as the instant cache and demo mode. Generated dish images are cached in IndexedDB so they load once.
- Hosting: Vercel, with the Python backend as a serverless function mounted at
/api.
Challenges we ran into
- Receipts are hostile. Store abbreviations, missing units, weights in pounds next to counts in dozens. Getting from
CHKN THIGH 1.4LBto a shelf life and a serving count took a catalog, a unit normalizer, and a lot of test receipts. - "Do I have this?" is harder than it sounds. Early on, "coconut milk" matched milk and "fresh noodles" never matched egg noodles. We ended up with a proper matcher: alias tables, head-noun agreement, and form-modifier rules (powder, paste, juice, canned), re-run against the live pantry every time a card renders.
- Two models, one contract. Gemini writes the recipes, Claude runs the chat, and both have to respect the same allergy, diet and household rules. We enforce the hard rules again in code after every model call so a model slip never reaches the screen.
- Servings. Recipes say "serves 2," households are 3.5, and a pantry says "8 oz." Making all three agree, and scale together, touched more of the app than any other feature.
- Latency. A full recipe with steps is slow, so suggestions come back without steps and the steps are written only when you open the card.
Accomplishments that we're proud of
- Zero logging. From receipt to first dish card is one photo and one tap.
- The pantry is honest about uncertainty. It asks instead of guessing, and it never merges two batches of the same food into one fake expiry date.
- The assistant can change your pantry and your list, and it can't do anything we didn't explicitly allow.
- The whole app is a few static files. It opens instantly, works offline with built-in recipes, and still feels like a native app on a phone.
What we learned
- The best inventory UI is no inventory UI. Every field we removed made people more likely to keep using it.
- Structured output plus deterministic post-processing beats prompt engineering. Ask the model for JSON, then verify everything you can in code.
- Food waste is a memory problem, not a motivation problem. People don't want to waste the cream. They forgot it existed. Surfacing "uses your cream · 2 days left" on the first card is worth more than any dashboard.
What's next for mise en feast
- Shared households: two people, one pantry, one shopping list.
- Barcode and photo-of-the-fridge input for things that never came with a receipt.
- Price-aware suggestions that learn your store's prices from your own receipts.
- Smarter burn rates that learn from your check-ins instead of a fixed catalog.
- A native app with push reminders the day before something turns.
Built With
- amazon-web-services
- claude-api
- css
- fastapi
- gemini-api
- godaddy
- html
- javascript
- node.js
- postgresql
- python
- sql
- supabase
- vercel
- web-speech-api

Log in or sign up for Devpost to join the conversation.