DEV3 Odolane – Vehicle Rental Laravel Script with Category Stock, One-Way Trips, Inspections & Deposits (Flutter Apps)

A self-hosted vehicle hire platform on Laravel 12 and Filament 4 with customer and fleet staff Flutter apps: hire by category, one-way trips, walkaround inspections, a real security deposit, extensions, claims and branch tills. Admin panel. Installer and demo data included.

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

Video tour. Pick a section below to browse 116 screenshots in 28 sections.

App & phone tours

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

  • Customer app1:27
  • Staff app1:16

Odolane is a vehicle hire platform that you host yourself, built by DEV3 Technologies on Laravel 12 and Filament 4, with two Flutter apps: one for customers and one for fleet staff. Customers hire a vehicle category, from scooters to vans, by date and hour from one branch and may return it to another. The fleet is the operator's own. Staff check vehicles out and in with a walkaround, fuel and odometer, and the final charges come off a real security deposit. The demo business is a fictional island hire company with four branches (Airport, Ferry Port, Old Town and Cliffside) on the Isle of Merrow, priced in euros with 22% VAT included.

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

Customers

  • A public site with a quick search, a fleet carousel, category pages, covers and extras, branches, a web checkout and an account area with bookings and bills.
  • A customer app with a range calendar, hour limits per branch, a branch-closed notice, a garage carousel, category detail, an add-a-day-pay-less hint and a no-stock state.
  • Cover and extras pickers, driver details, a licence upload (with a rejected state), a deposit explainer and payment.
  • A key tag with a countdown for pick-up, directions, an on-hire screen, an extend preview (including an extend with no stock), a change of return branch, a return summary and a deposit waterfall.
  • Damage claims with an appeal, free cancellation or a cancellation fee, a wallet, a review, and an at-risk upgrade offer when the booked category runs short.

Fleet staff

  • A staff app with today's board (tablet, dark, Arabic and phone layouts), a QR scan and a booking screen.
  • Licence checks (accepted, expired and under age), a vehicle picker with a free upgrade, and a walkaround with damage pins and the earlier pins shown.
  • Odometer, a fuel dial, a signature and a customer code, an out-versus-in comparison, odometer validation, charges and collection.
  • Tasks with a claim countdown, transfer tasks between branches, a till you open, post entries to and close with a count, variance approval, stock today and an at-risk list.

Admin panel

  • A dashboard with a 3D Fleet Yard, today's board, a stock timeline per branch, an at-risk queue and overdue returns.
  • Bookings with tabs, a booking detail, an inspection compare and a deposit waterfall, extensions, vehicles and vehicle detail, maintenance, tasks and transfers.
  • Rate tiers with a preview calculator, seasons, covers, claims with a decision page, fines, licences, tills and shifts with variance, and reports.

Stock and money

  • Stock is counted by category and branch over time. A pick-up, a return, an extension, a one-way move and an upgrade each add events to the same curve, so the board knows when a category runs out.
  • The security deposit is a real second charge that is refunded after check-in, not a pre-authorisation. Final charges, damage and fines come off it in a waterfall.
  • Card refunds are written in the same transaction as the money, sent after commit and retried by the scheduler. A reconciliation command (odolane:check) checks stock events, deposits held and every wallet.
  • Deadlines are enforced when a record is read, so nothing waits for the scheduler. The 15 parallel-request checks on MySQL assert the money outcome.

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 island hire company: four branches and 160 vehicles with their bookings, claims, tills and reviews. The fleet is the operator's own, there is no third-party marketplace.

Good to know

  • The deposit is a real second charge. It is taken as its own payment and refunded after check-in. There is no card pre-authorisation, so a customer sees two charges.
  • A card refund that keeps failing falls back to wallet credit. Refunds are retried for about an hour; after that the amount is credited to the customer's wallet instead of the card.
  • Stripe refunds have no idempotency key yet. A gateway timeout after Stripe accepted a refund can be retried, so retries need buyer review before you go live with real card payments. The key is a shared-core change that is not in this release.
  • The staff app's live check is at API level. With a real server it was verified through the app's own API client and models in automated tests, not by hand on a device.
  • Some concurrency paths are not covered on MySQL. The lock-order tests for creating a transfer against allocating a vehicle run on SQLite, and the MySQL race section does not cover them.
  • A narrow refund window exists. A normal card refund takes the newest payment first, so a captured but not yet settled duplicate payment could absorb it.
  • Payments, SMS and push are simulated by default. The simulated payment gateway works out of the box, so booking and paying need no keys. Stripe, Razorpay and PayPal drivers are included but were not run against real accounts.
  • 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 Pest tests run on SQLite, where row locks do nothing; the concurrency checks that prove the locking run on MySQL 8.
  • Name: Odolane is a working name checked by a web search only, not a trademark clearance. Check it before you launch under it.
  • No hosted demo. Every customer, business and record in the screenshots is fictional. Install it with the demo data to try every role on your own server.

