DEV3 Kerbora – Ride Hailing Laravel Script with Live Matching, Surge Fares & Driver Earnings (Flutter Apps)

A self-hosted ride hailing platform on Laravel 12 and Filament 4 with passenger and driver Flutter apps: live driver matching, fare quotes, surge pricing, cancellation fees, PIN start, cash trips and driver earnings. Admin and dispatch panels. Installer and demo data included.

by DEV3 TechnologiesVerified Author(0) 0 sales 1 viewsUpdated 05 Nov 2026

Video tour. Pick a section below to browse 112 screenshots in 22 sections.

App & phone tours

Tap play to watch each app. Nothing downloads until you do.

  • Driver app1:29
  • Passenger app1:29

Kerbora is a ride hailing platform that you host yourself, built by DEV3 Technologies on Laravel 12 and Filament 4, with two Flutter apps: one for passengers and one for drivers. A passenger asks for a ride, the matching engine offers it to nearby drivers ranked by true pickup time, and the trip runs from pickup to payment and rating. Staff work in an admin panel and a dispatch panel with a live map. The demo business operates in the fictional river city of Solvanna.

No live demo: 112 grouped screenshots and a desktop video tour show the 3D marketing site, the public pages, the admin and dispatch panels and both apps. Install it with the demo data to try every role on your own server.

Passengers

  • Sign in with a phone number and a six-digit code, pin a pickup and drop-off, and see four ride classes with the full fare up front, the seat count and the pickup time.
  • A live ride from matching to driver assigned, arrived (with the plate and a PIN and a waiting timer), in-trip and complete, with trip sharing, an SOS button that alerts dispatch with the trip and live position, and a destination change.
  • A cancel preview that shows the exact fee and the reason before you confirm, and a free-cancel window.
  • Cards, Kerbora credit or cash, a wallet, tips, receipts with every fare part, ratings, promos and a clear way to pay an outstanding balance.

Drivers

  • A driver app with an earnings dial, a slide to go online, an offer card with a draining countdown, route to pickup, an arrived button that checks the distance, PIN start, tolls added at completion and a cash-collect step.
  • Earnings by day, incentives with progress rings, a cooldown after repeated cancellations and cash-out.
  • Driver applications, document review and fleets (operators with a commission share) are managed in the admin panel.

Matching, fares and surge

  • A deterministic matching engine: offers last 15 seconds and go out in up to five rounds, ranked by pickup time, with an acceptance rule that an accept at the exact expiry second still wins.
  • A fare engine in integer minor units: base, distance, time, surge, promo, tip and fees, with a fare preview you can try in the admin panel. Pure fare, match and cancel maths share test vectors with the Dart code in the apps.
  • Surge pricing per area cell with a cap, step and a manual override with an expiry that is audited.
  • Pre-booked rides, with a dispatcher alert before they are due, and booking on behalf of a caller.

Admin and dispatch

  • An admin panel with trips in tabs (active, scheduled, completed, cancelled, no driver, flagged), a replay map of the driver's path, complaints, driver applications, fleets, fare preview, surge override, reports (gross bookings, take rate, acceptance, unfulfilled rate and cancellation causes), driver lookup, settings, audit and roles.
  • A dispatch panel with a live map in light and dark themes, booking on behalf of a caller and manual assignment.

What is included

  • The Laravel application with Composer packages and compiled assets inside (no Node.js or Composer on the server), both Flutter projects in apps/, the shared DEV3 Flutter package, a web installer and HTML documentation.
  • Demo data for the fictional city: about 42,000 trips over six months, 220 drivers and live traffic, with a base currency of US dollars.

Good to know

  • Stored-card charging is simulated only. Card payments work on the simulated gateway. Charging a saved card with Stripe, Razorpay or PayPal is not built, so a developer has to add it, and there is no pre-authorisation. Real push and payment gateways were never called.
  • The driver app has no GPS plugin. Positions come from a built-in trip simulator. For real driving you need to add a location plugin to the driver app (the app reads positions through one provider you can replace) and connect a map provider.
  • Masked calling is a stub. The call button exists but does not connect a real masked number: add your telephony provider.
  • The driver home screen scrolls slightly on small phones. On a 390 by 844 phone the dials and rows fit above the tab bar, but on shorter screens the home screen scrolls a little.
  • A driver cancelling in the last matching round ends the search. A driver cancel on round 5 goes straight to no driver found, and every driver who was already offered stays excluded. This was left as an open product decision.
  • Languages: the marketing site and the passenger app include a right-to-left Arabic layout. The admin and dispatch panels were not translated.
  • The apps were not tested on physical devices. They build as debug Android packages and run on the iOS simulator.
  • Use MySQL or MariaDB on a live site. The concurrency checks run on MySQL 8.
  • Name: Kerbora is a working name checked by a web search only, not a trademark clearance. Check it before you launch under it.
  • No hosted demo. The city, drivers and passengers in the screenshots are fictional.

Quality checks

Kerbora 1.0.0 passed the seven release gates of the DEV3 Laravel suite on the final code: static analysis (Larastan level 6, 0 errors), 157 Pest tests with 1,840 assertions, a front-end size budget, migrations and seeding on MySQL 8 and SQLite, a headless-browser pass over 121 pages and 15 happy paths with parallel-request race checks on MySQL, an installer test from the zip, and a secret scan. The passenger app passed analysis and 161 tests, and the driver app 202 tests, with debug Android and iOS simulator builds. A review of the matching and trip engine fixed nine defects before the apps were built. Lighthouse scores were not measured.

