// case study

Wamia

01 — The problem

Why it exists.

For Local customers, small shops (restaurants, groceries, bakeries) and freelance couriers.

  • There is no single place to order from several local shops.
  • Customers can't see where their order is.
  • Couriers juggle calls, addresses and order details from memory or on paper.
  • Orders from several shops at once are hard to coordinate.

02 — What I built

What it does.

  • Multi-shop cart

    Combine restaurants, groceries, fruit and bakery in one order (up to 3 shops).

  • Courier mode

    An online/offline switch and a daily dashboard (rides, earnings, distance).

  • Step-by-step rides

    Restaurant → pickup → customer, with an item checklist and swipe-to-confirm at each step.

  • Live map & route

    OpenStreetMap with the courier position and route.

  • Made for local users

    Tunisian Arabic interface (right-to-left), light and dark themes.

03 — Screens

A closer look.

04 — The stack & why

Tools, and why.

  • Flutter / Dart

    One codebase for Android and iOS, with full control over every pixel. That was essential for building a custom design system rather than default Material screens.

  • Riverpod

    The app shares state across many screens (cart across shops, current ride step, courier online status). Riverpod keeps that state predictable and testable, without tying it to the widget tree.

  • go_router

    Two roles mean two navigation flows. Declarative routes with redirects keep customers and couriers in the right place.

  • flutter_map + OpenStreetMap

    Free maps with no API key or billing, accurate enough for a city-scale delivery app, and easy to restyle for dark mode.

05 — Challenges & learnings

What was hard.

Challenges

  • One app, two roles

    Keeping the customer and courier experiences fully separated while sharing one codebase and design system.

  • The ride as a state machine

    Each ride moves through strict steps; the app must never allow an invalid jump (e.g. delivering before pickup).

  • Right-to-left Arabic UI

    Layouts, icons and the step tracker all had to mirror correctly.

Learnings

  • A small design system (colors, type, components) at the start saves hours on every new screen.
  • Explicit states beat boolean flags for any multi-step flow.