Production-ready QR ordering web app inspired by ONEZO POS.
- Frontend: React + Vite + Tailwind CSS
- Backend: Node.js + Express + MongoDB (Mongoose)
- Real-time: Socket.io
client- customer menu + admin dashboardserver- REST APIs, socket server, Mongo models, seed script
- QR table URL flow:
/menu?table=1 - Category-based customer menu (Pizza, Burgers, Drinks, Desserts)
- Cart with quantity updates, remove, total, and localStorage persistence
- Place order with table number, timestamp, status, and item payload
- Admin dashboard (
/admin) with live incoming orders - Status pipeline:
Pending -> Preparing -> Completed - Real-time order and status updates via Socket.io
- Mobile-first UI with sticky cart CTA, card layout, animations
- Dark mode support
- Order confirmation screen
- Call waiter from table with real-time admin alert + sound
- Estimated prep time is included in backend order records
- Install dependencies:
npm install
- Copy env:
cp .env.example .env(or create.envmanually on Windows)
- Set values in
.env:PORT=5000MONGODB_URI=your_mongodb_connection_stringCLIENT_URL=http://localhost:5173
- Seed products:
npm run seed
- Start backend:
npm run dev
- Install dependencies:
npm install
- Copy env:
cp .env.example .env(or create.envmanually)
- Set API URL:
VITE_API_BASE_URL=http://localhost:5000
- Start frontend:
npm run dev
From project root:
npm run dev:server- start backendnpm run dev:client- start frontendnpm run seed- seed sample productsnpm run build- build frontend
GET /api/products- fetch menu itemsPOST /api/orders- create orderGET /api/orders- fetch all ordersPUT /api/orders/:id- update order statusPOST /api/waiter-calls- create waiter callGET /api/waiter-calls- fetch waiter callsPUT /api/waiter-calls/:id/resolve- resolve waiter call
- Set root directory to
server - Build command:
npm install - Start command:
npm start - Add env vars:
PORTMONGODB_URICLIENT_URL(your Vercel URL)
- Set root directory to
client - Build command:
npm run build - Output directory:
dist - Add env var:
VITE_API_BASE_URL=https://your-render-backend-url
- Razorpay integration is intentionally left as optional to avoid shipping test keys in source.
- You can add payment intent and checkout endpoints under
server/src/routes.