KhateJao is a full-stack food discovery, ordering, and table-booking platform built as a portfolio-grade project. The product direction is inspired by food delivery and restaurant discovery apps, with an added booking layer where customers can inspect restaurant spaces and choose tables based on view preference.
- Customer discovery for restaurants, menu items, and delivery ordering.
- Table booking flow with preference matching for window view, projector view, terrace, quiet zone, private dining, and live-music view.
- 360-view-ready restaurant scenes with hotspot metadata for seating zones and table labels.
- Real restaurant names and optional Google Places customer-uploaded photos, stored as photo resource metadata in PostgreSQL and rendered through the backend.
- Restaurant operations dashboard for orders, bookings, table inventory, and view-led dining.
- NestJS API backed by PostgreSQL and Prisma.
- Frontend: React, Vite, React Router, Lucide icons
- Backend: NestJS, Prisma, PostgreSQL
- Tooling: Docker Compose, TypeScript, ESLint, Node test runner
npm install
npm run devThe frontend runs at http://localhost:5173.
docker compose up -d postgres
cd backend
npm install
cp .env.example .env
# Replace JWT_SECRET with a random value of at least 32 characters.
npm run prisma:migrate
npm run seed
npm run devThe backend runs at http://localhost:8000/api.
Public registration can create customer and restaurant-owner accounts only. Create an
administrator locally by setting ADMIN_EMAIL and ADMIN_PASSWORD in backend/.env,
then running:
cd backend
npm run admin:createUse a password of at least 12 characters and do not run the demo seed in production.
Do not scrape images from Zomato, Google, Instagram, or customer review pages. This project uses the Google Places API path instead:
- Add
GOOGLE_PLACES_API_KEYtobackend/.env. - Start the backend.
- Sync real restaurants and photo resource metadata:
curl -X POST http://localhost:8000/api/places/sync-restaurants \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-d '{
"city": "Bengaluru",
"queries": [
"Rim Naam MG Road Bengaluru",
"Karavalli Residency Road Bengaluru",
"Toit Indiranagar Bengaluru",
"Mavalli Tiffin Rooms Lalbagh Bengaluru",
"Vidyarthi Bhavan Basavanagudi Bengaluru",
"Central Tiffin Room Malleshwaram Bengaluru",
"Airlines Hotel Lavelle Road Bengaluru",
"Truffles St Marks Road Bengaluru",
"Nagarjuna Residency Road Bengaluru",
"Meghana Foods Indiranagar Bengaluru"
]
}'The API stores restaurant/place metadata and Google photo resource names in Postgres. Images are rendered through /api/place-photos/image, which redirects to the authorized Google photo URL at runtime. If Google returns photo attributions, the frontend displays them next to the image.
Reference: Google Places Photo requests require a photo resource name plus maxWidthPx or maxHeightPx, and returned authorAttributions must be displayed wherever the photo is shown.
Frontend:
npm run build
npm auditBackend:
cd backend
npm run prisma:generate
npm run build
npm run lint
npm test
npm auditPOST /api/auth/registerPOST /api/auth/loginGET /api/restaurantsGET /api/restaurants/:idOrSlugGET /api/restaurants/:restaurantId/availabilityPOST /api/bookingsGET /api/bookings/restaurant/:restaurantIdPOST /api/ordersGET /api/delivery/assignmentsPOST /api/places/sync-restaurantsGET /api/place-photos/image?name=...
Use this project as a primary portfolio project by framing it as:
Built a NestJS/PostgreSQL restaurant discovery and table-booking platform with 360-view-ready seating metadata, preference-based table recommendations, food ordering, and restaurant operations workflows.