akses-pos
A multi-tenant point-of-sale platform for Malaysian food businesses. A central MySQL database holds merchants, billing and licences; every merchant’s operational data lives in its own SQLite file, so cross-tenant leakage is physically impossible rather than a code-review problem. Ten modules ship on top of it, from the cashier screen to payouts.
The problem
A takeaway shop at 12:40pm has one counter, one person on the register, and thirty people who all ordered in the last six minutes. The failure is never the software being slow — it is nobody knowing whose food is ready. Staff shout numbers. Customers crowd the counter. Orders get handed to the wrong person.
The existing options solve accounting. They do not solve the rush.
What I built
Rekio started as a number board on a wall TV and grew into the whole system around it. A cashier rings the order on a Flutter till; the kitchen sees it as a card that changes colour the longer it waits; the customer watches their number move on the TV; the receipt and the cup sticker print themselves.
Everything after that — loyalty, stock, staff rosters, QR ordering, payouts — was added because a real shop asked for it while running on the thing.
Architecture decisions worth naming
- One database per tenant. A central MySQL database holds merchants and billing; every merchant's operational data lives in its own SQLite file. Cross-tenant leakage stops being a query-review problem and becomes physically impossible.
- The till is offline-first. A replayed sale is a past sale — it is never re-checked against today's prices, today's stock, or today's opening hours.
- Real-time on my own Reverb server, not a hosted service. Shared hosting cannot hold a websocket, so the broadcast box is a small VPS the whole estate talks to.
- Money paths are append-only. Payouts read from a ledger with history, not from a mutable column — a lesson learned the hard way and written down.
What it does in a real shop
Anonymised. These are one client's live figures, used with the shape intact and the name removed.
A single takeaway branch, one counter, 45 days: 9,041 orders · 201 orders a day · RM 21.05 average ticket. Forty percent of the day's orders land between 12:00 and 15:00 — a peak hour is one order every two minutes, through one register.
That distribution is the whole argument for the product. Accounting software does not care when the orders arrive. A queue does.