Restaurant POS and Multilingual Menu System (Django REST + Next.js)
A custom point-of-sale, inventory and reporting system, plus a four-language public menu, for a Persian restaurant in Turkey. Built with Django REST Framework and Next.js to replace an existing SambaPOS setup.
- Certbot
- Django
- Django REST Framework
- ESC/POS
- Gunicorn
- JWT
- Next.js
- Nginx
- PM2
- PostgreSQL
- PyInstaller
- Python
- Tailwind CSS
- TypeScript
- Ubuntu

Problem
The restaurant, a Persian restaurant in Turkey, needed a custom system built around its own workflow to replace its SambaPOS setup. The system had to cover a cashier screen, stock tracking based on recipes, sales reporting, and a public menu in four languages (Turkish, English, Arabic and Persian).
Two requirements made the project more than routine. Printing had to work across two very different devices: a network thermal kitchen printer on an isolated local network that a cloud server cannot reach, and a USB receipt printer attached to the cashier's computer. Stock also had to be deducted per dish through recipes (for example, one kebab plate consumes specific skewers), not per item sold.
Solution
Three independent parts, each deployed on its own:
- A Django REST Framework API on PostgreSQL
- A Next.js admin application for the POS and management screens
- A separate Next.js public menu
Key technical decisions:
- Access control: email-based login with JWT (10-hour access tokens to match a shift, 7-day refresh tokens). Roles are owner, manager, cashier and staff. Inventory and reports are restricted to managers and owners.
- Recipe-based inventory: an append-only stock ledger, so current stock is always computed from recorded movements. Stock is deducted only when an order is completed, through recipe lines. The menu app is display-only and holds no inventory logic.
- Four languages without third-party i18n libraries: per-language translation tables served through a
?lang=parameter with an English fallback. The admin forms support right-to-left input for Arabic and Persian. - Multi-currency payments: cash in TRY, USD and EUR plus card payments, with an exchange-rate snapshot stored on each order. The system distinguishes a pre-payment bill from a post-payment receipt.
- Printing through a job queue: the first design used a local agent that only accepted requests from the POS computer, so orders placed from phones did not print. It was replaced by a print-job queue in the API. A small Windows agent on the POS computer polls the queue using a shared secret and forwards ticket data to the kitchen printer. Jobs expire after a configurable time. The USB receipt printer uses browser kiosk printing with a layout tuned for 72 mm thermal paper. Printer settings can be changed from the admin panel.
- Deployment: Ubuntu 24.04 VPS with Gunicorn, Nginx, PM2 and HTTPS through Certbot. Changes go through Git only, followed by migrate, build and restart.
Result
All three parts are built and running on a production server.
- POS and management: table map, order screen, multi-currency payment, inventory and stock ledger, reports, user management, and menu management with four-language forms and image upload.
- Public menu: available in Turkish, English, Arabic and Persian. Old printed QR-code links redirect to the new menu.
- Printing: kitchen ticket printing was tested end to end on the live system. An order placed from a mobile device was printed in the kitchen and its print job completed.