Ride-hailing application, 2026
Bike Taxi
Rider and driver Android apps plus a web admin panel, from one Flutter codebase on Firebase with real road routing.

Overview
A bike-only taxi MVP. Riders set pickup and drop on a map, see the fare and book. Drivers register, wait for approval, go online, accept and run the trip. An admin approves drivers and oversees rides from the web. It is a portfolio demo: no real riders, drivers or trips are behind it, and the screenshots show sample data.
Engineering approach
- One Dart codebase builds three apps: Android flavors for rider and driver, and a web build for admin.
- Security lives in Firestore rules, not in the clients, and the rules have their own test suite against the emulator.
- A single decision to book: one vehicle type, so no tiers and no picker.
The life of a ride
- Requested
- Accepted
- Started
- Completed
Stack
Flutter, Dart, Firebase Auth (phone OTP), Cloud Firestore, Security rules tests, flutter_map, OpenStreetMap, Valhalla routing
Technical challenges
A fare the client cannot fake
- Problem
- The rider app routes and prices the trip, and anything a client sends can be forged.
- Solution
- Firestore rules reject a ride unless the road distance is plausible for the pins (no shorter than the straight line less 300 m, no more than four times it plus 2 km) and the fare matches the published formula.
- Result
- The rules check plausibility, not the exact route. A production launch should route and price in a Cloud Function.
Only one driver gets the ride
- Problem
- Several approved drivers can see an open request at once.
- Solution
- The rules allow one transition, requested to accepted, and require the driver to take it as themselves, with name, plate and phone matching their record.
Keeping three roles apart
- Problem
- Riders, drivers and admins share one database.
- Solution
- Read and write access is scoped per role and per ride state. Drivers cannot approve themselves, and strangers cannot read a ride. Nine rules tests cover these cases.
Routing failures a rider can act on
- Problem
- A routing service fails in ways that mean nothing to a rider.
- Solution
- Valhalla error codes become plain instructions such as "Move the pin closer to a street", and a timeout gives a clear message instead of a stuck screen.
Gallery



Outcome and status
A complete demo that runs against the Firebase emulators, with an MIT licence and a documented path to going live.
Known limits
- No address search, online payment, push notifications or ratings.
- Driver location is shared only while the app is in the foreground.
- Routing uses a public demo server by default. A real launch needs its own Valhalla.