Imad's Universe
work/akses-pos Live

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.

1,040commits
866files
162migrations
15months live

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.

10 parts built into it

qr-orderingOne platform, every brand — table QR and pickup, phone-OTP login, card payments
hr-workforceRoster grid, clock-in terminal, attendance judged against roster, labour cost vs net sales
payouts-chipCollect, accrue, batch payout, clawback — plus business verification as a case file
licensing-engineFeature-driven subscriptions — domain, then module, then capability
loyaltyTwo engines behind one switch — points or a 15-stamp card, identified by phone
kitchen-displayOrders as cards, priority shown as colour in the header band by wait time
offline-replayA replayed sale is a past sale — never re-checked against today’s rules
customer-displaySplit-screen on the till’s rear panel — brand on the left, the order building on the right
label-printingPer-drink cup stickers over ESC/POS — because thermal label printers speak the wrong language
inventory-engineLedger-based stock with moving average cost — architecture locked, build queued

Screens

NOW SERVINGA-42NEXTA-43A-44A-45B-07B-08
display/board · wall TV
GepukNasiTeh AisMiloAyamSambalKobisAir SuamTambah2× Ayam Gepuk1× Teh Ais1× Nasi TambahTOTALRM 28.50CHARGE
till/cashier · Flutter
A-43A-44A-452× Gepuk1× Teh Ais1m 20s1× Gepuk2× Nasi1× Milo Ais6m 05s3× Gepuk12m 41s
kitchen/display · KDS