Inspiration
Many students and friends we know have injured and crashed when scootering around campus due to poor road conditions, like unexpected bumps or deep potholes. Standard navigation apps are built for cars and completely ignore these hazards for scooters or bikes. We wanted to create an app that navigates people away from these dangerous routes to ensure a safer ride across our campus and city.
What it does
Bypass is a dual-system, Waze-style navigation app specifically designed for scooters and bikes.
- Manual Reporting: Riders can manually drop a pin to report hazards like potholes, obstructions, or closures on a path they're going.
- Automatic Detection: An opt-in background system actively reads the rider's device motion and GPS data. It automatically detects hard braking and severe bumps, clusters these events, and publishes them as verified hazards across the entire platform with other users.
- Safe Routing: Using all gathered hazard data, the app calculates "lower-risk" routes that dynamically navigate riders to BYPASS the dangerous terrain.
How we built it
We architected Bypass with a clear separation between the manual user product and the automatic sensor platform:
- Frontend (Mobile): Built with React Native, TypeScript, and Expo SDK 57. We used MapLibre GL JS within a WebView to render OpenFreeMap OSM tiles (with both Positron and Dark themes).
- Backend API: Developed a shared platform using Python and FastAPI to handle hazard feeds and routing.
- Database: Utilized PostgreSQL paired with the PostGIS geographic extension to store and query spatial data.
- Routing Engine: Integrated Valhalla with pedestrian costing, specifically tuned for scooter pacing (16 km/h) and heavy step penalties to avoid stairs.
- Sensor Algorithms: Wrote a pure TypeScript signal detector that processes 50 Hz motion data and 1 Hz GPS data to flag anomalies.
- Infrastructure: Containerized the stack with Docker Compose and wrote deployment scripts for Vultr.
Challenges we ran into
- Cross-platform communication: Getting Android and iOS users to see the same hazards in real time was harder than expected. Each platform handles sensors, permissions, and background activity differently, so we had to make sure reports and detections from both reached our shared backend consistently and showed up correctly for everyone.
- Balancing safety with practical routing: Adapting Valhalla to avoid hazards meant deciding how much each one should matter. If we weighted hazards too heavily, a single small pothole could send riders on a detour several minutes long. We had to tune how hazards affect route cost so the app avoids truly dangerous terrain without overreacting to minor bumps.
- Designing an intuitive experience on both platforms: We spent a lot of time on a user interface that feels natural on Android and iOS alike. Riders need to report hazards and follow routes quickly, often while on the move, so every interaction had to be simple, clear, and consistent across devices.
Built With
- docker
- docker-compose
- expo.io
- fastapi
- geojson
- maplibre
- node.js
- openfreemap
- postgis
- postgresql
- psycopg
- python
- react-native
- typescript
- uv
- uvicorn
- valhalla
- vultr
- websockets
Log in or sign up for Devpost to join the conversation.