RMS
Restaurant operating system

One order, all the way through.

RMS runs the floor, the pass and the back office off a single order record — point of sale, kitchen display, guest QR ordering, inventory, loyalty and reporting. Four apps, one system, and a line that keeps moving when the internet stops.

Table 7 · dine-inOrder #1042
  1. 19:04:12QRTable 7 opened from the QR poster
  2. 19:04:58POS2 × Malai kofta₹640.00
  3. 19:05:01POS1 × Butter naan · extra butter₹90.00
  4. 19:05:03KDSDocket #1042 fired → Tandoor
  5. 19:05:03STOCKPaneer, cream and atta consumed−220 g
  6. 19:19:42KDSReady, called to the pass14:39
  7. 19:26:10PAYSplit · card and wallet₹766.50
  8. 19:26:11CRMAarav S. · visit 12+64 pts
  9. 19:26:11BOOKSales, tax and COGS posted
Paid in full₹766.50

One order record. Seven systems wrote to it; nobody typed it twice.

apps in the box
4
order record
1
ways to pay
5
re-entry between them
0
The floorguest ordering · apps/customer

Guests order from the table. Nobody re-types it.

The QR poster on table 7 opens the live menu — priced, taxed and available as of this minute. What a guest taps becomes the same order a waiter would have raised on the POS, on the same record, with the same rules.

  • Nothing to install

    The guest opens a web page and orders from it. Staff keep the POS for everything else — a phone in an apron or a till tablet, same app, same shift.

  • One bill, five ways to settle it

    Card, cash, UPI, a guest's wallet balance and a gift card can share a single bill between them. The order closes itself when the balance reaches zero.

    cardcashUPIwalletgift card
  • Feedback lands on the order ★★★★★

    Stars and a note attach to the visit, so a bad Friday is traceable to the ticket, the table and the section that cooked it.

The passkitchen display · apps/kitchen

Dockets on a rail, aging where the line can see them.

Kitchens run dark, but paper reads. Sending an order fires one ticket per section, and every ticket carries its own age in ink — so the section that is behind is the one that looks it, from across a hot line, without anyone reading a word.

#10420:03On time
TANDOORTable 7
  • 2×Malai kofta
  • 1×Butter naanextra butter
#10414:52On time
CURRYTable 12
  • 1×Dal makhanihalf portion
  • 3×Jeera rice
  • 1×Paneer tikka

no chilli — allergy

#10389:50Aging
GRILLTakeaway
  • 4×Seekh kebab
  • 2×Chicken tikkawell done
TandoorCurryGrillPass
fresh · aging at 5:00 · late at 10:00
  • One docket per section

    A menu item knows which station cooks it, so sending an order prints to the tandoor, the curry line and the grill at once — each slip carrying only its own lines.

  • Age is the whole status language

    Ink colour and the bar at the foot carry how long a ticket has been up. Nothing else on the screen is coloured, so the board never cries wolf.

  • Live, not refreshed

    Tickets arrive over a socket and every screen agrees within the second. Bump one to ready, recall it if the table waves — and print it as thermal-printer bytes when the slip has to exist on paper.

The officeadmin dashboard · apps/admin

The part that decides whether the month worked.

Menu, staff, stock, suppliers, guests and the numbers, scoped to the outlet you are standing in. Every report is built from the rows the POS and the kitchen already wrote, so there is nothing to reconcile at the end of the night.

Reports1–31 Aug · Kohinoor Kitchen
Net sales
₹4,86,210
Covers
612
Avg on the pass
8:41
Low on stock
4

Sales · kitchen times · inventory usage · staff · taxes collected per rate · gross sales against the cost of what was actually cooked.

Movement ledgerPaneer · today
  • 14:02Recipe consumption · Malai kofta−220 g
  • 14:02Recipe consumption · Butter naan−85 g
  • 15:20Purchase received · Amul dairy+12 000 g
  • 19:48Waste · spoiled in transit−400 g

Recipes consume stock as orders are sent, and voids put it back. Every gram on hand is explained by a line here — nothing in this system is a plug figure.

Who can do whatenforced twice
ownermanagerchefcashierwaiter

The dashboard hides exactly what the API would refuse, from the same permission map. A manager cannot mint managers; a chef can correct stock but never touch payroll.

Outletsone organisation
  • Kohinoor Kitchen612 covers
  • Kohinoor Express388 covers
  • Kharadi cloud kitchen241 covers

Menus, tables, stations, stock and reports are scoped per outlet. Managers switch between them without logging out; owners see the group.

When the line dropssync engine · packages/sync

The internet is not part of the service.

A till on a dead connection keeps selling. Everything it does is written to the device first and pushed in order when the link returns — and because every operation carries its own id, a retry after a lost acknowledgement comes back a duplicate instead of a second charge.

Everything it doesone API · services/api

The whole carte.

Not a roadmap. Every line below is an endpoint that exists today, with tests behind it and a screen in one of the four apps that uses it.

Menu & pricing

  • Categories, items, variantsone aggregate save
  • Modifier groups and combosmin / max rules
  • Availability windowsmenu as of a time
  • Tax groupsbasis points
  • Station routing per itemsets the docket
  • Barcode lookupscan to sell

Point of sale

  • Dine-in, takeaway, delivery3 order types
  • Tables, covers and transfersper outlet
  • Split payments5 methods
  • Order and line discountsreason required
  • Priced at order timelines snapshot
  • Receiptstext + ESC/POS

The pass

  • One docket per stationfired on send
  • Queued, preparing, readyplus recall
  • Age shown in ink and barlate at 10:00
  • Live board feedWebSocket
  • Station and outlet filtersper screen
  • Prep time per stationreported nightly

Inventory

  • Ingredients in base unitsg · ml · piece
  • Recipes per servingconsumed on send
  • Voids restore stockboth directions
  • Suppliers and purchase ordersorder → receive
  • Corrections and wasteledgered
  • Every unit explainedmovement ledger

Guests & loyalty

  • Guest directorysearchable
  • Membership tiersresolved per guest
  • Wallet with top-upspay from balance
  • Gift cardsbalance by code
  • Points on completed visitsconfigurable
  • Feedback against the order1–5 stars

Money & integrations

  • Razorpay and Stripemock in dev
  • Settlement webhooksHMAC, idempotent
  • Machine API keysshown once
  • Delivery aggregator intakeby external ref
  • Guest QR orderingno app to install
  • Orders and tax exportsCSV

Reporting

  • Sales, daily and by itemany range
  • Kitchen queue and prep timesper station
  • Inventory usage and spendlow stock first
  • Staff performanceper user
  • Taxable base and collectedper rate
  • Gross sales against COGSfrom recipes

Platform

  • Organizations and outletsmulti-tenant
  • Roles the API enforcessame map in the UI
  • Offline-first syncidempotent by opId
  • Device fleet and last seenper outlet
  • Typed client from the specdrift fails CI
  • Full API referenceOpenAPI at /docs
Next

See it run on your own menu.

Send us a menu and a week of real orders. We seed them into a live outlet and walk the whole loop with you — QR poster to closing figures — in about half an hour.

API
Fastify 5 · Postgres · Redis
Dashboard
Next.js 16 · React 19
POS & board
Expo · React Native
Guest
a web page, nothing to install
Ships as
Docker Compose, on your own box