How it's built

Architecture, stack, key decisions and the quality gates DEV3 Kerbora passed before release.

The engineering behind Kerbora: matching, fare, cancel and surge maths as pure code shared with the Dart apps, a fixed trip-offer-driver lock order, lazy deadlines and card money applied only on confirmation.

The problem it solves

Ride hailing is a race with a clock. A trip is offered to several drivers, but only one may accept, and an accept at the last second must be treated fairly. A driver can go offline while an offer is live. A passenger can cancel as a driver arrives, and the fee depends on exactly when. Surge changes the fare while someone is deciding. Money is in several hands: card, credit, cash collected by the driver, tips, tolls and promos. The same maths must run on the server and in two apps without drifting.

Architecture and approach

Kerbora is a Laravel 12 application with Filament 4 panels at /admin and /dispatch, a public site, signed trip-share links and a REST API used by two Flutter apps.

Pure maths, shared vectors

The match engine, fare maths, cancel maths, trip split, surge and GPS filter are pure PHP classes. Their test vectors live in JSON files that the Dart ports in the apps also run, so server and apps agree to the cent.

One lock order

Every entry point goes through one trip engine that locks the trip, then its offers, then drivers (in ascending id order), with wallets last. It applies any overdue deadline before acting, so deadlines are enforced lazily and the scheduled tick only catches idle trips. Deadlock victims are retried, and range locks on the offers table are avoided by reading ids first and locking by primary key.

Fair and exact

Offer expiry uses whole seconds, so an accept at exactly the expiry second wins. Cash-out locks the wallet row itself, because the driver earnings wallet may go negative and a hold alone would not stop a double cash-out.

Card money on confirmation

Card money is applied only when the payment-succeeded event arrives. Late or duplicate payments are refunded. There is no pre-authorisation, because the shared core has none.

Quality gates and results

Kerbora 1.0.0 passed the seven release gates on the final code: 157 Pest tests with 1,840 assertions, 121 pages and 15 happy paths in a headless browser with race checks on MySQL, the installer test from the zip and a clean secret scan. The passenger and driver apps pass analysis and 161 and 202 tests. A review of the engine fixed nine defects, including a deadlock and an acceptance statistic that always read zero.

Limits are listed on the item page: stored-card charging is simulated, the driver app has no GPS plugin and masked calling is a stub.

Tech stack

Area Technologies
Application Laravel 12, Filament 4, Blade, REST API
Rides Pure match engine, Fare and cancel maths, Surge cells, Trip, offer, driver lock order
Apps Flutter passenger app, Flutter driver app, Shared test vectors, Demo trip simulator
Realtime Reverb (optional), Polling fallback, Lazy deadlines
Quality Pest, Larastan level 6, Headless browser smoke, MySQL race checks

Inside the build

Night grid hero: A dark Solvanna at night while a passenger pin pings a radar ring across the blocks. Night grid hero — A dark Solvanna at night while a passenger pin pings a radar ring across the blocks.

Match: Offer arcs reach three cars, two fade and one locks in with a light trail to the pin. Match — Offer arcs reach three cars, two fade and one locks in with a light trail to the pin.

Guides & articles

Practical guides and engineering write-ups for DEV3 Kerbora.

Ride hailing software: 7 things to check before you pick one

Last updated
Ride hailing software: 7 things to check before you pick one: DEV3 Kerbora

A ride hailing platform is a real-time system with money in it. Here are seven things to check before you pick software, with DEV3 Kerbora as the worked example.

Kerbora hero: a passenger pin pings a radar ring across a night city

1. How are drivers matched?

Ask how offers are ranked and how long they last. Kerbora ranks nearby drivers by true pickup time, offers for 15 seconds and tries up to five rounds.

2. Is the fare shown up front?

Passengers should see the full fare before they ride, with surge explained. Kerbora's fare maths runs in integer minor units and the same vectors are tested in the apps.

Choose a ride: four classes with the full fare shown up front

3. What does cancelling cost?

The fee should be shown before the passenger confirms. Kerbora has a free-cancel window and a preview with the exact fee and the reason.

4. What safety features exist?

Look for PIN start, trip sharing and an SOS that reaches a dispatcher. Kerbora has all three, and the masked calling button is a stub you must connect.

5. How do drivers get paid?

Drivers need earnings by day, incentives, cash handling and cash-out. Kerbora's cash-out locks the wallet so a double tap cannot pay twice.

Driver app: earnings by day with tips, bonuses and fees

6. What can dispatch do?

A live map, booking on behalf of a caller, manual assignment and a surge override with an expiry.

The live dispatch map

7. What is not finished?

Ask for the limits in writing. For Kerbora: stored-card charging is simulated only, the driver app has no GPS plugin, and masked calling is a stub.

Video tour of Kerbora

Frequently asked questions

The complete source code (version 1.0.0) as a download from your account, with the setup and usage guides shown on this page. You can modify the code to suit your product.

Buying guides: Laravel scripts with Filament panels and a web installer · Next.js or Laravel for a SaaS script?

More from this author

View all

Related in Web Scripts & Software

View all