WorkSaaS · Web · MobileLive

MenuWave

A multi-tenant operating system for restaurants — from the till to the TV screen.

MenuWav homepage showing its guest ordering, kitchen pass and menu screen workflows
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

  1. 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
  2. 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
  3. 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)
  4. 04 · database

    Data

    • 116 Eloquent models · 75 migrations
    • TenantScope global scope
    • MySQL (server) · SQLite via sqflite (POS & player, on-device)
  5. 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.

  • TotalCashPro homepage showing its restaurant operations dashboard for cash, staffing, attendance and weekly reports
    SaaS · WebLive

    TotalCashPro

    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
  • LabelBuddy homepage for product label printing
    SaaS · MobileLive

    LabelBuddy

    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
  • Buildexa Technologies homepage featuring its software products
    Web · BackendLive

    Buildexa 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.