The paper pads are gone. The line moves faster.
FoodDesk is the open-source ordering system for food festivals, pop-up restaurants and community kitchens. Waiters take orders on their phones, the kitchen ticks off dishes on a tablet, tickets print themselves — and at the end of the night the numbers are already added up. No cloud, no subscription, no per-order fees.
Demo accounts: mario (waiter), cucina (kitchen), admin — password fooddesk-demo. Open it on two devices — send an order from one and watch it appear on the other instantly.
Built for the whole crew
Every role gets exactly the screen it needs — and nothing it does not.
🧾 Waiters
A phone-first PWA: tap products, count covers, add kitchen notes, send. Orders are numbered per service day, and a network hiccup can never create a duplicate order.
🍳 The kitchen
New orders appear the moment they are sent — no refreshing. Each dish is one big tap to mark done, and a cancelled order shouts CANCELLED instead of silently vanishing.
🎩 The maître d'
Runs the room with almost-admin powers: the menu, every order, cancellations and reports — but no settings page, and staff management limited to waiter accounts.
⚙️ The admin
Builds the menu, manages staff and roles, and styles every printed document from the browser — logo, watermark, paper size, 80mm thermal roll included — in five languages.
📊 The treasurer
A live daily dashboard: revenue, covers, average per cover, per-product and per-category breakdowns — plus clean CSV and a one-page PDF report.
🖨 Printing
Kitchen tickets go straight to any CUPS printer with automatic retry when it jams; without a printer, the browser's print dialog steps in.
See it in action
A sample festival evening on the live demo — reset every 6 hours.
A night at the venue
Everything runs on one inexpensive box — a mini-PC or Raspberry-class board — on the venue Wi-Fi. Phones install FoodDesk like a native app straight from the browser.
The database is a single SQLite file, backed up automatically every 15 minutes. An order taken at 1:30 AM still counts for tonight — restaurants do not end at midnight.
Run it
One command with Docker. The generated admin password is printed on first start.
docker run -d --name fooddesk -p 3000:3000 -v fooddesk-data:/data \
ghcr.io/adefilippo83/fooddesk:latest
docker logs fooddesk # the admin password is printed on first start
Prefer a venue server? One idempotent install script sets up systemd, nginx and backups on Debian. Or open it in GitHub Codespaces for a throwaway instance.
Principles the code actually enforces
TypeScript end to end · Fastify · SQLite · React 19 PWA · GPLv3.
- Money is integer cents — no floats in the money path, and prices always come from the database — a tampered client cannot discount.
- History is immutable — order lines snapshot name and price; cancellations are audited, never erased. Yesterday’s receipts survive today’s menu edits.
- Authorization lives on the server — every route is guarded; the UI hiding admin screens is cosmetic and the test suite is the real contract.
- Hardened by default — scrypt passwords, login lockout, CSP and security headers, Origin checks on writes, idempotent order submission.