WorkSaaS · Web · MobileLive
MenuWave
A multi-tenant operating system for restaurants — from the till to the TV screen.

- Role
- Product engineer — platform architecture, Laravel backend, admin workspace and Flutter device clients.
- Discipline
- SaaS, Web, Mobile, Backend, Enterprise
- Stack
- Laravel 13, PHP, Sanctum, Vite, Tailwind CSS
- Codebases
- 4 repositories
- Domain modules
- 25
- Eloquent models
- 116
- Test files
- 96
- Codebases (1 web, 3 Flutter)
- 4
01 — Overview
MenuWave puts the whole operation on one multi-tenant platform. A Laravel application owns the data and business rules; dedicated Flutter clients run the point of sale, the kitchen display and the signage screens, each talking to the same tenant-scoped backend.
02 — The problem
Restaurants run on disconnected tools — one for the menu, one for the till, paper tickets for the kitchen and a separate box for in-store screens. Each tool keeps its own data, so owners never see one picture of the business and every menu change is made several times.
03 — My contribution
Product engineer — platform architecture, Laravel backend, admin workspace and Flutter device clients.
04 — System architecture
01 · frontend
Clients
- Admin workspace (Blade, Tailwind, Alpine.js, Vite)
- MenuWav POS — Flutter, Riverpod, go_router
- MenuWav Kitchen — Flutter, GetX
- MenuWav Player (signage) — Flutter, GetX, video_player
02 · api
HTTP & API
- routes/api.php + web route groups: admin (platform, workspace), pos, kitchen, rider, billing, marketing
- Laravel Sanctum
- AuthenticateMenuWaveDevice middleware
- AssignRequestId & SecurityHeaders middleware
03 · services
Domains & services
- 25 domain modules under app/Domains (Tenancy, Orders, Kitchen, Payments, Delivery, Inventory, Workforce, Accounting …)
- Policies + EnsurePermission / EnsureSubscribed / EnsureKitchenAccess middleware
- Queued jobs
- AI usage tracking (AiUsage model)
04 · database
Data
- 116 Eloquent models · 75 migrations
- TenantScope global scope
- MySQL (server) · SQLite via sqflite (POS & player, on-device)
05 · infrastructure
Integrations
- Stripe (stripe/stripe-php, StripeEvent model)
- Redis
- AWS
- OpenAI
- ESC/POS USB receipt printing (POS)
- QR-based screen pairing (player)
MenuWave · Layer 1 of 5
ClientsImplemented
Each role gets a client built for its device: a browser workspace for owners, a tablet POS, a kitchen board and a TV player.
- Admin workspace (Blade, Tailwind, Alpine.js, Vite)
- MenuWav POS — Flutter, Riverpod, go_router
- MenuWav Kitchen — Flutter, GetX
- MenuWav Player (signage) — Flutter, GetX, video_player
Observed in · repo/resources, repo/lib/features, repo/lib/modules, repo/lib
05 — Technology stack
- Laravel 13
- PHP
- Sanctum
- Vite
- Tailwind CSS
- Alpine.js
- Flutter
- Riverpod
- GetX
- SQLite (on-device)
- MySQL
- Redis
- Stripe
- AWS
- OpenAI
Taken from the project's manifests and architecture documentation.
06 — Modules
- Tenancy & identity
- Catalog & pricing
- Orders & payments
- Point of sale
- Kitchen display
- Guest ordering
- Delivery & riders
- Digital signage & video walls
- Inventory & production
- Workforce & shifts
- CRM, loyalty & promotions
- Accounting & reporting
- Food safety
- Maintenance
07 — Engineering decisions
- Multi-tenancy at the query layer (a global TenantScope) instead of separate databases — onboarding a restaurant is configuration, not a deployment.
- Domain-oriented code organisation (app/Domains/*) so Orders, Kitchen, Inventory and Workforce can grow without a single bloated services folder.
- Separate device authentication for POS tablets and signage screens, distinct from staff logins.
- Native Flutter clients for hardware-facing roles: USB receipt printers, always-on TV playback (wakelock), and on-device SQLite.
- Subscription and permission checks expressed as middleware (EnsureSubscribed, EnsurePermission, RedirectUnpaidTrial) so access rules sit in one place.
08 — Challenges & solutions
Isolation without friction
Every query, upload and screen must be scoped to the right restaurant without relying on developers remembering a filter — solved with a global scope and tenant-aware middleware.
One order, many surfaces
An order placed by a guest has to appear correctly on the POS and the kitchen board, with status history (OrderStatusEvent) and kitchen tickets per station.
Screens in the wild
Signage players run unattended on TVs: they pair by QR, cache playlists locally, track app releases and report crashes back to the platform.
09 — Performance & scalability
- Local SQLite on POS and player clients
- Queued jobs for slow work
- Redis configured for cache/queues
10 — Security
- Tenant isolation via global query scope
- Role, permission and subscription middleware
- Device authentication for screens and tablets
- Request IDs and security headers on every response
- flutter_secure_storage for credentials on devices
11 — Infrastructure & deployment
Live at menuwav.com. The repository contains a public_html.htaccess for shared-hosting deployment; hosting topology beyond that is not documented in the repositories.
12 — Outcomes
- Live product at menuwav.com
13 — Evidence
Architecture and implementation documented in source · reviewed 8 Nov 2026
- Private repository
- Architecture document (private repository)
- Private repository
- Architecture document (private repository)
- Private repository
- Architecture document (private repository)
- Private repository
- Architecture document (private repository)
- menuwav.com
- Project inventory in GitHub profile README
Private repositories are available to review on request.
Related projects
SaaS · WebLiveTotalCashPro
The back office for hospitality groups — cash, staff, stock, suppliers and compliance in one system.
Eight role-scoped route groups (super-admin, business-admin, staff, rider, kiosk, security, API v1) over one domain model, guarded by 35 authorization policies.
- Laravel
- PHP
- Sanctum
- Vite
SaaS · MobileLiveLabelBuddy
Product labels and EU energy labels, generated and printed from a phone.
Subscription-gated Flutter client (subscription and printer modules) backed by a Sanctum API with Stripe billing.
- Laravel
- Sanctum
- Stripe
- Vite
Web · BackendLiveBuildexa Technologies
The company behind MenuWave, TotalCashPro, BiteRush and LabelBuddy.
A single staff console that reviews tenant companies across four separate SaaS products.
- PHP
- Laravel
- Vite
- Tailwind CSS
Next project
TotalCashPro
The back office for hospitality groups — cash, staff, stock, suppliers and compliance in one system.