Back to work
Personal flagship · Flutter + Next.js monorepo · 2025

la_carte_mobile

A restaurant ordering ecosystem: guests order from their phone, the team runs the floor from a tablet, the kitchen sees orders appear in real time.

Flutter Dart Next.js 16 TypeScript Firebase Stripe Sentry Playwright Artillery
Challenge

A restaurant needs to orchestrate guest orders, kitchen prep, payments, POS and team — across five different platforms.

Approach

Monorepo Flutter (iOS + Android guest app) + Next.js (back-office + admin + POS) + Python (kitchen routing). Stripe, Apple Pay, Google Pay, Playwright & Artillery tests, Sentry monitoring.

Outcome

174,060 lines of code, 5 apps, one operator from design to deployment.

Case study · Monorepo

Six months, five apps, one operator.

  • ~170k Lines of code (Dart + TS)
  • 147 Commits since Oct. 2025
  • 5 Apps in one monorepo
  • 1 Developer (me)
// Distribue une commande sur les stations de prep (cuisine, bar, froid).
// Chaque station a sa file, son débit, sa capacité de pointe.
export function routeOrder(order: Order, stations: Station[]): Route[] {
  const routes: Route[] = []
  for (const item of order.items) {
    const eligible = stations.filter(s => s.canPrep(item.category))
    // station la moins chargée qui tient encore la fenêtre d'envoi
    const station = eligible
      .sort((a, b) => a.currentLoad() - b.currentLoad())
      .find(s => s.etaWith(item) <= item.expectedAt) ?? eligible[0]

    routes.push({ station: station.id, item, startAt: station.nextSlot() })
    station.enqueue(item)
  }
  return routes
}

This project is exactly what I look for in a freelance engagement: one person who understands the domain, designs the data flow, implements all five surfaces and owns ops. No handoff meetings, no "that's the front-end's bug". A product that ships, documented, pick-up-able by the next team.

01Context

The problem it solves

A restaurant usually runs on a stack of systems that don't talk to each other: POS over here, kitchen printer over there, delivery platforms somewhere else, and an owner flipping between four interfaces to figure out what's happening.

The intuition behind la_carte_mobile: give a single operator — manager, owner, shift lead — every tool to run the floor from one coherent stack. QR-code ordering, order flow, payments, analytics, all real-time.

02What I built

Two apps, one shared backbone

  • Guest mobile app (Flutter) — QR scan, menu browsing, cart, payment (Stripe / Apple Pay / Google Pay), real-time order tracking.
  • Operator web app (Next.js) — dashboard, floor plan, order pipeline, kitchen/bar routing, team scheduling, register, analytics.
  • Cloud Functions — payment orchestration, order state machine, real-time sync between guests and operators via Firestore.
  • Dynamic QR codes — one per table, generated by the back-office, pointing to the menu filtered for that location.
  • Test & observability stack — Playwright for E2E, Artillery for load, Sentry for prod monitoring.
03Architecture

A monorepo, a single source of truth

Everything lives in one repository — Flutter app at the root, website/ Next.js alongside, functions/ TypeScript for the event-driven backend, scripts/ for the PostGIS database (geographic floor plan).

Firestore is the real-time backbone: orders land there from mobile, Cloud Functions trigger payments and state transitions, the back-office listens and pushes changes to the kitchen tablet. Stripe Connect handles multi-restaurant money flows.

04Stack
FlutterMobile app (iOS + Android)
Next.js 16Operator web, App Router
TypeScriptWeb + Cloud Functions
FirebaseAuth, Firestore, Functions, FCM
StripePayments + Apple/Google Pay
PostGISGeographic floor plan
PlaywrightE2E tests
ArtilleryLoad testing
SentryProduction monitoring