Last Mile Connect
Safety-first last-mile walking companion for the Florida State Univeristy area. Get off the bus, set your destination, find someone going the same way, and walk together with turn-by-turn directions from the stop.
Inspiration
The last mile—the walk from the bus stop to your dorm, class, or office—is where many people feel least safe or unsure of the route, especially after dark.
We wanted to make that segment safer and clearer:
- Match people heading the same way
- Create time-bound walking sessions (not permanent connections)
- Show turn-by-turn walking directions from the bus stop
So no one has to guess the route or walk alone if they don’t want to.
What It Does
Set Origin & Destination
- Use “Use my location” or pick an FSU bus stop
- Click the map to set your destination
- Reverse-geocodes to a readable address
- If origin is a bus stop → shows walking directions (distance, time, step-by-step route)
Create Intent
- One active intent per user
- Origin & destination stored as geographic points
- Automatically expires in ~60 minutes
Find Matches
- Backend finds other intents within ~2 km
- Optionally prioritizes same bus stop
- Ranked by buddy score:
- Route overlap
- Past ratings
- Route overlap
- Vehicle users match only with walkers
- Walkers see both
Create Session
- Pick a match
- Create a session linking both intents
Status visibility:
- You requested → You initiated
- Incoming request → Other user initiated
- Accept → Either user can Activate
Walk Together
When the session is ACTIVE:
- Both users’ locations sent via WebSocket
- Stored in Redis
- Map shows live:
YoumarkerPeermarker
- Optional SOS
- Auto-complete when time limit is reached
How We Built It
Backend
- FastAPI
- PostgreSQL + PostGIS
ST_DWithinfor 2 km proximity- Same-stop detection
- Redis (live locations with TTL)
- JWT authentication
- WebSockets:
- Session updates channel
- Per-session live location stream
- Session updates channel
Frontend
- Leaflet
- OpenStreetMap tiles
- Stops from GTFS-style data:
stops.txt → fsu_stops.jsonGET /api/stops
- Nominatim → Reverse geocoding
- OSRM → Walking routes from bus stop to destination
Matching Logic
- Route-overlap score
- Optional same-stop merge
- Buddy score = weighted combination:
- Route overlap
- Past ratings
- Route overlap
Session State Machine:
- REQUESTED
- ACCEPTED
- ACTIVE
- COMPLETED / ABORTED
Challenges We Ran Into
Clarity for the Other User
Initially the recipient only saw:
Session #X
We improved clarity by adding:
- You requested
- Incoming request
So it’s obvious who initiated and who should accept.
Single Source of Truth for Stops
Problem:
- Hardcoded demo stops
- Backend stops
Solution:
- Backend (
fsu_stops.jsonfrom GTFS) as the primary source - Hardcoded list used only as fallback when the API fails
Keeping Both Sides in Sync
Accept, Activate, and live markers had to stay consistent across two browsers.
Solution:
- WebSocket pushes for session/intent updates
- Dedicated WebSocket + Redis + polling flow for live locations
What We Learned
- Use PostGIS for proximity and same-stop matching instead of doing distance math in app code
- Design a small session state machine for multi-user flows
- Use Redis with TTL for ephemeral live location data
- Use PostgreSQL for persistent sessions and intents
- Integrate OSRM (walking routes) + Nominatim (reverse geocoding) to keep the UI human-readable and actionable
Built With
- fastapi
- leaflet.js
- mapquest-nominatim-search
- osm
- osrm
- postgis
- postgresql
- redis
- websockets
Log in or sign up for Devpost to join the conversation.