A closer look · 2026

FastChow.

A rebuild of the Chowdeck mobile app.

Launch to a loaded home feed.

I rebuilt the Chowdeck mobile experience from the ground up, with a focus on performance, responsiveness, and removing friction from the flows people use every day.

This was not a visual recreation. I looked at the parts of the existing experience that felt slow, repetitive, or harder to use than they needed to be, then redesigned and reimplemented those interactions on a more responsive architecture.

There is no public Chowdeck API, so I had to work it out myself. Mapping it is normally where most of the time on a project like this goes, so I did it with Claude Code: I gave it access to my own Chowdeck account and let it work through the request logs the app produces, endpoint by endpoint, until the whole thing was written down. That freed up the time to spend on the app itself.

What came out of it is 28 screens over 38 endpoints, one codebase for both platforms, running against the live API with real vendors and real prices. I called it FastChow.

The goal

The goal was simple.

What would the Chowdeck app feel like if every interaction was fast, immediate, and thoughtfully designed?

I focused on the parts of the app people use most often:

  • Browsing restaurants and meals
  • Searching for food
  • Managing favourites
  • Tracking active orders
  • Funding a wallet during checkout
  • Viewing transaction history
  • Interacting with maps
  • Receiving app updates

Performance first

The biggest focus of the rebuild was performance, and most of it came down to render work rather than network speed.

The home feed was janky at first. The images and the list library were not the cause; the app was repeating work it did not need to. Every card on screen was being rebuilt while you scrolled, because of how the list was wired together. Once each card only redrew when its own content changed, the scrolling smoothed out. That was most of the fix, before any library got swapped.

The rest is the same idea in different places. Screens show what they already have and refresh underneath, so going back somewhere is instant instead of a spinner. Cards reuse the same views as you scroll instead of building new ones. Tabs load when you first swipe to them and stay loaded, with the next one warmed up in the background, so swiping between search tabs does not stall.

The bag works this way too. It lives on your phone first. Tapping plus updates the screen straight away and the server catches up a moment later, in one batch, instead of a request per tap. You are never waiting on the network to find out whether your own tap counted, and rapid taps cannot fight with a stale reply.

The difference is most noticeable on lower-end Android devices, where a poorly optimised interface turns sluggish quickly. The objective was not to make the app technically faster. It was to make it feel faster.

Adding to the bag. The total moves on the tap, not on the response.

Switching tabs

The tab bar is the most-tapped thing in the app, so it should never be somewhere you wait. Home, Orders and Account switch the instant you press them, and they hold the place: what you had loaded and where you had scrolled to is still there when you come back.

You can hammer between all three and it keeps up. No flash of empty screen, no reloading something you were already looking at a second ago.

Tapping between the three tabs as fast as I can. Each one is already there.

A more fluid update experience

App updates are usually disruptive. You get a modal you cannot dismiss, or a trip to the store, and it lands in the middle of whatever you were doing.

Here, an update shows up as a banner above the feed. You can ignore it and keep going. If you take it, the new build downloads in the background while you carry on using the app, and the banner turns into a restart when it is ready. The update stays clear and easy to finish without taking the app away from you first.

It ships over the air, so a fix can reach people the same day instead of waiting behind a store review.

Available, downloading, ready to restart. The feed stays usable the whole time.

Search that gets out of the way

Search is one of the most important features in a food delivery app, and one of the easiest to get wrong. It is also the part of the current app people complain about most.

The empty state carries recent searches and a set of categories, so the common case is a tap instead of typing. Queries are debounced and cancelled as you type, so fast typing does not queue up stale requests. Results stay on screen while the next set loads instead of blanking out. Results come back grouped by store, and items can be added straight from the list.

The result is search that works the way it should on mobile: type, find, move on.

An empty query to grouped results, with no full-screen loading state in between.

Favourites that actually work

Favouriting is a simple interaction, but it has to feel reliable. In the current app it can be inconsistent, and you are left unsure whether the tap did anything.

Here the heart fills the moment you press it, and the request goes out behind that. If it fails, the heart goes back. Your favourites row on the home screen updates at the same time, so you can see the place you just saved without going looking for it. Small interaction, big difference in how the app feels.