Quality checks

Odolane 1.0.0 passed the seven release gates of the DEV3 Laravel suite on the final code: static analysis, 181 Pest tests with 2,644 assertions, a front-end size budget, migrations and seeding on MySQL 8 and SQLite, a headless-browser pass over 110 pages with probes and 15 parallel-request checks on MySQL that assert money outcomes, an installer test from the zip, and a secret scan. The customer app passed analysis and 275 tests, and the staff app 176 tests, with debug Android and iOS simulator builds. Two reviews of the money and stock code led to fixes, each with a regression test. Lighthouse scores were not measured on the final code.

How it's built

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

The engineering behind Odolane: stock counted as events on a curve, a deposit waterfall, a fixed lock order and card refunds written with the money and retried after commit.

The problem it solves

A hire company rents a category, not a car, so it must know months ahead whether a category will run out at a branch, including one-way trips, extensions and cars that come back late. A security deposit is real money that has to be held, charged against and refunded. Customers pay late, extend while someone else books and cancel at the worst moment, and a card refund must neither be lost nor sent twice.

Architecture and approach

Odolane is a Laravel 12 application with Filament 4 admin at /admin, a public website and a REST API used by two Flutter apps.

Stock as a curve

Stock events (out, in, upgrade, transfer, maintenance) sit on one curve per branch and category. An extension, an overdue roll, a return-branch change and an upgrade each move the events the curve sees, and a stock check reads the curve rather than a counter.

Deposits

The deposit is a real charge. A waterfall applies damage, fuel, late fees and fines to it in order and refunds the rest.

Locks and deadlines

Booking changes go through one engine that locks branch and category rows in ascending order. Deadlines are applied when a record is read, and the scheduled command only sweeps. On MySQL the isolation level is read committed, because repeatable read made the stock locks unsafe.

Refunds

Card refunds are written as a row in the money transaction, sent after commit and retried by the scheduler for about an hour, then credited to the wallet. What already went to the card is read from the payments, so a crash after a send cannot double-send.

Apps

The customer and staff apps share one API contract and test vectors with the server, and start in a demo mode.

Quality gates and results

Odolane 1.0.0 passed the seven release gates on the final code: 181 Pest tests with 2,644 assertions, 110 pages in a headless browser with 15 race checks on MySQL, the installer test from the zip and a clean secret scan. The customer and staff apps pass analysis and 275 and 176 tests.

Limits are listed on the item page: the deposit is a second charge, Stripe refunds have no idempotency key yet and the staff app's live check is API level.

Tech stack

Area Technologies
Application Laravel 12, Filament 4, Blade, REST API
Hire Category stock curve, One-way trips, Walkaround inspections, Branch tills
Money Real security deposit, Deposit waterfall, Durable card refunds, Wallet credit fallback
Apps Flutter customer app, Flutter staff app, Shared dev3 Flutter package, Demo mode
Quality Pest, Static analysis, Headless browser smoke, MySQL race checks

Inside the build

Island hero: A low-poly Isle of Merrow with a brass odometer drum on its plinth sits beside the headline and the two search buttons. Island hero — A low-poly Isle of Merrow with a brass odometer drum on its plinth sits beside the headline and the two search buttons.

Garage chapter: The camera drops to the island garage while the copy explains booking a category by the hour or the day. Garage chapter — The camera drops to the island garage while the copy explains booking a category by the hour or the day.

Guides & articles

Practical guides and engineering write-ups for DEV3 Odolane.

Vehicle rental software: 7 things to check before you pick one

Last updated
Vehicle rental software: 7 things to check before you pick one: DEV3 Odolane

Hire is a stock problem with a deposit attached. Here are seven things to check before you pick software, with DEV3 Odolane as the worked example.

Odolane hero: a low-poly island with a brass odometer drum

1. Does it count by category?

Customers hire a class of vehicle, not a plate number. Odolane keeps a stock curve per branch and category.

The stock timeline in the admin panel

2. How does a one-way trip work?

Look for a return branch, a one-way fee taken from the booking's own quote and stock that moves with the car.

3. Is there a real inspection?

A walkaround with damage pins, odometer and fuel at pick-up and return, compared side by side.

The staff app walkaround with damage pins

4. What happens to the deposit?

Check whether it is a pre-authorisation or a second charge and how it is refunded. Odolane takes a real charge and shows a waterfall.

The deposit waterfall

5. What if the category runs out?

Look for an at-risk queue and a free upgrade rather than a cancelled booking.

6. Do branches count their cash?

Tills with an opening count, entries and a variance approval at close.

7. What is not finished?

Ask for the limits in writing. For Odolane: the deposit is a second charge, a card refund that fails for about an hour falls back to wallet credit, and Stripe refunds have no idempotency key yet.

Video tour of Odolane

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