Paulo Ferri Souza
All case studies

Food Saver: pantry, recipes and shopping

A mobile-first application that connects pantry tracking, recipe suggestions and shopping. Add food from photos or free text, see what needs using first, and update stock when you cook.

A working beta with reviewed food capture, recipe matching and stock updates in one flow.

Role
Full-stack developer
Stack
  • React
  • TypeScript
  • Hono
  • Claude API
  • Vite
  • Zod
Product walkthrough · 1 min 15 sec · English captions over the Portuguese interface, no audio. Recorded in demo mode with sample data.

The problem

Food Saver began as my final project for a postgraduate programme in full-stack development. I built and presented the original application with Next.js and Node.js. As AI capabilities advanced, I revisited the product to simplify its everyday use and make adding food less work.

A pantry app is only useful while its inventory reflects what is actually in the kitchen. Entering every item, weighing leftovers and keeping expiry dates up to date makes that inventory another chore. The first version of Food Saver exposed two connected problems: getting people to add their food, and giving them a reason to come back.

Food Saver 2.0 connects those updates to things people already do: unpacking groceries, choosing a meal and cooking. Exact quantities are optional, and estimated expiry dates stay visibly marked as estimates.

What I built

  • Food capture with a review step. Photos, free text and voice dictation become editable drafts. Users check the recognised items, storage locations and estimated shelf lives before saving. A checklist of common foods offers another way to get started.
  • A daily view of the kitchen. Items approaching their expiry dates appear first, alongside recipes matched to the available ingredients. A short check-in asks whether older items are still there, running low or gone.
  • Recipes connected to stock. Users can import a recipe from text or ask for one based on their pantry. Marking a recipe as cooked opens a proposed stock deduction for review before it is applied.
  • Shopping connected to the pantry. Missing ingredients can go onto the shopping list. Checked purchases become pantry items when the user confirms they have arrived home.

The video above shows these flows in the Portuguese interface, with English captions, using sample data and demo responses for AI capture.

Technical decisions

  • AI suggests; the user confirms. A Hono API handles Claude requests for food extraction and recipe generation. Zod schemas define and validate the structured results. The front end presents the extracted food as a draft, keeping uncertain recognition separate from confirmed stock.
  • Quantities can be exact or approximate. A stock item can hold a number and unit, or a simple remaining level. Cooking deductions convert compatible units and consume the lots that expire first (FEFO). When amounts are unknown or units do not match, the user adjusts the remaining level instead.
  • Recipe ranking is explicit domain logic. Matching considers ingredient coverage, foods close to expiry and favourites. The ranking and deduction rules live outside the screens, so the core pantry workflow does not depend on an AI response.
  • Local persistence and a bounded AI service. The React application keeps kitchen state in localStorage. The API holds the AI credentials and enforces a daily request limit. Without a key, a local parser handles text and sample responses let the photo workflow be explored in demo mode.

Outcome

The project grew from a postgraduate final assignment into a redesigned beta with AI-assisted capture. Pantry maintenance, recipes and shopping now form a complete loop, from adding groceries to reviewing what remains after cooking. The next step is validating photo recognition and everyday use with real kitchens.