Skip to content
Back to workDownload as PDF

PROJECT · 2025 — Present

A kitchen assistant that thinks ahead — Pantry Chef

Most food gets wasted because awareness comes too late. I designed and built a React Native app that tracks what's in your kitchen, warns you before things expire, and uses AI to turn what's left into something worth eating.

Role

Product Designer & Developer (solo)

Timeline

Ongoing · 2025 – Present

Team

Personal project

Stack

React Native, Cursor, Figma, AI APIs

Project hero for A kitchen assistant that thinks ahead — Pantry Chef

Food waste isn't usually about carelessness — it's about visibility. People don't check expiry dates when they're cooking at 7pm. They don't remember the yogurt at the back of the fridge until it's already gone. Standard reminder apps treat food like calendar events, which doesn't match how people actually think about their kitchen.

01 — THE PROBLEM

The warning always comes one day too late

I wanted to build something that lives one step ahead: you add items when you buy them, and the app does the work of tracking, warning, and suggesting what to do before anything goes bad.

The secondary problem was friction at the point of entry. Typing out every grocery item manually kills the habit in a week. The app needed a faster path in — barcode scanning — so adding items took seconds, not minutes.

02 — APPROACH

Design around the moment of purchase, not the moment of disposal

Most food waste apps focus on the disposal end — "you have 3 items expiring today." That's too late to change behavior. I designed the flow around the purchase moment: scan the barcode, confirm the quantity, set the location (fridge, freezer, pantry), and the app handles everything after.

The UX principle guiding every decision was reduce cognitive load at the right moment. When you're unpacking groceries, you have 30 seconds per item. When you're cooking at midnight, you want one tap to get a recipe — not a settings menu.

I used Cursor to accelerate the React Native build, which let me stay in design thinking mode while still shipping real, functional code. Figma for the system, Cursor for the build, AI APIs for the intelligence layer.

03 — DESIGN DECISIONS

Five decisions that shaped the product

Decision 1: Streak and gamification on the home screen

The home dashboard opens with "Good morning, Chef!" and a streak counter — currently showing 16 foods rescued. This wasn't decoration. Habit-forming products need a feedback loop that makes responsible behavior feel rewarding. The streak makes "not wasting food" visible and personal.

The alternative was a pure utility dashboard — just a list. It would have been cleaner but wouldn't have created any reason to open the app daily.

Decision 2: Storage location as a first-class filter

The pantry view has three tabs at the top: Fridge, Freezer, Pantry. This mirrors the physical reality of a kitchen, not a database category. People think in locations, not product types. Filtering by location first reduces the list to what's actually relevant in the moment.

Decision 3: Overdue state design

Items past their use-by date show a red "0 DAYS LEFT / OVERDUE" badge — high contrast, impossible to miss. But the detail screen doesn't just flag the problem. It offers two explicit actions: Consume or Dispose (waste). Marking something as wasted feeds the streak counter in reverse, creating a small but real consequence that nudges behavior.

Pantry Chef item detail with overdue badge and consume or dispose actions.
Item detail — overdue state with Consume and Dispose actions. Running low toggle auto-adds to shopping list.

Decision 4: Smart Recipes toggle per item

In the Edit Item screen, there's a "Smart Recipes" toggle. When on, that item becomes available as context for AI meal plan generation. This gives users control over what the AI considers — useful for dietary restrictions or items they're saving for something specific. Most apps apply AI globally; this makes it granular.

Decision 5: Region-aware AI

The profile screen stores a Recipe Region (ISO country code). The AI uses this to adjust meal style and terminology when generating guides and recipes — so a user in Germany gets different suggestions than a user in the US, based on what's culturally plausible to cook with those ingredients.

Pantry Chef edit item screen with toggles and date picker.
Edit item — quantity, use-by date, storage location, Smart Recipes toggle, and product photo in one screen.

04 — OUTCOME

What shipped

4

Core screens shipped

React Native

Cross-platform, one codebase

Internal testing

Real device, real data

Solo

Design, build, and AI integration

The app is in internal testing with a working pantry tracker, item detail and edit flows, overdue expiry states, AI recipe context per item, and region-aware profile settings. Barcode scanning is in the roadmap. The design system is consistent across all screens — dark nav bar, yellow/green accent palette, card-based layouts — built in Figma first, then translated directly into React Native components via Cursor.

This is a product I use myself. That constraint keeps every decision honest.

Pantry Chef profile with recipe region and subscription settings.
Profile — region-aware AI settings. Recipe suggestions adapt to the user's country and meal culture.

05 — REFLECTION

What building your own product teaches you

Designing for a client always has a buffer — there's a brief, a stakeholder, a business goal to anchor decisions. Designing for yourself removes that buffer entirely. Every choice is yours and there's no one to blame if a flow feels wrong at 11pm when you're actually trying to use it.

The biggest shift was learning to treat Cursor as a design tool, not just a code tool. When I could prototype a real interaction in minutes rather than hours, I made better decisions about what was worth keeping. The gap between Figma and shipped product got much smaller.

What I'd do differently: define the data model in Figma before touching code. I refactored the item schema twice because edge cases in the UI — partial quantities, unit switching, overdue vs consumed states — weren't obvious until I tried to build them.