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.