Skip the Queue. Not the Food.
A college canteen food pre-ordering web app for VU Pune. Students pre-order and pay via UPI before walking to the canteen — no queues, no cash, no chaos.
- Pre-Order — Browse the full menu, add to cart, and pay before leaving your seat
- UPI Payments — Razorpay integration with test mode support
- Live Order Tracking — Real-time status updates via Pusher WebSockets
- Token System — Every order gets a 4-digit token for pickup
- Auto-Refund — Razorpay refund triggered automatically if canteen doesn't respond in 5 minutes
- Canteen Dashboard — Live order feed, OPEN/CLOSED toggle, menu management, earnings stats
- College-Only Auth — Clerk email OTP restricted to
@vupune.ac.inaddresses
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| Styling | Tailwind CSS v4 |
| Auth | Clerk v6 (Email OTP) |
| Database | Neon (Serverless Postgres) |
| ORM | Drizzle ORM |
| Realtime | Pusher Channels |
| Payments | Razorpay UPI |
| State | Zustand |
| Deployment | Vercel |
app/
page.tsx # Student splash / sign-in
menu/ # Browse menu
item/[id]/ # Item detail
cart/ # Cart review
checkout/ # Razorpay payment
order/[id]/ # Live order tracking
history/ # Past orders
profile-setup/ # First-time profile form
canteen/
login/ # Staff sign-in
dashboard/ # Live orders + open/close toggle
order/[id]/ # Accept / Reject / Ready / Collected
menu/ # Menu management
earnings/ # Revenue stats
api/ # All API routes
db/
schema.ts # Drizzle table definitions
seed.ts # Default canteen seed
lib/
db.ts # Lazy Neon DB client
pusher-server.ts # Pusher server singleton
pusher-client.ts # Pusher client singleton
razorpay.ts # Razorpay singleton
store/
cartStore.ts # Zustand cart with localStorage persist
- Sign in to the app with any email to create your Clerk account
- Go to Clerk Dashboard → Users → your account
- Set Public Metadata:
{ "role": "canteen" } - Visit
/canteen/dashboard
pending_payment → paid → approved → preparing → ready → collected
↘ cancelled
↘ refunded (auto or manual rejection)
Timeouts (via Vercel cron every minute):
pending_paymentolder than 15 min →cancelledpaidolder than 5 min (canteen no response) →refunded(auto Razorpay refund)
npm run dev # Start dev server
npm run build # Production build
npm run db:push # Push schema to Neon DB
npm run db:studio # Open Drizzle Studio
npm run db:seed # Seed default canteen rowGaurav Guddeti & Nihal Pardeshi — VU Pune, 2026