Architecture, stack, key decisions and the quality gates DEV3 Mollycot passed before release.
The engineering behind Mollycot: capacity counted per carer per night, vaccine and meet-and-greet gates, doses with a grace period, a fixed lock order and card refunds written with the money and retried after commit.
The problem it solves
A pet carer's home is a small, shared space. Whether a stay fits depends on every night between check-in and check-out, on the size and species of the other guests and on vaccines that may expire mid-stay. Owners pay before the carer has answered, carers drop out, doses are ticked on phones with no signal, and a refund must neither be lost nor sent twice.
Architecture and approach
Mollycot is a Laravel 12 application with a Filament 4 admin at /admin, a public website with an owner account and a REST API used by two Flutter apps.
Capacity per night
Each carer's home has units per night. A pet takes one, two or three units by size, species rules keep cats and dogs apart, and a booking reserves its nights under a row lock. Pure classes for night maths, bills, cancellation and doses are tested against vectors produced by an independent Python implementation, and the apps run Dart ports against the same vectors.
Gates
A booking checks that vaccines are valid through the last night and that a first stay has a passed meet-and-greet, and the quote says which gate failed.
One lock order
Every path locks in the same order through one entry point: booking, pack, carer, carer nights, calendar cells, promo, dose tasks, pending refund, then wallets. Deadlines are enforced when a record is read, and expiry is committed before the requested action runs, so a refused action cannot roll back an expiry that was already announced.
Refunds and pay on request
The owner pays when the request is sent and is refunded if the carer declines or does not answer. Refunds are rows written in the money transaction, sent after commit and retried by the scheduler, then credited to the wallet. A reconciliation command checks escrow, night units and every wallet.
Apps
The owner and carer apps share one API contract with the server, queue doses and photos without signal and start in a demo mode that needs no server.
Quality gates and results
Mollycot 1.0.0 passed the seven release gates on the final code: 220 Pest tests with 2,803 assertions, 193 pages in a headless browser with race checks on MySQL followed by the reconciliation command, the installer test from the zip and a clean secret scan. The owner and carer apps pass analysis and 355 and 113 tests.
Limits are listed on the item page: the demo data is small, payments and push are simulated by default, Stripe refunds have no idempotency key yet and walk traces record only while the app is open.
Tech stack
| Area |
Technologies |
| Application |
Laravel 12, Filament 4, Blade, REST API |
| Care |
Per-night unit capacity, Vaccine gates, Meet-and-greets, Dose tasks |
| Money |
Pay on request, Payment requests, Durable card refunds, Care fund |
| Apps |
Flutter owner app, Flutter carer app, Shared dev3 Flutter package, Offline queue and demo mode |
| Quality |
Pest, Static analysis, Headless browser smoke, MySQL race checks |
Inside the build
Home — The headline, the carer search card (service, dates, pet) and the stitched felt illustration of a cat tree sit side by side on oat.
How nights work — A home has a number of units per night; a small pet takes one, a medium two, a large three, and the page explains why a full night is refused whole.