Crowd-aware campus navigation for Cal Poly Pomona
Know your campus. Beat the crowd. Find your space.
CPP's existing campus map tells you where buildings are. BroncoPath tells you how busy they are right now and the best route to them.
BroncoPath is a mobile application that scrapes Cal Poly Pomona's publicly available class schedule data to predict building and classroom occupancy in real time — no sensors, no hardware, no institutional IT contracts required. Students can find a quiet study room, avoid crowded areas between classes, and navigate campus smarter.
This project was created following Agile Methodologies (Scrum) with an AI-augmented workflow under CS4800 Software Engineering at Cal Poly Pomona (Spring 2026). View project deliverables in docs/deliverables/.
| Feature | Description |
|---|---|
| 📊 Live Dashboard | Building-by-building occupancy overview at the current time |
| 🗺️ Campus Map | Interactive map with color-coded crowd density markers |
| 🚪 Room Finder | Browse available classrooms and study rooms by building |
| 🧭 Route Planner | Crowd-avoiding route suggestions between campus buildings |
Mobile
- React Native + Expo SDK with Expo Router v4
- NativeWind v4 — Tailwind CSS for React Native
- react-native-maps — Apple Maps (no API key required)
- Custom hooks + module-level singleton cache — data fetching, prefetch on launch, 60s polling
Backend
- Node.js + Express — REST API
- Neon — serverless PostgreSQL
- Drizzle ORM — type-safe database queries
Data Pipeline
- Python + Playwright + BeautifulSoup — schedule scraper
- Data source: schedule.cpp.edu (public, updated nightly)
- Node.js 18+
- npm
- Xcode 15+ with the iOS Simulator
git clone https://github.com/lebuckman/broncopath.git
cd broncopath
npm installThe app fetches live data from the Express backend — it must be running before you launch the app.
cd backend
npm install # first time only
npm run devThe server starts on http://localhost:3000. Copy .env.example to .env.local in the project root if you haven't already — EXPO_PUBLIC_API_BASE_URL defaults to http://localhost:3000.
Note
The backend connects to a Neon (serverless PostgreSQL) database. Ensure DATABASE_URL is set in backend/.env before running.
BroncoPath uses Expo SDK 55, which requires a full native build — the prebuilt Expo Go app only supports up to SDK 54. Use expo run:ios instead of expo start.
npx expo run:iosNote
Xcode compiles the native binary and installs it on the Simulator (first build takes a few minutes). Once it finishes, the Metro bundler starts and the app loads. If the Simulator doesn't jump straight to the app, find BroncoPath on its home screen and open it — Metro will connect automatically.
From that point on, JavaScript changes hot-reload without a rebuild. You only need to re-run expo run:ios when you install a new native package.
Metro cache stale? Run npx expo start --clear to flush it.
broncopath/
├── app/ # Expo Router screens
│ ├── _layout.tsx # Root layout + branded loading screen
│ └── (tabs)/
│ ├── _layout.tsx # Tab navigator
│ ├── index.tsx # Home / Dashboard
│ ├── map.tsx # Campus Map
│ ├── rooms.tsx # Find a Room
│ └── route.tsx # Route Planner (in development)
│
├── components/
│ ├── LoadingScreen.tsx # Branded launch screen with data prefetch
│ ├── ui/ # Primitive components (badges, buttons, filters)
│ ├── building/ # Building cards, accordions, detail sheet
│ ├── map/ # Map markers, legend
│ └── route/ # Route cards (in development)
│
├── constants/ # Colors, fonts, types, campus config
├── hooks/ # useBuildings, useRooms, useFavorites, useRoutes
├── lib/ # API client, data cache, room filter logic
├── docs/
│ ├── deliverables/ # Agile/Scrum deliverables
│ └── contexts/ # AI context references
│ ├── DESIGN.md # Visual design system
│ └── REQUIREMENTS.md # Engineering requirements & API contracts
│
└── backend/ # Express API + Drizzle schema
├── src/
│ ├── buildings.ts # Buildings + rooms endpoints
│ ├── serviceFunctions.ts # Room status derived from schedule data
│ ├── db/ # Drizzle schema + seed
│ └── index.ts # Express entry point
└── scraper/ # Python CPP schedule scraper