A point-of-sale system for one business, many locations
Retail scans a barcode, pays, and leaves in a minute. A restaurant tab lingers for an hour, adds courses, and splits the check three ways. Same tables, same lifecycle, different screens.
What's in the box
The till. Scanner-first for retail; menu grid, floor view, open tabs, modifiers, coursing, and split checks for food service. Cash drawer with a blind count.
The manager's side: catalog, staff and per-location roles, register settings, sales and stock reports, and a viewer for the append-only audit trail.
Tauri v2 hosts the same register and adds what a browser tab cannot do: a thermal printer and a cash drawer.
Laravel action-class architecture. Every mutation audited, every financial record append-only, all money in integer cents.
In the store
Principles that shape everything
One rounding primitive in one place; split payments and refunds are penny-exact by construction.
A refund is new rows; a closed order is never mutated; last year's receipt reprints identically.
Food service is retail plus a longer open phase — proven, not assumed: the food-service milestone shipped with zero new order tables.
Engineers change config; admins change the database; nothing lives in both.
The API says what a receipt contains and whether a drawer may open. No money decision lives where it cannot be audited.
Quick start
cp .env.example .env
make dev-key # mints an APP_KEY — paste it into .env
make dev # full stack: Postgres, API, register, back office
make seed # demo data — prints dev PINs and device tokens
Register at localhost:5174 · back office at
localhost:5175 · API health at localhost:8000/api/v1/health.
Requirements: Docker. Nothing else.