

Multi-channel ordering platform for a charcoal grill restaurant: NestJS API, Expo mobile app, server-rendered Arabic/English ordering website and an admin dashboard with a kitchen display.

Client
Farahat Restaurant & Charcoal Grills
Date
August 2026
Duration
4 days
Technologies
17 tools
Farahat is a full ordering and delivery system built for Farahat Restaurant and Charcoal Grills in Egypt. It is a monorepo with four parts: a NestJS API on PostgreSQL and Redis, an Expo React Native app for customers and drivers, a Next.js ordering website, and a React admin dashboard that includes a kitchen display screen. Customers order for delivery or branch pickup in Arabic or English, pay by cash or card through Paymob, and follow the order until it arrives. Staff manage menu, branches, coupons, finance and support from the dashboard. Everything ships as one Docker Compose stack behind a Caddy reverse proxy that handles TLS.
A restaurant order touches money, kitchen timing, couriers and customer support at once, so small bugs turn into real losses. Prices had to stay exact, an order could not jump to an invalid status, and a lost response on a mobile network could not create a duplicate order or a double charge. The mobile app and the website both needed Arabic right-to-left and English left-to-right. The site also had to be indexable for search without exposing the client attestation key to crawlers, and staff needed live order visibility without a heavy realtime setup. Prices differ per branch and items can sell out per branch.
The API is a NestJS modular monolith with 24 feature modules. Money is stored as integer minor units and each order line keeps a price snapshot. An enforced state machine controls order status, and checkout uses an idempotency key. Order events go through a transactional outbox so notifications survive a crash. The website is a backend-for-frontend: the browser never calls the API, so the app key and tokens stay on the server and the menu is server-rendered. Sessions live in httpOnly cookies, and guest carts merge into the real cart at sign-in. Auth uses Argon2id, rotating refresh tokens and permission and branch-scope guards. Paymob webhooks are verified with an HMAC signature. The dashboard polls for updates every few seconds. Nightly backups are AES-256-GCM encrypted.
The repository delivers four working applications and a deployable production stack: API, mobile app, ordering website and dashboard with kitchen display, all brought up with one docker compose command and automatic HTTPS. The API entrypoint runs migrations before accepting traffic, and the ready probe checks the database. The README lists what the code does not do, such as unused queue workers and a realtime layer no client subscribes to, so the documentation matches the code. Unit tests cover money, geo, the order state machine and route authorization. No traffic or sales figures are claimed here because the repository does not state any.





