Welcome to digidiner! A full-stack web app I built to offer a smooth online menu and pickup ordering experience. The project uses React (Vite, TypeScript, Tailwind) for the frontend, Node.js/Express for the backend, and leverages both MongoDB and PostgreSQL for data storage.
- Browse a categorized menu (starters, mains, desserts, drinks, etc.)
- Add and remove items from a shopping cart
- See your cart total and details
- Place an order with your name and phone number (no payment required)
- Get an order confirmation and look up past orders by phone or email
- Frontend: React, TypeScript, Vite, Tailwind CSS, shadcn/ui
- Backend: Node.js, Express, Mongoose (MongoDB), pg (PostgreSQL)
- Databases:
- MongoDB Atlas (menu items)
- Neon DB PostgreSQL (orders)
I chose MongoDB for menu items because restaurant menus can change a lot—new categories, specials, or item options. MongoDB's flexible schema makes this easy. For orders, I wanted strong data integrity and the ability to do relational queries (like order history by customer), so PostgreSQL was the best fit.
- Go to the backend folder:
cd server - Install dependencies:
npm install
- Create a
.envfile inserver/with your database URIs:PORT=5001 MONGO_URI=your-mongodb-uri PG_DATABASE_URL=your-postgres-uri
- Start the backend:
The API will run on
npm start
http://localhost:5001.
- Go to the project root (if not already there):
cd .. - Install dependencies:
npm install
- Create a
.envfile in the root with:VITE_API_BASE_URL=http://localhost:5001/api
- Start the frontend:
The app will be at
npm run dev
http://localhost:5173.
GET /api/menu— Get all menu itemsGET /api/menu/:id— Get a single menu itemPOST /api/orders— Place a new orderGET /api/orders/lookup?phone=...— Get orders by phoneGET /api/orders/lookup?email=...— Get orders by email
- Backend: https://digidiner-backend.onrender.com
- Frontend: https://digidiner.netlify.app
If you deploy your own version, make sure to set the VITE_API_BASE_URL in Netlify to your backend's /api endpoint, and update CORS in the backend to allow your Netlify domain.
- The backend and frontend are deployed separately, so CORS must be set up right.
- Menu data is seeded using
server/seeder.js. - PostgreSQL tables must exist before running the backend (see
orderRoutes.jsfor structure). - No authentication—order lookup is by phone/email only.
- I focused on clean code, clear separation of concerns, and a smooth user experience.
Thanks for checking out digidiner! If you have questions or want to contribute, feel free to open an issue or PR.





