Background
Many independent restaurants still rely on printed menus and manual order taking. Service slows down, tourists face language barriers, and owners get little data about what sells.
What we built
We built Eazmenu as a multi-app platform:
- A customer web app that opens from a table QR code.
- An admin dashboard where restaurant staff manage menus, tables, orders, branding, and translations.
- A backend API that handles menu delivery, order lifecycle, security checks, and optional payments.
- A shared package used by all apps for one source of truth for database schema and API types.
Customer experience
A guest scans a QR code at the table and lands directly on the digital menu. The app validates the QR input, resolves the preferred language, and loads menu data tied to that table and restaurant.
From there, the guest can:
- Browse categories and featured dishes.
- Switch language.
- Add items to cart and place an order.
- Track active orders from the same session.
The menu UI supports restaurant branding, including colors, fonts, hero images, logo, and chef message.
Admin experience
Restaurant staff use the admin app to run day-to-day operations:
- Manage restaurants, categories, menu items, and tables.
- Monitor incoming orders in real time.
- Update order status as service progresses.
- Configure available languages and translation coverage.
- Run one-click translation from primary language to secondary languages.
- Preview the customer menu in an authenticated preview mode.
Technical approach
The platform is split into focused services and frontends, with shared models across all projects to avoid contract drift.
Key implementation choices:
- QR menu endpoints support redirect and JSON modes.
- Order creation validates table ownership and table active state.
- Server computes totals from database prices, so client-side price tampering does not affect billing.
- Realtime updates use database change subscriptions, so order events appear in admin without refresh.
- Payment routes integrate with Stripe when configured and fail safely when payment config is absent.
Security and reliability decisions
The platform enforces trust boundaries at each step:
- Public ordering is allowed, but scoped to valid table and restaurant combinations.
- Staff routes enforce authentication and ownership checks.
- Price, item validity, and item availability are always verified server-side.
- Translation and management actions are protected by restaurant-level access checks.
- Payment routes expose health/status so the app can degrade gracefully if payments are unavailable.
Result
Eazmenu gives restaurants one ordering system for table-level service, multilingual menus, and live staff updates.
The operating loop is short:
- Customer scans and orders.
- Kitchen and staff see updates immediately.
- Manager controls menu, translations, and branding from one dashboard.
Built to grow past one location
The system works for a single location without locking the product into that scale. More restaurants and features can be added without rewriting the contracts between the apps. Because the customer app, admin dashboard, and server share one schema and type package, changes are less likely to create integration bugs.












