CrowdCourier is a college-friendly peer-to-peer parcel delivery mobile app.
- Mobile app: Expo + React Native (no web dependency for core flow)
- Backend API: FastAPI
- Database: MongoDB
- Auth: Register/Login with mobile + password
- No payments, no GPS tracking, no paid deployment required
frontend/app/index.tsx: Welcome screen and auth/role route guardfrontend/app/login.tsx: Login with mobile + passwordfrontend/app/register.tsx: Registration with name + email + mobile + passwordfrontend/app/role-select.tsx: Initial Sender/Courier choicefrontend/app/(tabs)/home.tsx: Sender trip search and Courier trip listfrontend/app/(tabs)/requests.tsx: Sender sent requests and Courier incoming requestsfrontend/app/(tabs)/profile.tsx: Stats, role switch, logoutfrontend/app/add-trip.tsx: Courier trip creation formfrontend/app/send-request/[id].tsx: Sender request form for selected tripfrontend/contexts/AuthContext.tsx: Token + user statefrontend/contexts/RoleContext.tsx: Sender/Courier mode statefrontend/utils/api.ts: API client methodsfrontend/utils/theme.ts: Shared colors and spacingbackend/server.py: FastAPI routes and Mongo integrationbackend/requirements.txt: Python dependencies
- Go to
backend. - Ensure
.envcontains:MONGO_URL=mongodb://localhost:27017DB_NAME=crowdcourierJWT_SECRET=any-strong-secret
- Install deps:
pip install -r requirements.txt - Run server:
uvicorn server:app --reload --port 8000
- Go to
frontend. - Ensure
.envcontains:EXPO_PUBLIC_BACKEND_URL=http://<your-local-ip>:8000(for real device)EXPO_PUBLIC_BACKEND_URL=http://localhost:8000(for emulator/web preview)
- Install deps:
yarn install - Run app:
yarn start - Open on Android/iOS with Expo Go.
- Mobile number: exactly 10 digits
- Email: valid email format required
- Password: minimum 6 characters and must include letters + numbers
Run from project root (c:\crowd_currier):
- Wipe only
users:
@'
import os
from pathlib import Path
from dotenv import load_dotenv
from pymongo import MongoClient
load_dotenv(Path("backend/.env"))
client = MongoClient(os.getenv("MONGO_URL", "mongodb://localhost:27017"))
db = client[os.getenv("DB_NAME", "crowdcourier")]
print("Deleted users:", db.users.delete_many({}).deleted_count)
'@ | python -- Wipe only
trips:
@'
import os
from pathlib import Path
from dotenv import load_dotenv
from pymongo import MongoClient
load_dotenv(Path("backend/.env"))
client = MongoClient(os.getenv("MONGO_URL", "mongodb://localhost:27017"))
db = client[os.getenv("DB_NAME", "crowdcourier")]
print("Deleted trips:", db.trips.delete_many({}).deleted_count)
'@ | python -- Wipe only
delivery_requests:
@'
import os
from pathlib import Path
from dotenv import load_dotenv
from pymongo import MongoClient
load_dotenv(Path("backend/.env"))
client = MongoClient(os.getenv("MONGO_URL", "mongodb://localhost:27017"))
db = client[os.getenv("DB_NAME", "crowdcourier")]
print("Deleted delivery_requests:", db.delivery_requests.delete_many({}).deleted_count)
'@ | python -- Wipe all (
users+trips+delivery_requests) together:
@'
import os
from pathlib import Path
from dotenv import load_dotenv
from pymongo import MongoClient
load_dotenv(Path("backend/.env"))
client = MongoClient(os.getenv("MONGO_URL", "mongodb://localhost:27017"))
db = client[os.getenv("DB_NAME", "crowdcourier")]
print("Deleted users:", db.users.delete_many({}).deleted_count)
print("Deleted trips:", db.trips.delete_many({}).deleted_count)
print("Deleted delivery_requests:", db.delivery_requests.delete_many({}).deleted_count)
'@ | python -