Full StackLive

Madame Pompidor: Real-Time Guest Ordering & Legacy POS Bridge

Live platform for a Malaysian restaurant — QR table ordering with SSE, legacy PHP POS bridge, guest-order cloud app on a dedicated subdomain, and brand site to professional design specifications. A cloud-native POS replacement is planned as a later phase.

Madame Pompidor: Real-Time Guest Ordering & Legacy POS Bridge - screenshot 1
1 / 4

Overview

Madame Pompidor is the live digital platform for the eponymous restaurant in Malaysia: guest QR ordering, staff workflows tied to the existing POS, and a brand web presence — with a full cloud POS scoped as a later phase on the same product. The cloud guest-order application (Next.js 16, Prisma 7, MariaDB) runs on a dedicated orders subdomain: venue QR, table picker, live menu synced from the legacy PHP POS, kitchen orders in real time via SSE, and POS-side confirm, billing, and table operations. The legacy system required a deep outbound bridge — catalog push, order ingest, Confirm/Reject, bill lock/reopen, transfer/merge/split/move sync, floor occupancy mirroring, and stock reserve-on-confirm — without breaking waiter or kitchen flows. The marketing site and guest UI follow the design team’s specifications. Production runs on Docker with MariaDB and Nginx on a VPS.

Key Features

QR Venue Entry + Table Picker with Live Occupancy (SSE)
Guest Menu, Cart & Multi-Guest Table Sessions (Owner Join Flow)
Real-Time SSE — Sessions, Stock, Orders, Checks & Waiter Calls
Legacy PHP POS Bridge — Catalog Push, Order Ingest & Confirm/Reject
Stock Reserve-on-Confirm (FIFO) with Live Catalog Sync
Table Transfer, Merge, Split & Move Item — Cloud Session Sync
Bill Lock / Reopen, Request Bill & Waiter Call Inbox on POS
Kitchen Ingest Pipeline into Legacy POS Order Flow
Trilingual UI (EN / ZH / MS) with next-intl
Malaysia Opening-Hours Venue Gate & Staff Settings
UI Aligned to Professional Design Specifications
Live Brand Site + Orders Subdomain
Docker Production Stack (MariaDB, Nginx, VPS)
TDD for Domain & Session Logic

Challenges & Solutions

Bridging a decades-old PHP POS without rewriting it meant every guest action had to map to existing sell/item/operation semantics — transfer, merge, and split had to move or merge cloud table sessions in sync with POS floor state, while bill-out could not close the QR party (only pay/cancel releases the table). Stock had to reserve on staff Confirm, not cart add, with catalog pushes merging POS countdowns against cloud holds without double-counting. SSE runs in-process with a DB tick for cross-worker consistency until Redis is needed. High-risk legacy order and billing paths needed surgical hooks while preserving classic waiter and kitchen flows.

What I Learned

Shipping the live platform reinforced legacy integration patterns — outbound bridge APIs, idempotent ingest claims, and regression checklists across dozens of POS touchpoints. Real-time hospitality UX with SSE (not polling) shaped session lifecycle rules for multi-guest tables, floor-hold phone locks, and ghost sessions. Building guest flows and the brand site to external design specs alongside complex domain logic validated coordinating design delivery with application engineering on a multi-surface product. The planned cloud POS will extend this same platform rather than fork a separate product.

Built with

Next.js 16.3.2React 19.2.8TypeScript 5Prisma 7.10.0MariaDB 11next-intl 4.13.7Server-Sent EventsPHP 7.4Zod 4.4.3Tailwind CSS 4shadcn/uiRadix UIVitest 4.1.11DockerNginx
Madame Pompidor: Real-Time Guest Ordering & Legacy POS Bridge