Anxiang
Table ordering, a live kitchen display, menu and inventory management, bill settlement and thermal receipt printing for a café (岸香咖啡). Built alone and deployed as a system service behind Nginx TLS.
The problem
A small restaurant needs ordering, kitchen, cashier and back office to agree with each other in real time, without a vendor system and its monthly fee.
How it works
- Customers order from their table with customisable specs such as temperature, size, sugar and toppings. The kitchen sees orders arrive over WebSocket and moves them through their statuses.
- Five roles (admin, manager, cashier, waiter and kitchen) with granular permissions, using JWT access and refresh tokens, so each person only sees what they need.
- ESC/POS support prints kitchen tickets and receipts on thermal printers.
- An admin dashboard manages menu, categories, pricing, availability, bills and inventory. Schema changes go through Alembic migrations, and SQLite runs in WAL mode.
- Server state lives in React Query and client state in a small context store. The interface is Chinese first, with optional English dish names.
Built with
- React
- TypeScript
- FastAPI
- SQLAlchemy
- SQLite
- WebSocket
- Docker
- Nginx
