dev3 ·
DEV3 Bidhaus is a self-hosted timed-auction platform: Laravel 12 and Filament 4 backend, one Flutter app for bidders and consignors, and a public catalogue.
Stack: Laravel 12, Filament 4 (/admin, /seller, /account), Blade, Flutter.
Decisions that mattered
- The auction rules live in a pure
AuctionEnginewith no database and no clock. Every bid is a maximum, and an exact bid is just a maximum equal to the minimum next bid. - One JSON file of worked cases is run by the PHP tests and by the Dart port inside the app, so demo mode and the server cannot disagree about who leads. Property tests check that price never falls and sequence numbers only rise.
BidService::placelocks the lot, reads time after the lock, checks idempotency by client key, then the window, bidder, limit, amount and deposit. Lock order is always lot, then wallet.- Anti-sniping extends the lot once per transaction, capped at a hard close frozen when the lot goes live.
- Money writes idempotent ledger keys, so a repeated job writes nothing new.
Limits: no public live demo; the Flutter app runs on its own offline demo mode.
Trade-off we chose: two implementations of the engine (PHP and Dart) kept honest by one shared vector file.
How do you keep client and server rule engines in sync? We would like to hear.
#laravel#flutter#auctions#case-study
0