Every heart fills on the tap, and the favourites row keeps up.

Order tracking without constantly going back

Keeping up with an order is one of the biggest sources of friction in the whole product. Normally you end up navigating back and forth between screens to find out whether anything has changed.

The rebuilt order screen keeps itself current. Status, the rider on a map, and the full history of everything the order has been through, all in one place. When I am looking at my order, I should be able to trust that I am seeing the current state.

Live status, the rider's position, and the order timeline underneath.

Wallet balance updates during checkout

Funding a wallet at checkout has the same problem as the order screen. You add money, and then you are moving between screens, or closing and reopening the app, just to get the balance to catch up.

I redesigned it so the balance updates in the flow you are already in. You top up, you see it land on the checkout screen, you place the order.

Checkout, and the wallet behind it.

Transaction history

Chowdeck has this already. I built my own version because the wallet felt incomplete without it, and because it is the thing that makes a balance make sense: top-ups, order charges, refunds, partial payments and gift card redemptions, grouped by month and filterable by balance type.

Addresses

Choosing where your food goes is a small screen that gets used constantly, so it should be quick and quiet. Saved addresses are right there, adding a new one is a search field and a couple of taps, and switching between them does not reload the world around it.

The map that does exist, on an order that is already on its way, gets the same treatment. In the app I was using this is one of the clunkier areas: taps lag behind, panning stutters. Mine stays smooth.

A restaurant menu with category tabs and a favourite control
Transaction history grouped by month
Setting the amount and message on a gift card
Menus and favourites, transaction history, addresses, and gift cards.

Every screen

I stayed as close to Chowdeck's look as I could without treating it as a spec: the greens, the accent colours from the category tiles, the chunky corner radii, and Plus Jakarta Sans throughout. Some of it is yours, some of it is my read on it. This page is set in the same colours and type.

  1. FastChow onboarding screen

    Onboarding

  2. FastChow home screen

    Home

  3. FastChow search screen

    Search

  4. FastChow results screen

    Results

  5. FastChow store menu screen

    Store menu

  6. FastChow menu search screen

    Menu search

  7. FastChow bags screen

    Bags

  8. FastChow account screen

    Account

  9. FastChow wallet screen

    Wallet

  10. FastChow transactions screen

    Transactions

  11. FastChow gift cards screen

    Gift cards

  12. FastChow gift setup screen

    Gift setup

  13. FastChow update banner screen

    Update banner

The whole app, in one take

Two and a half minutes of the app, unedited, running against the live API.

One take, start to finish: cold start, browsing, a bag built across several stores, checkout, tracking, wallet, gift cards, search. Running against the live API, so everything on screen is real.

Jump to

How it is built

Everything the app knows how to ask for lives in one place: a separate package of 16 modules, one per area of the product, with every response checked as it arrives. If Chowdeck changes something on the side, it fails loudly in one spot instead of quietly breaking a screen.

The app on top of it is Expo and React Native, so iOS and Android come from the same codebase, and updates can go out over the air.

Expo SDK 57
router, dev client, over-the-air updates
React Native 0.86
new architecture
TypeScript
end to end, including the API package
TanStack Query
caching, revalidation, optimistic writes
Zustand
local-first bag state
Reanimated 4
gestures and transitions
FlashList v2
recycled list rendering
Shopify Restyle
design tokens
Zod
runtime contracts on every response
React Native Maps
tracking and address picking

The result

The biggest improvements here are not new features. They are the moments people repeat constantly: searching, scrolling, switching screens, favouriting, checking an order, funding a wallet, waiting for an update.

The idea was simple. Remove the waiting, remove the unnecessary navigation, and make every interaction feel immediate.

Android

Download the APK

Install it directly. You may need to allow installs from your browser.

iOS

Join the TestFlight

If the invite is full or the link gives you trouble, leave your email and I'll add you by hand.

FastChow is an independent rebuild, built as a portfolio piece. It is not affiliated with, endorsed by, or distributed by Chowdeck.

Other apps I've built