A full-stack restaurant management platform providing digital menu browsing, table reservation management, and an administrative dashboard for operations and analytics.
Annapurna is built as a two-tier application: a React/TypeScript client and a Node.js/Express API server, backed by MongoDB. It supports customer-facing menu and reservation flows alongside an internal admin console for staff to manage inventory, reservations, and performance metrics.
- Menu Management — Categorized menu catalog with dietary classification (veg/non-veg), availability status, and trending indicators.
- Table Reservations — Interactive floor plan (Ground, Lounge, Patio) with real-time availability and booking status tracking (Pending, Confirmed, Completed, Cancelled).
- Admin Dashboard — Weekly revenue and booking analytics, menu CRUD operations with image upload, and reservation lifecycle management.
- Authentication — Google OAuth 2.0 via Passport.js, session management with JWT.
- Responsive UI — Component-driven design system built on CSS variables.
| Layer | Technology |
|---|---|
| Frontend | React, TypeScript, Vite, Axios |
| Backend | Node.js, Express, TypeScript, Mongoose |
| Database | MongoDB Atlas |
| Auth | Passport.js (Google OAuth strategy), JWT |
| Media Storage | Cloudinary |
- Node.js v16 or later
- A MongoDB Atlas cluster
- A Cloudinary account
- A Google Cloud Console project with OAuth 2.0 credentials
git clone https://github.com/lightning4747/Restaurant.git
cd Restaurantcd server
npm installCreate a .env file in server/ using the template below. Do not commit this file or any real credentials to version control.
PORT=8000
NODE_ENV=development
# Database
MONGO_URI=
# Auth
JWT_SECRET=
JWT_EXPIRES_IN=7d
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_CALLBACK_URL=http://localhost:8000/api/auth/google/callback
# Cloudinary
CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
# URLs
CLIENT_URL=http://localhost:5173
FRONTEND_URL=http://localhost:5173
# Initial admin bootstrap (set once, then rotate/remove)
ADMIN_EMAIL=
ADMIN_PASSWORD=Seed the database and start the server:
npm run seed # menu categories and items
npm run seed:tables # table/floor layout
npm run devcd ../client
npm installCreate a .env file in client/:
VITE_API_URL=http://localhost:8000/api
VITE_GOOGLE_MAPS_API_KEY=Start the client:
npm run dev| Service | Purpose | Provisioning |
|---|---|---|
| MongoDB Atlas | Primary datastore | mongodb.com |
| Google OAuth | Authentication | Google Cloud Console |
| Cloudinary | Menu image storage | cloudinary.com |
| Google Maps API | Contact/location page | Google Cloud Console |
- All secrets are supplied via environment variables and must never be committed to source control.
- The
ADMIN_EMAIL/ADMIN_PASSWORDbootstrap values are for initial setup only; rotate or disable them after the first admin account is provisioned. - Add
.envto.gitignorein bothserver/andclient/if not already present.
Specify a license (e.g., MIT) here if this project is intended for public distribution.







