A full-stack ride-sharing application built with Node.js/Express backend and React/Vite frontend, featuring real-time location tracking and ride management using WebSocket technology.
- Project Overview
- Tech Stack
- Project Structure
- Installation & Setup
- Environment Variables
- Running the Project
- Project Flow
- API Endpoints
- Socket.IO Events
- Database Schema
- Frontend Components
- Key Features
This Uber-like application is a two-sided marketplace that connects:
- Users: People looking for rides
- Captains: Drivers offering rides
- User and Captain authentication (Register/Login/Logout)
- Real-time ride booking and management
- Live location tracking using Google Maps API
- Fare calculation based on distance
- Real-time communication using WebSocket (Socket.IO)
- Ride confirmation and completion workflow
- Runtime: Node.js
- Framework: Express.js v5.1.0
- Database: MongoDB (Mongoose ODM v8.16.1)
- Authentication: JWT (JSON Web Tokens)
- Password Hashing: bcrypt/bcryptjs
- Real-time: Socket.IO v4.8.1
- API Validation: express-validator
- CORS: Enabled for frontend communication
- Environment: dotenv for configuration
- UI Framework: React 19.1.0
- Build Tool: Vite 7.0.3
- Routing: React Router v7.6.3
- Styling: Tailwind CSS v4.1.11
- Icons: Remix Icon v4.6.0
- Animations: GSAP v3.13.0
- HTTP Client: Axios
- Real-time: Socket.IO Client v4.8.1
- CSS: Custom CSS + Tailwind
uber-app/
โโโ Backend/ # Node.js/Express Server
โ โโโ app.js # Express app setup & routes
โ โโโ server.js # Server startup & Socket.IO initialization
โ โโโ socket.js # Socket.IO configuration & event handlers
โ โโโ package.json # Backend dependencies
โ โโโ .env # Environment variables
โ โ
โ โโโ controllers/ # Business logic
โ โ โโโ user.controller.js # User registration, login, logout, profile
โ โ โโโ captain.controller.js # Captain registration, login, profile
โ โ โโโ ride.controller.js # Ride creation, confirmation, completion
โ โ โโโ map.controller.js # Maps & location-related endpoints
โ โ
โ โโโ services/ # Business logic & database operations
โ โ โโโ user.service.js # User CRUD operations
โ โ โโโ captain.service.js # Captain CRUD operations
โ โ โโโ ride.service.js # Ride logic (create, confirm, complete)
โ โ โโโ map.service.js # Google Maps integration & distance calc
โ โ โโโ fare.util.js # Fare calculation logic
โ โ
โ โโโ models/ # Database schemas
โ โ โโโ user.model.js # User schema with auth methods
โ โ โโโ captain.module.js # Captain schema with auth methods
โ โ โโโ ride.module.js # Ride schema with status tracking
โ โ โโโ blacklistToken.model.js # Token blacklist for logout
โ โ โโโ middlewares/
โ โ โโโ auth.middleware.js # JWT verification middleware
โ โ
โ โโโ routes/ # API endpoints
โ โ โโโ user.routes.js # /users/* endpoints
โ โ โโโ captain.routes.js # /captains/* endpoints
โ โ โโโ ride.routes.js # /rides/* endpoints
โ โ โโโ map.routes.js # /map/* endpoints
โ โ
โ โโโ db/
โ โโโ db.js # MongoDB connection setup
โ
โโโ Frontend/ # React/Vite Application
โ โโโ src/
โ โ โโโ main.jsx # React entry point with providers
โ โ โโโ App.jsx # Main app router
โ โ โโโ App.css # Global styles
โ โ โโโ index.css # Base styles
โ โ โ
โ โ โโโ context/ # Global state management
โ โ โ โโโ UserContext.jsx # User state & auth
โ โ โ โโโ CaptainContext.jsx # Captain state & auth
โ โ โ โโโ SocketContext.jsx # Socket.IO connection & events
โ โ โ
โ โ โโโ Pages/ # Full page components
โ โ โ โโโ Start.jsx # Landing/Home page
โ โ โ โโโ UserLogin.jsx # User login page
โ โ โ โโโ UserSignup.jsx # User registration page
โ โ โ โโโ UserLogout.jsx # User logout
โ โ โ โโโ UserProtectWrapper.jsx # Protected route wrapper for users
โ โ โ โโโ Home.jsx # User home (search & booking)
โ โ โ โโโ Riding.jsx # User riding status page
โ โ โ โโโ CaptainLogin.jsx # Captain login page
โ โ โ โโโ CaptainSignup.jsx # Captain registration page
โ โ โ โโโ CaptainProtectWrapper.jsx # Protected route wrapper for captains
โ โ โ โโโ CaptainHome.jsx # Captain home (available rides)
โ โ โ โโโ CaptainRiding.jsx # Captain riding status page
โ โ โ โโโ test.jsx # Test component
โ โ โ
โ โ โโโ componets/ # Reusable UI components
โ โ โ โโโ LocationSearchPanel.jsx # Location input & suggestions
โ โ โ โโโ VehiclePanel.jsx # Vehicle type selection
โ โ โ โโโ ConfirmRidePopUp.jsx # Ride confirmation popup
โ โ โ โโโ ConfirRide.jsx # Confirm ride details
โ โ โ โโโ LookingForDriver.jsx # Searching for driver
โ โ โ โโโ RidePopUp.jsx # Ride available notification
โ โ โ โโโ WaitingForDriver.jsx # Waiting for driver to arrive
โ โ โ โโโ FinishRide.jsx # Ride completion component
โ โ โ โโโ CaptainDetails.jsx # Captain info display
โ โ โ
โ โ โโโ assets/ # Images, icons, static files
โ โ
โ โโโ package.json # Frontend dependencies
โ โโโ vite.config.js # Vite configuration
โ โโโ eslint.config.js # ESLint rules
โ โโโ index.html # HTML entry point
โ โโโ public/ # Static assets
โ
โโโ package.json # Root package (axios)
- Node.js (v14 or higher)
- MongoDB (local or Atlas)
- Google Maps API Key
- npm or yarn
cd uber-appcd Backend
npm installcd ../Frontend
npm installCreate a .env file in the Backend/ directory (see Environment Variables section)
Create Backend/.env with the following variables:
# Server Port
PORT=4000
# MongoDB Connection String
DB_CONNECT=mongodb:
# OR use MongoDB Atlas:
# DB_CONNECT=mongodb+srv:o
# JWT Secret (used for token signing)
JWT_SECRET=
# Google Maps API Key
GOOGLE_MAPS_API=- JWT_SECRET: Should be a strong, random string in production
- DB_CONNECT: MongoDB connection URL
- GOOGLE_MAPS_API: Get from Google Cloud Console
- PORT: Default is 4000
# If running locally
mongod
# OR use MongoDB Atlas (no local server needed)cd Backend
npm install # if not done
node server.jsExpected output:
Server is running on port 4000
[Socket] โ
Socket.IO initialized
cd Frontend
npm install # if not done
npm run devExpected output:
VITE v7.0.3 ready in XXX ms
โ Local: http://localhost:5173/
- Frontend: http://localhost:5173/
- Backend API: http://localhost:4000/
User Signup Page โ Register (POST /users/register)
โ
Backend validates input & hashes password
โ
Store user in MongoDB
โ
Generate JWT token โ Return token to frontend
โ
Token stored in cookies/localStorage
โ
User authenticated โ
User Login โ Home Page
โ
Enter Pickup Location โ Enter Destination
โ
Select Vehicle Type (Car/Bike/Auto)
โ
System calculates FARE (GET /rides/fare)
โ
User confirms ride (POST /rides/create)
โ
Backend finds nearby captains (within 5km radius)
โ
Socket.IO sends "new-ride" event to available captains
โ
User sees "Looking for Driver" screen
โ
Waiting for captain acceptance...
Captain logs in โ Captain Home Page
โ
Receives "new-ride" notification via Socket.IO
โ
Views ride details (Pickup, Destination, Passenger name)
โ
Captain can accept or reject the ride
โ
If accepted: Send ride confirmation (POST /rides/confirm)
โ
Socket.IO notifies user: "ride-confirmed"
โ
Both user & captain see real-time location updates
Captain Starts Driving
โ
Socket.IO event "update-location-captain" fired
โ
Location (lat, lng) sent to backend
โ
Backend broadcasts location to user via Socket.IO
โ
User sees captain's real-time location on map
โ
Captain arrives โ Pickup passenger
โ
Ride starts โ Destination tracking begins
Captain reaches destination
โ
User confirms arrival
โ
Ride marked as "completed"
โ
Fare charged to user account
โ
Rating & feedback (optional)
โ
Ride history updated for both parties
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /users/register |
Register new user | โ |
| POST | /users/login |
Login user | โ |
| GET | /users/profile |
Get user profile | โ |
| POST | /users/logout |
Logout user | โ |
Register Request:
{
"fullName": {
"firstName": "John",
"lastName": "Doe"
},
"email": "john@example.com",
"password": "password123"
}Login Request:
{
"email": "john@example.com",
"password": "password123"
}| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /captains/register |
Register new captain | โ |
| POST | /captains/login |
Login captain | โ |
| GET | /captains/profile |
Get captain profile | โ |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /rides/create |
Create new ride request | โ |
| GET | /rides/fare |
Calculate fare | โ |
| POST | /rides/confirm |
Captain accepts ride | โ |
| POST | /rides/start |
Start ongoing ride | โ |
| POST | /rides/end |
Complete ride | โ |
Create Ride Request:
{
"userId": "user_id_here",
"pickup": "123 Main Street, City",
"destination": "456 Oak Avenue, City",
"vehicleType": "car" // or "bike", "auto"
}| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /map/get-coordinates |
Get coordinates for address | โ |
| GET | /map/distance-time |
Calculate distance & time | โ |
| GET | /map/get-suggestions |
Autocomplete suggestions | โ |
socket.emit('json', {
userId: 'user_id',
userType: 'user' // or 'captain'
});socket.emit('update-location-captain', {
userId: 'captain_id',
location: {
lat: 40.7128,
lng: -74.0060
}
});socket.emit('ride-accepted', {
rideId: 'ride_id',
captainId: 'captain_id'
});socket.emit('ride-started', {
rideId: 'ride_id'
});socket.emit('ride-ended', {
rideId: 'ride_id'
});socket.on('new-ride', (data) => {
// data contains ride details:
// {
// _id: ride_id,
// user: { name, email, ...},
// pickup: location,
// destination: location,
// vehicleType: 'car',
// fare: amount,
// distance: km,
// duration: minutes
// }
});socket.on('ride-confirmed', (data) => {
// data contains captain details and ride info
});socket.on('location-updated-user', (data) => {
// Captain's real-time location
// {
// lat: number,
// lng: number
// }
});socket.on('ride-started', (data) => {
// Ride is now in progress
});socket.on('ride-ended', (data) => {
// Ride completed
});socket.on('error abhi', (data) => {
// Error handling
});{
fullname: {
firstname: String, // min 3 chars, required
lastname: String // min 3 chars
},
email: String, // unique, required, min 5 chars
password: String, // hashed, required, not selected by default
socketID: String, // For real-time communication
createdAt: Date // Auto-generated
}User Methods:
generateAuthToken()- Creates JWT tokencomparePassword(password)- Verifies passwordhashPassword(password)- Static method to hash password
{
fullname: {
firstname: String,
lastname: String
},
email: String, // unique, required
password: String, // hashed
socketId: String, // Real-time tracking
vehicle: {
color: String,
plate: String,
capacity: Number,
vehicleType: String // 'car', 'bike', 'auto'
},
location: {
lat: Number,
lng: Number
},
status: String, // 'active', 'inactive'
createdAt: Date
}{
user: ObjectId, // Reference to User
captain: ObjectId, // Reference to Captain (after acceptance)
pickup: String, // Pickup address
destination: String, // Destination address
fare: Number, // Calculated fare
distance: Number, // In km
duration: Number, // In minutes
status: String, // 'pending', 'accepted', 'completed', 'cancelled'
vehicleType: String, // 'car', 'bike', 'auto'
Otp: String, // One-time password for verification
rating: Number, // 1-5 stars
createdAt: Date,
updatedAt: Date
}{
token: String, // JWT token to blacklist
createdAt: Date, // Auto-expires after 24h
expiresAt: Date
}| Page | Path | Description |
|---|---|---|
| Start | / |
Landing page with login/signup options |
| User Login | /login |
User authentication page |
| User Signup | /signup |
User registration page |
| User Home | /home |
Main page to search and book rides |
| Riding | /riding |
Active ride status (user perspective) |
| Captain Login | /captain-login |
Captain authentication |
| Captain Signup | /captain-Signup |
Captain registration |
| Captain Home | /captain-home |
Available rides for captain |
| Captain Riding | /captain-riding |
Active ride (captain perspective) |
| Logout | /users/logout |
Logout and redirect |
| Component | Purpose |
|---|---|
| LocationSearchPanel | Location input with Google Places suggestions |
| VehiclePanel | Vehicle type selection (Car/Bike/Auto) |
| ConfirmRidePopUp | Popup to confirm ride details |
| ConfirmRide | Final ride confirmation screen |
| LookingForDriver | Loading screen while searching for driver |
| RidePopUp | Notification when ride is available (captain) |
| WaitingForDriver | User waiting for captain to arrive |
| FinishRide | Ride completion and rating screen |
| CaptainDetails | Display captain info on ride |
Manages user authentication state:
{
user: { _id, email, fullname, ... },
isLoading: Boolean,
error: String,
loggedIn: Boolean
}Manages captain authentication state:
{
captain: { _id, email, fullname, vehicle, ... },
isLoading: Boolean,
error: String,
loggedIn: Boolean
}Manages Socket.IO connection:
{
socket: SocketInstance,
connected: Boolean,
events: { ... }
}- Separate login flows for Users and Captains
- JWT-based authentication
- Password hashing with bcrypt
- Automatic token refresh
- Find captains within 5km radius of pickup
- Instant notifications via Socket.IO
- Captain can accept or reject rides
- Google Maps integration
- Real-time location tracking
- Distance & fare calculation
- Address autocomplete suggestions
- Captain location broadcast to user
- User sees captain approaching in real-time
- Multi-device support via Socket.IO
- Create, confirm, start, and complete rides
- OTP verification for ride confirmation
- Ride history tracking
- Status updates in real-time
- Dynamic pricing based on distance
- Different rates for vehicle types
- Transparent fare display before booking
- User and Captain route protection
- Automatic redirect if not authenticated
- Session management with JWT
- Mobile-first UI with Tailwind CSS
- Smooth animations with GSAP
- Optimized for all screen sizes
The application allows requests from:
http://localhost:5173(Local frontend)https://lx36v5dk-5173.inc1.devtunnels.ms(Dev tunnel frontend)
To add more origins, update Backend/app.js:
const allowedOrigins = [
'http://localhost:5173',
'https://your-domain.com'
];Problem: "Cannot connect to MongoDB"
- Ensure MongoDB is running (
mongod) - Check
DB_CONNECTin.env - Verify MongoDB URI format
Problem: "Socket connection refused"
- Check if backend server is running on port 4000
- Verify
PORTin.env - Check CORS origins configuration
Problem: "Google Maps API error"
- Verify
GOOGLE_MAPS_APIkey in.env - Check API key has Maps & Geocoding enabled
- Ensure billing is enabled on Google Cloud
Problem: "Blank page on localhost:5173"
- Run
npm installin Frontend directory - Check browser console for errors
- Verify backend API is running
Problem: "Socket.IO connection failed"
- Check backend is running
- Verify socket URL in frontend code
- Check CORS origins
Problem: "Can't find coordinates"
- Verify Google Maps API key
- Check address format
- Ensure API has Geocoding enabled
1. User opens app (http://localhost:5173/)
โ
2. Clicks "Signup" โ Register as new user
โ
3. Email & password saved in MongoDB
โ
4. Redirected to login page
โ
5. Login with credentials โ JWT token generated
โ
6. Token stored in cookies/localStorage
โ
7. Redirected to /home (protected route)
โ
8. User enters "Pickup: 123 Main St, Destination: 456 Oak Ave"
โ
9. Frontend calls GET /rides/fare โ Fare calculated ($15)
โ
10. User selects vehicle type "Car"
โ
11. User clicks "Book Ride" โ POST /rides/create
โ
12. Backend finds 3 captains within 5km
โ
13. Socket.IO sends "new-ride" event to captains
โ
14. User sees "Looking for Driver" spinner
โ
15. Captain1 receives notification, views ride details
โ
16. Captain1 accepts ride โ POST /rides/confirm
โ
17. User receives "ride-confirmed" event
โ
18. Captain's location streamed to user in real-time
โ
19. Captain arrives at pickup โ Picks up user
โ
20. Ride starts โ Destination tracking active
โ
21. Captain reaches destination โ Ride completes
โ
22. User rates captain (5 stars) & leaves feedback
โ
23. Ride added to history for both user & captain
โ
Journey Complete!
# Ensure all env vars are set in deployment platform
# Ensure MongoDB Atlas connection is configured
# Push code to Git and deploy# Update API base URL to production backend
# Build: npm run build
# Deploy dist folderPORT=4000
DB_CONNECT=mongodb+srv://user:pass@cluster.mongodb.net/uber
JWT_SECRET=<strong-random-key>
GOOGLE_MAPS_API=<production-api-key>- Express.js Documentation
- React Documentation
- MongoDB Documentation
- Socket.IO Documentation
- Vite Documentation
- Tailwind CSS Documentation
- Google Maps API
ISC
Created as a learning project for full-stack web development
Feel free to fork and submit pull requests for improvements!
Last Updated: May 2026 Version: 1.0.0