Skip to content
Elian Maamer

All projects05Dev & AI2026

Servio

Table-service order-taking app — in production

I worked in this restaurant before writing a line of it. I saw what could be better organised, and what a better-run dining room earns. Servio replaces the paper pad and the trips back to the till with a phone. The aim hasn't changed since: make the work easier.

1:28
Context
My first client: a Brussels restaurant, whose entire IT I run — network, printers, till, online orders, website and app.
Role
Design, development, database, deployment, support. Solo project, with AI assistance.
Year
2026
Team
Solo, with AI assistance (schema review, migrations)
Duration
8 months of work (OperaApp then Servio)
Status
In production in a Brussels restaurant since 13 June 2026 · App Store release in progress
Tools
FlutterDartSupabasePostgreSQLRealtimeEdge FunctionsStripe ConnectESC/POSHiveSentryNext.js

Intent

I come from images: at HEAJ I do 3D and visual effects. Servio is what happens when that curiosity meets a real problem — I learned Flutter, PostgreSQL and the restaurant printer protocol because it had to hold up through a service. The film at the top of this page comes from the same hand as the app: 88 seconds rendered frame by frame in Python, with a soundtrack synthesised without a single sample.

IA

AI is used as a development assistant (schema review, migrations, proofreading). Architecture, decisions and responsibility for the code are mine.

Process

Step 01

The application

The waiter takes the order on their phone; the ticket comes out in the kitchen within a second.

  • Floor plan

    Floor plan

  • Taking an order

    Taking an order

  • Options and cooking

    Options and cooking

  • Service history

    Service history

  • Bookings

    Bookings

  • Settings

    Settings

  • Sunlight mode

    Sunlight mode

Step 02

In production, not in a demo

Measured on 11 September 2026 on the production database, after three months of continuous service.

Measured on 11/09/2026 · in operation since 13/06/2026A restaurant in Brussels

Real production

3,234
tickets printed
kitchen · bar · till
1,771
orders sent
4,859
items ordered
88
services opened
lunch and dinner

Code (Flutter / Dart)

116,020
lines of Dart
360 files
185
test files
≈ 30% of the code
63
screens
143
commits

Database (Supabase / PostgreSQL)

76
PostgreSQL tables
RLS enabled on 76 / 76
113
RLS policies
28
real-time tables
261
SQL functions

Step 03

Under the hood

Flutter for iOS and Android, Supabase for data and real time, ESC/POS printing on the restaurant's network.

SERVIO — architectureFlutter · Supabase
APP FLUTTER / DARTiOS and Android, one codebase63 screens · 185 test filesHive local cache (offline)offline queueSUPABASEPOSTGRESQL76 tables · 113 RLS policies261 SQL functions · tenant_id everywhereREALTIME28 synced tablesAUTHroles · per-person permissionsEDGE FUNCTIONS (5)send-sms · stripe-webhook · stripe-workersend-outbound · delete-accountIMPRIMANTES ESC/POSkitchen · bar · tillTCP 9100 · DLE EOTatomic lease per ticketSTRIPE CONNECTonline ordering · direct chargesSMS CLIENTStemplates · automatic sendingSENTRYtelemetry without personal dataorders · synctickets (local network)

Step 04

What Servio does not do

No fiscal function: Servio complements a certified till, it does not replace one. No payment goes through the app. No data is ever deleted. These three limits are deliberate — the next step is the GKS exam to become a certified till in Belgium.

Problems metSolutions

  1. 01 · Problems met

    Never create a duplicate order on unstable WiFi: the waiter taps twice, the kitchen gets the dish twice.

    Solutions

    Unique id generated on the app side, passed to the SQL send function with ON CONFLICT DO NOTHING: a replay has no effect.

  2. 02 · Problems met

    A successful TCP send doesn't prove the paper came out: out of paper, cover open, printer off.

    Solutions

    ESC/POS status query (DLE EOT) before marking the ticket printed, and an alert on every device if nothing is confirmed. Trap fixed along the way: closing the socket abruptly truncated tickets.

  3. 03 · Problems met

    Two phones sharing an account signed everything under the same identity: €718.50 credited to the wrong waiter for three weeks, with nothing to flag it.

    Solutions

    Person and device decoupled: named invitation code, logged and reversible record merge, personal code proof required database-side.

Undergrowth with a wooden cabin in the fog

Next project · 06

Forêt — temps réel

Twenty-three seconds of undergrowth rendered in real time.