Satyajeet.
Tomato
ReactTypeScriptTailwindExpressNode.jsSocket.IOGoogle OAuthStripeRazorpayMongoDBRabbitMQDocker

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

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

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

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

Tomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshotTomato screenshot

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