Project 02

Waslha

Post a delivery. The nearest driver takes it.

A complete delivery platform where anyone posts an order and nearby drivers claim it — merchant, driver and sales-rep apps in one Flutter codebase, plus an Arabic admin dashboard.

FlutterDartRiverpodFirebaseCloud FunctionsGoogle MapsNext.js
9:41
Merchant home with a one-tap create-delivery card and today's stats
The mission

Why this exists.

Sending a package across town shouldn't mean calling a courier company, waiting for someone to arrange it, and haggling over the price. Waslha turns a delivery into a post: set pickup and drop-off, see a fixed price up front, and let the closest driver with the right vehicle take it. It works for shops shipping every day and for anyone who needs something delivered urgently.

Inside the build

Thought through, end to end.

6 highlights

Four Connected Products: Merchant, driver and sales-rep apps from one Flutter codebase, plus a Next.js admin dashboard for operations.

Nearby Dispatch: Open jobs are filtered by distance from the driver's live location and by vehicle type — bike, motorcycle, car or van.

Paste-a-Link Locations: A shared Google Maps link resolves to coordinates, a road route and a readable Arabic address in seconds.

Trust by Design: Document review before drivers can work, merchant approval of each driver, ratings, and one-star blocks.

Built-in Revenue: Per-merchant commission, referral codes for sales reps, and payouts with receipts — all calculated automatically.

Arabic-First UI: Full right-to-left interface in Cairo type with an in-app switch to English.

The hard parts

Constraints I designed around.

The features that look effortless were the ones that fought back.

  1. 01

    Prices no one can tamper with

    The obstacle

    Fee maths on the phone can be edited, and negotiating every delivery kills trust between merchants and drivers.

    How I solved it

    Orders are only created through Cloud Functions that read the live pricing config, price the job from real road distance plus a fixed timing surcharge, and write the document. Firestore rules block clients from writing orders directly.

  2. 02

    Proving the delivery happened

    The obstacle

    A simple "Delivered" button invites fake completions and disputes about who received what.

    How I solved it

    Every order carries a one-time QR code the recipient shows. The driver's scan closes the order on the server, so earnings and commissions only count after a real handover.

  3. 03

    Bulk orders that stay consistent

    The obstacle

    One pickup with several drop-offs means partial accepts, single-leg cancels and prices that no longer add up.

    How I solved it

    Modelled a bulk order as one document per drop sharing a batch ID. Drivers claim all-or-nothing, and cancelling one leg re-prices the remaining legs in a single server call.

Next project

Supporter

Campaigns that rally a community

View next project
9:41
Home dashboard with points, groups, and Do next actions