Skip to content
All work

Banana Leaf: restaurant software that works offline

A design-stage restaurant system for Sri Lankan venues: mobile ordering, a kitchen display and an admin dashboard, built to keep running through outages.

Status
Status: Design stage
Role
Product architecture and interaction design
Stack
  • Flutter
  • React
  • Next.js
  • Supabase
  • SQLite
  • Turborepo

Banana Leaf is a restaurant system I'm designing for Sri Lankan venues that run on paper today. It has three surfaces: a Flutter app for taking orders, a kitchen display, and a web dashboard for the owner. All three are designed to keep working through power cuts and dropped connections. It is at the design stage: the screens are drawn and the backend is being scaffolded.

The problem

Global point-of-sale products assume steady internet, a long training session and Western menus. Sri Lankan restaurants get none of the three:

  • Scheduled power cuts. Outages during evening service are expected. A system that stops when the network does is no use.
  • Staff with mixed experience of technology. A cook who has never used a smartphone has to run the kitchen display on day one, with no manual.
  • Orders from everywhere. Walk-ins, phone orders, delivery apps and chat messages arrive at once. One queue is the main win.
  • Menus that don't fit "item plus add-on". Rice and curry is built per plate from the day's dishes, and festival menus rotate through the year.

Three surfaces, one local-first core

Three surfaces that keep working offline

Every write lands on the device first. Supabase is where devices sync, not what they depend on. Select a part to read what it does.Select a step to see what it does.

Connections: Mobile ordering to Local store (writes first); Local store to Sync queue; Sync queue to Supabase (syncs when online); Supabase to Kitchen display (pushes new orders); Supabase to Admin dashboard.

Daily reconciliation screen: the day's total split into cash, card and digital, a payment mix chart and a list of transactions.
End-of-day reconciliation across cash, card and digital. Mockup data.
Export report dialog: choose a report type, a date range and a file format of CSV, PDF or Excel, and tick the fields to include.
Report export: pick the report, the dates and the format. Proposal-stage design.
Two phone screens: an inventory list with low and out-of-stock items flagged, and a stock adjustment sheet with add, remove and waste, a quantity stepper and a reason.
Stock on the phone: low and out items are flagged, and every adjustment records a reason. Proposal-stage design.

Why local-first

An early plan was online-first with an offline fallback. I dropped it. A fallback mode makes a two-tier product, and staff in a busy kitchen can't be expected to know why something works one minute and not the next. So the device's own database is the source of truth, every feature is built against it, and connectivity is only a sync concern.

That makes conflicts a real design problem. Two offline devices can change the same order. The design uses last write wins on the update time, and tells the shift manager when sync finds a real conflict, so a person settles it.

Taking an order during a power cut

  1. 1Order on the phoneThe waiter taps menu photos. The order is saved to the phone's database straight away.
  2. 2Queue the changeThe write joins the sync queue. A status bar shows the app is offline, in the warning colour, so it is seen in a loud room.
  3. 3Connection returnsThe queue replays in order against Supabase, backing off and retrying on failure.
  4. 4Kitchen and owner catch upRealtime pushes the order to the kitchen display and the dashboard. Conflicts go to the shift manager.
Three phone screens: a load-shedding mode with the power-cut schedule and battery time left, the dashboard working offline with orders waiting to sync, and a receipt-printer test.
Built for power cuts: a load-shedding mode, an offline banner and a receipt-printer check. Design mockups.

Designed for no training

Every primary action has to be doable by a new staff member without help. That rules things out:

  • No text-only menus. Every item has a photo, so reading speed and language matter less.
  • No "Are you sure?" dialogs for routine actions. Voiding an order takes a deliberate swipe instead.
  • Big targets. Kitchen buttons fill the bottom of each order card, so wet or gloved hands can use them.
A language screen offering English, Sinhala and Tamil, beside the kitchen display settings for alerts, ticket font size and timers.
Language choice in English, Sinhala or Tamil, and kitchen display settings for sound and ticket size. Proposal-stage designs.

The visual language follows from the same need: mango orange on dark concrete is loud enough to read across a kitchen in poor light.

Targets

These are design targets, not results. Nothing has been measured yet.

TargetGoal
Order accuracyAbove 98%
Service speed20% faster, three months after launch
Staff adoptionEveryone using it within the first week

Building for offline-first conditions?

Power cuts, patchy connections and staff new to software. If your system has to work when the network doesn't, book a call.

Book a call (opens in a new tab)

wihithat@gmail.com

  • Status: In developmentRaava's own product

    An offline-first app for small Sri Lankan pharmacies: invoice-photo receiving, price-guarded billing and batch stock. Phase 1 is built and in testing.

    Evidence: Phase 1 built; user acceptance testing pending; no pilot yet.

    Stack: React · Vite · TypeScript · Tailwind CSS

  • Status: Shipped

    A phone-first scoring and live leaderboard app for a Sri Lankan New Year community event on 18 April 2026, built in two days.

    Evidence: 237 commits over 17 and 18 April 2026, the last on event day.

    Stack: Next.js · Supabase · TanStack Query · Tailwind CSS