FoodDesk

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.

Taking an order on a waiter's phone

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.

Kitchen display with live orders
The kitchen display: one big tap per dish, orders complete themselves.
End-of-day report dashboard
End-of-day reports: revenue, covers and breakdowns, ready to export.

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.

📱 Waiters' phonesPWA on the venue Wi-Fi
🍳 Kitchen tabletlive updates, no refresh
🖥 One small boxnginx · Fastify · SQLite
🖨 PrinterCUPS

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.