Q Qahwa POS ← saadm.dev
Demo · café / quick-service POS

Counter-side POS for UAE cafés and quick-service.

Modifier-driven menus, kitchen display, shift cash reconciliation, hourly heatmaps. Vanilla JS demo running entirely in your browser — no backend, all writes land in localStorage.

Demo PINs · 1234 manager · 5678 supervisor · 1111 / 2222 cashiers
Qahwa Café
Downtown Dubai · TRN 100123456700003
open in kitchen ready completed

What's inside

☕ Cashier terminal

Touch-optimized product grid with categories, search, modifiers (size · milk · syrup · extras), cart with qty steppers, and cash / card / split payment flows. PIN lock between cashiers.

🍳 Kitchen display

Counter-mounted screen polls for new orders, marks lines ready one by one, with elapsed-time amber / red warnings and audio chime on new tickets.

📊 14-section admin

Dashboard, live orders, products (CRUD + bulk), categories, modifiers, discounts, tables floor plan, staff RBAC, shifts with Z-reports, reports, inventory, receipt template, settings, audit log.

🧮 Real operations math

5% VAT applied after discounts, payment splits, change calculation, shift cash variance, inventory deduction via product → ingredient recipes, CSV export of orders and audit log.

🛡 Role-based access

Three roles — cashier, supervisor, manager — with PIN auth. Supervisor overrides for discounts >20%. Manager-only shift close + Z-report.

🧰 Vanilla JS, no build

No frameworks, no bundler, no backend. ~5,000 LOC of plain ES5+ behind a fetch interceptor that serves /pos/api/* from localStorage. Reset to seed any time from Settings.

Try it end-to-end

  1. Open the cashier terminal, enter PIN 1111.
  2. Tap Coffee → Cappuccino → pick Size Large, Oat milk, Vanilla syrup. Confirm.
  3. Add a Croissant + Iced latte. Apply 10% discount.
  4. Tap Send to Kitchen. Open the KDS in a second tab — the ticket appears within five seconds with an audio chime.
  5. Mark lines ready in the KDS, then "Mark all served". Back in the terminal: take payment in cash.
  6. Open the back office → Dashboard updates, your order is on the recent list, inventory shows beans + milk deducted.