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.
Garage chapter — The camera drops to the island garage while the copy explains booking a category by the hour or the day.