Every operational knob has a UI.
Categories, menu items, modifiers, kitchen stations, courses, course groups, bars, printers, employees, terminal readers, hot list pins, extra charges, restaurants, API keys, agent tokens. All server-rendered, fast and offline-friendly.
Menu engineering in plain HTML.
Categories with parent/child trees, per-category color tokens, display-category pins, and admin-curated Hot List items. Items with multiple priced variations, modifier-list attachments, kitchen-station routing, per-item printer override, tax band, prep time, default course.
- Active / Retired tabsItems with order history can't be hard-deleted. Delete retires them; Retired tab restores in one click.
- Per-language overridesEight languages on the catalog — English, Dutch, German, Spanish, French, Vietnamese, Cantonese, Mandarin. Items index flags untranslated rows.
- Bar entitiesA restaurant can define many bars — Main, Service, Patio — each rooted on a category and a printer.
- Hot list pinsAdmin-flagged items surface as a top-level pill on every cashier menu.
Every operational rule, settable in one form.
Each restaurant is its own tenant on the same backend. Pacing modes, KDS integration, VAT bands, currency, time zone, tip mode, extra charges, encrypted Google Maps keys — all per-restaurant, all switchable without code.
- Pacing modeskitchen (every line bumped individually) or course (Ready/Bump cycle advances through current_course).
- KDS integration modekds_only, printer_only, or both. Decides whether the cashier sees a paper Send button or waits for the kitchen display to bump lines.
- Two VAT bands per restauranthigh / low / none per item. The pay screen and receipts break the total down by band — 'Standard VAT 21%' instead of one opaque 'Tax:' line.
- Prices include tax toggleEU-style inclusive pricing or US-style exclusive pricing. Cashier surface, receipts, and reservation widget all flip in lockstep.
- Tip mode + tip-on-signatureIncluded (auto-percent) or manual. Tip-on-signature for credit card flows — authorize for the check, customer writes a tip, cashier settles auth + tip in one go.
- Pooled tips flagWhen set, reports treat all tips as a single pool to be split rather than per-server attribution.
- Extra chargesHospitality Surcharge, Stadium Tax, Gratuity — pro-rated by guest share, with start / end activation dates.
- Currency + timezone + date formatPer-restaurant. 'Today' on every dashboard is computed in the restaurant's local zone, not the server's.
- Encrypted Google Maps keysGeocoding + embedded static map on the booking widget. Treated as payment-grade secrets at rest.
Drag, rotate, snap-to-grid.
Tables, chairs, walls, plants, dividers. Each table gets a name (Patio 4), shape, min/max capacity, and a stable layout_key so a renamed table doesn't orphan its history.
- Multiple areasDining Room, Patio, Bar — cashier tablets switch between them with a tab strip.
- Capacity rulesMin/max capacity informs the table auto-assigner for incoming bookings.
- Custom shapesCustom SVG paths supported alongside rect / round / pill.
A full reservations module, not an afterthought.
Shifts (Brunch, Lunch, Dinner) with per-shift open hours and capacity caps. Closed days. Events with limited-capacity special menus. Booking tags. Customer profiles with history rollup. Waitlist with quoted times. Real-time host-stand overview.
- Shifts + closed daysPer-shift hours and capacity caps. Holiday + private-event blocking with two clicks.
- Customer profilesPat has booked here 8 times, average party 3.5, last visit 14 days ago.
- WaitlistQuoted wait times, party + phone, an at-the-host-stand Seat now button.
- Auto table assignerSuggests the best free table given party size and min/max rules.
- Booking statusesPending → confirmed → seated → completed, plus no-show + cancelled terminal states.
- Real-time host overviewLive dashboard at /admin/reservations/overview that updates without a refresh.
Drop into your restaurant's marketing site.
A drop-in iframe widget customers embed under a per-restaurant UUID. Customer picks date, party, shift, time slot; the booking lands in the admin backend immediately with the matching API key audit trail. Survives multi-restaurant deploys.
Phone reservations that land where the host sees them.
A dedicated Voice Booking API lets voice or AI agents take reservations remotely. The booking it writes is indistinguishable from a web-widget booking or a hand-keyed one — voice is just another input lane.
- X-API-Key auth + per-restaurant scopeKeys minted from Integrations → API Keys, stored hashed, revokable individually. Middleware confirms the key matches the restaurant in the URL.
- Pre-flight availability checkVoice agent asks 'is this slot bookable for this party?' before collecting guest details, so it can offer alternatives if the time doesn't work.
- Today-bookings syncAI agents can pull today's bookings (to know who's expected) and patch booking statuses (cancellations, phone-confirmed no-shows).
- Brite Voice Relay credentialsEach restaurant can wire in a bearer token issued by Brite's hosted voice relay; the backend polls it on a schedule to pull queued bookings the AI took by phone.
- Rate-limited per IP60 requests / minute is generous for a busy voice agent but tight enough that a stolen key can't spam fake bookings.
Stripe, Square, Mollie. Multi-provider per restaurant.
Card payments route through a configured PaymentProcessor row. Credentials live there (test mode + live mode keys, webhook secrets, terminal location ids); the restaurant just picks one via an FK on its edit form. Multi-provider per restaurant supported — card via Stripe, iDEAL via Mollie, on the same till.
- Stripe Terminal + Stripe CheckoutCard-present via attached terminal readers; online + QR via Checkout sessions for send-a-payment-link flows.
- Square TerminalPaired Square Reader with tap, EMV, and swipe.
- MollieEuropean online + QR + terminal, including iDEAL.
- Refund options previewBefore committing, the cashier sees which methods are available on the order and the max refundable amount per method. Partial line refund or full-order refund — card refunds reverse the provider's intent; cash refunds record a Payment row + queue paper slips.
The numbers, surfaced where decisions get made.
- RevenueGross / net / tax by day or hour. JSON endpoints available for custom embeds.
- ReceiptsEvery paid order in a window with full line-item drill-down, payment method, change given.
- Menu itemsQuantity sold per item, revenue per item, filtered by date range so seasonal performance is visible at a glance.
- Kitchen performanceTicket-fire to bump time per station, per-station throughput, longest open ticket.
- EmployeesClock-in records, shift hours, total tips per staffer.
- Hourly heatmapSales density by hour-of-day × day-of-week so scheduling has ground truth.
PIN login, on-shift broadcast auth, clean audit trail.
Every shift-start records an employee_schedules row. Sign-out prompts Clocking out vs Going on break. The realtime broadcast auth refuses to authorize a clocked-out user, so a clocked-out staffer can't quietly watch the bar feed.
- PIN-only LAN loginTablets on the LAN sign in with a PIN keypad. The backend gates this to private hostnames so a public deployment falls back to email + password.
- Three rolesAdmin (full backend), manager (reports + comps + most setup), employee (cashier app only — no web admin surface).
- Multi-restaurant membershipA single user can work across several restaurants under one login. The admin sidebar restaurant switcher swaps the active tenant.
- Time clockEvery shift-start row is recorded. Sign-out prompts clocking-out vs on-break; the realtime layer refuses to broadcast to off-shift users.
Keys with the smallest blast radius.
Every external integration gets its own scoped credential — public booking widgets, print agents, voice-AI relays — so revoking one doesn't take the others down.
- Public booking-widget keysEmbedded under a per-restaurant UUID. Each key authorizes only that restaurant's slot lookups and booking writes.
- Print-agent tokensOne token per agent, revokable from the admin UI without disrupting other agents on the same LAN.
- Voice-AI relay credentialsBearer token issued by Brite's hosted voice relay, paired per restaurant. The backend polls the relay on a schedule.