
Tomato
Tomato is a Zomato-inspired food delivery platform with dedicated flows for customers, restaurants, riders, and admins. Users can discover nearby restaurants, place orders, pay via Stripe or Razorpay, and track deliveries live on a map.
Overview
Overview
Marketplace-grade food delivery built with microservices
Food delivery platforms need much more than ordering screens—real-time order tracking, rider dispatch, payment handling, restaurant management, admin verification, and scalable communication between multiple systems.
Tomato is built with six Dockerized Express + TypeScript microservices: Auth, Restaurant, Rider, Admin, Realtime, and Utils. Customers can browse nearby restaurants, manage carts and addresses, pay with Stripe or Razorpay, and track riders live. Restaurants manage menus and update order states, while riders receive nearby delivery requests through geo-based matching. RabbitMQ handles async workflows like payments and dispatching, and Socket.IO powers real-time updates across all roles. MongoDB stores application data with geospatial indexing, while the React 19 frontend provides role-based flows, live updates, and map integration using Leaflet.
The project demonstrates production-style Node.js microservice architecture with async queues, real-time communication, dual payment gateways, live tracking, Docker-based deployment, and scalable service separation.
Features
Features
Multi-role access
Google OAuth and JWT sessions with role selection for customers, sellers, riders, and admins. Each role gets its own dashboard; admins verify pending restaurants and riders before they go live.
Location-based discovery
Browser geolocation and Nominatim reverse geocoding power nearby restaurant search, with results sorted by distance from the customer's coordinates.
Ordering & payments
Full cart and checkout flow with saved addresses, delivery fees, and an eight-step order lifecycle. Stripe and Razorpay payments run through the Utils service, with RabbitMQ confirming orders asynchronously.
Live tracking & dispatch
Socket.IO pushes order and rider updates to the right users. When food is ready, RabbitMQ triggers geo-matching for riders within 500m; customers follow deliveries on a live map with Leaflet routing.
Seller & rider tools
Restaurants manage menus, advance orders, and get sound alerts on new requests. Riders accept or reject nearby jobs, toggle availability, and stream GPS location back to customers.
Architecture
Architecture
Frontend
- React
- TypeScript
- Tailwind CSS
- React Router
- Socket.IO
- Axios
Backend
- Node.js
- Express
- TypeScript
- Socket.IO
- JWT
- Google OAuth
- RabbitMQ
Database
- MongoDB
- Mongoose ORM
- Cloudinary
Infrastructure
- Render Dockerize Services
- Vercel (frontend SPA)
- AWS-hosted RabbitMQ
- Stripe + Razorpay Payment Gateways
- Cloudinary (media)
Gallery
Product Screenshots
















Metrics
Metrics
Microservices
6 (Auth, Restaurant, Rider, Admin, Realtime, Utils)
User roles
4 (Customer, Restaurant, Rider, Admin)
Payment gateways
Stripe + Razorpay
Real-time updates
Socket.IO
Async queues
RabbitMQ