A complete ride-hailing app (rider app, driver app, backend), with its own routing and matching engines running on real Mumbai roads from OpenStreetMap. Built in the open for anyone to learn from and contribute to.
![]() |
![]() |
![]() |
![]() |
| Bike / auto / cab fares along the road route | Driver on the way, with the ride PIN | Driver app: dotted path to the pickup | Trip done: pay cash, rate |
- Rider app: set pickup and drop on the map, compare bike, auto and cab fares, book, watch the driver arrive live, share a 4-digit PIN, pay cash, rate, see ride history.
- Driver app: register a vehicle, go online, get ride requests with a 20-second countdown, accept, navigate, start with the PIN, complete, see earnings.
- Matching: each request goes to up to 3 nearby drivers of the right vehicle; the nearest one who accepts gets the ride.
- Routing built for India:
- real roads, with main roads preferred over side streets;
- legal speed limits per vehicle;
- private roads, tolls and military zones;
- left-hand-traffic turns, waits at signals and toll booths, speed breakers.
- Tests you can see: one command runs every test, including a browser robot that plays a full ride in both apps and saves screenshots of every step.
New here? Read the application overview first.
You need Python 3.11+, Node 20+ and Git. Full details for every situation are in RUNNING.md.
Windows (PowerShell):
git clone https://github.com/aom12345/UberClone.git; cd UberClone
python -m pip install -r requirements-dev.txt # backend, routing, tests
cd mobile; npm install; cd .. # appsmacOS / Linux (Terminal):
git clone https://github.com/aom12345/UberClone.git && cd UberClone
python3 -m venv .venv && source .venv/bin/activate # once; run `source .venv/bin/activate` in every new window
python -m pip install -r requirements-dev.txt
(cd mobile && npm install)Then build the Mumbai road data once. It's a 221 MB download plus about 5 minutes, and without it routes are straight lines (RUNNING.md § A4). On macOS / Linux, write curl instead of curl.exe:
mkdir data
curl.exe -L -o data/western-zone-latest.osm.pbf https://download.geofabrik.de/asia/india/western-zone-latest.osm.pbf
python -m routing.osm_import data/western-zone-latest.osm.pbf --out data/roads.pkl --bbox 18.89,72.77,19.30,73.05Then, on any system:
python demo.py # window 1: backend + automatic cab, auto and bike drivers near Dadar
cd mobile && npm run start:rider # window 2: scan the QR code with Expo Go, book a ride, watch it happen
python test_all.py # run every test; opens a report with screenshots| I want to… | Read |
|---|---|
| Understand how the app works | docs/OVERVIEW.md |
| Run it (phone, two phones, browser, tests, another city) | RUNNING.md |
| Contribute | CONTRIBUTING.md and the open issues below |
| See every document | docs/README.md |
UberClone/
├── mobile/ Rider and driver apps (Expo / React Native, TypeScript)
├── backend/ API, live events, dispatch loop, simulator (Python, FastAPI)
├── matching/ Matching engine: which drivers get pinged, who wins
├── routing/ Routing engine: road graph, costs, vehicles, turns, restrictions, learning, OSM import
├── tests/ Tests for routing and matching
├── e2e/ Browser robot that plays a full ride in both apps
├── deploy/ GraphHopper configuration (production routing engine)
├── docs/ Design docs, overview, issues
├── demo.py Phone demo: backend + automatic drivers
├── test_all.py Run every check
└── RUNNING.md How to run in every situation
Pick one and contribute. Each issue explains why it matters, what to do, which files to look at, and how to know you're done. The workflow is in CONTRIBUTING.md. Every issue is also on GitHub Issues with the same number (003 here is #3 there): comment on it to claim it.
| # | Issue | Area | Skills |
|---|---|---|---|
| 003 | Rate-limit OTP requests | backend, security | Python |
| 004 | Show how far the pickup is on the driver's ride request | backend + driver app | Python, TypeScript |
| 005 | Pickup note for the driver ("Gate 2, near the ATM") | backend + both apps | Python, TypeScript |
| 006 | Show how the fare is calculated | backend + rider app | Python, TypeScript |
| 007 | Dark mode | apps | React Native, design |
| 008 | Accessibility: screen-reader labels, touch targets | apps | React Native |
| 009 | Weekly earnings for drivers | backend + driver app | Python, TypeScript |
| 010 | Run tests on every pull request (GitHub Actions) | DevOps | YAML |
| 011 | More end-to-end scenarios: cancellations, no drivers | testing | Python, Playwright |
| # | Issue | Area | Skills |
|---|---|---|---|
| 012 | Search for pickup and drop places (today you can only drag a pin) | backend + rider app | Python, TypeScript, APIs |
| 013 | Street addresses instead of coordinates | backend + apps | Python, TypeScript |
| 014 | Saved places (Home, Work) | backend + rider app | Python, TypeScript |
| 015 | "Arriving in 4 min" for the rider | backend + rider app | Python, TypeScript |
| 016 | Final fare from the actual trip (distance + waiting) | backend | Python, geometry |
| 017 | Cancellation fee rules | backend + apps | Python |
| 018 | Hindi and Marathi translations | apps | React Native, Hindi / Marathi |
| 019 | Share my trip, and an SOS button | backend + rider app | Python, TypeScript |
| 020 | Database migrations (Alembic) and PostgreSQL | backend | SQLAlchemy, SQL |
| 021 | One-command setup with Docker Compose | DevOps | Docker |
| 022 | Admin web dashboard | new web app | React, maps |
| 001 | ETA before we have our own data | routing | Python |
| # | Issue | Area | Skills |
|---|---|---|---|
| 023 | Feed real driver GPS into road learning (high impact) | backend + routing | map matching, Python |
| 024 | Road-based pickup times in matching, fast | routing + matching | algorithms |
| 025 | Push notifications and background GPS for drivers | apps + backend | Expo dev builds |
| 026 | Surge pricing | backend + rider app | Python, data |
| 027 | Run several backend instances (Redis) | backend | asyncio, Redis |
| 028 | Learn signal waits and turn costs from real trips | routing | statistics |
| 002 | GraphHopper plugin for vehicles, delays, speed breakers | routing | Java, GraphHopper |
Issues that build on each other:
- 013 reuses the place-lookup provider from 012, and 014 can share its "recent places" list with 012.
- 016, 023 and 028 use driver GPS breadcrumbs; 028 needs 023.
- 005, 016 and 017 add database columns, which will need migrations once 020 lands.
- 027 works best after 020.
Ideas without an issue yet: in-app chat or masked calling, scheduled rides, promo codes, driver document verification, more than one city, ride receipts, online payments (UPI / cards in test mode). Open a discussion first.
This is a working development version, not a production service:
- Login and payment: the login code is always
123456(no SMS), and payment is cash only. - One city: only Mumbai's roads are loaded.
- Driver GPS: works only while the driver app is open.
docs/OVERVIEW.md lists what's real and what's simplified.
MIT: you can use, change and share this code freely, as long as the copyright notice stays. By contributing, you agree your changes are released under the same license.



