← Back to projects
Swish: When the Kitchen Runs Out screenshot

Swish: When the Kitchen Runs Out

Speculative, 2026

A working mobile prototype for the one moment Swish still hands a paying customer to a phone call: an item running out mid-cook.

Overview

Swish is a 10-minute food delivery app in Bengaluru that cooks in its own kitchens. This is an unsolicited case study and working prototype for one gap in its app.

Swish already designs for unavailable items at browse time, where they're greyed out. The gap is after payment, mid-cook, when the only fix today is a phone call.

The Challenge

Two App Store reviews a month apart describe the same problem. In July, one customer got three separate calls as three items ran out, one after another. In August, another was talked into receiving the same dish twice.

I checked the app's version history through 2.1.3, and no substitution feature had shipped. The goal was to replace the call with something the customer could settle in seconds.

What I Did, and What I Didn’t

What I did

  • Found the problem in App Store reviews and confirmed in the version history that nothing had shipped for it.
  • Sampled Swish's real palette and measured its motion frame by frame from a 60fps screen recording.
  • Designed the flow, states and copy, from the lock screen notification to the resolved order.
  • Built it as a working React prototype with Motion, built with Claude, and deployed it live.

What I didn't

  • Work with Swish or use their data. I'm outside their delivery radius, so this is one screen recording, not real orders.
  • Pick the 40 second window from data. It's a guess, and their numbers would set it.
  • Use the real tracking screen. The recording stops at address confirmation, so the screen behind the sheet is my reconstruction.
  • Use real food photos or confirm the typeface. Images come from my Figma file and DM Sans is a close guess.

Studying the Real App

I wanted the fix to feel like Swish had shipped it, so I studied the real app before designing anything.

Palette sampled, not invented.

  • Brand green #2DB955, surface #FDFDFD, from the recording.

Motion measured frame by frame.

  • Nav push 150ms, bottom sheet 200ms, screen change 300ms.

Swish doesn't bounce.

  • Ease out with no overshoot, so nothing in the prototype springs.

Their own out-of-stock pattern.

  • Greyed out with a disabled control, reused instead of reinvented.

The Calls This Makes

One decision drives the rest: the kitchen decides, it doesn't ask. In a 10-minute app, a question costs more than a reversible wrong guess.

What ran out, what the kitchen already did, and that the 9 minutes still holds. If they never open the app, they've still been told everything.

Swaps only come from a small set the kitchen keeps on all day, so the July cascade of three calls is designed out.

Swaps normally sell for more than you paid, so the copy leads with the good news and gives the reason in the very next line.

"No thanks, refund" is never buried, and an item already in the order shows greyed out, so a duplicate can't happen.

The Flow

Four states, one sheet, on a screen Swish already has.

Notification and Swap

Problem

A phone call interrupts the customer and still needs an answer from them.

Solution

The lock screen notification explains everything. Tapping it opens straight onto the swap already in progress, with 40 seconds to keep it, change it or drop it.

Lock screen notification and swap sheet

Why it works

The customer is informed before they unlock, and acting takes one tap.

Override and Resolve

Problem

In the reviews, the agreed substitute also ran out, and another customer ended up with a duplicate.

Solution

Other options come only from dishes the kitchen always has, each with its price difference. Anything already in the bag is greyed out. Once resolved, the ETA hasn't moved.

Override list and resolved order

Impact

Same nine minutes, no call, and money is never a surprise.

Outcomes

This is a proposal, not a shipped feature, so these are design outcomes rather than measured ones.

That's the kachori sorted.Hopefully nobody gets three calls again.

Calls to sort a stockout

3 → 0

Change to the ETA

+0 min

New screens added

0, one sheet

Motion matched to the app

150 / 200 / 300 ms

What I Learned

Matching a product's restraint is harder than out-animating it. Measuring Swish's real timings, and then not adding a single bounce, made the prototype feel like theirs. I also learned to write down my gaps as clearly as my decisions.

Let's have a conversation now