Inspiration

Finding parking in San Francisco and Berkeley is a nightmare. We've all driven in circles for 20 minutes, missed appointments, and gotten street cleaning tickets. Google Maps shows you 5 parking lots — not the 200+ street spots that actually exist. We wanted to build something that actually works: real data, real-time, and hands-free while you're driving.

What it does

ParkSmart is like Waze, but for parking. It shows you real available parking spots on a live map, lets you navigate to them with turn-by-turn directions, and lets you control everything with your voice while driving. Key features:

  • Voice AI : say "find me free parking near the City College of San Francisco" and Claude AI searches 200+ spots, picks the best one, and starts navigation — all hands-free.
  • Real parking sign data : we integrated official SFMTA data (7,760 blockfaces) so every spot shows the exact posted sign: time limits, street cleaning schedules, permit zones.
  • 3 smart modes : Driving (find a spot), Parked (manage your time, get warned before street cleaning), Walking (switch to foot navigation) .

How we built it

  • Frontend: React + TypeScript + Vite + Tailwind CSS + Mapbox GL JS
  • Backend: FastAPI + Python
  • AI: Claude Sonnet 4.6 with real tool use — Claude actually calls our parking search API, routing API, and availability API rather than just generating text
  • Data sources: OpenStreetMap (street parking), Google Places (parking lots), SFMTA Open Data (official SF parking regulations + street sweeping schedules)
  • Database : SQLite with 7,760 parking regulations and 37,856 street sweeping records downloaded from SF Open Data

Challenges we ran into

  • Data accuracy: OpenStreetMap has street parking data but it's inconsistent. We built a geometry-based estimation algorithm to calculate available spots from road length, then layered official SFMTA sign data on top for SF streets.
  • Voice AI latency: A full voice round-trip (speech → Claude → 2 API calls (Mapbox and Claude) → response) takes 11-12 seconds in the real world, not the 2-3 seconds we expected. We redesigned the UI to show clear "thinking" states so users know the AI is working.
  • GPS on mobile: Safari on iPhone blocks GPS on HTTP connections. We built a smart fallback system that detects your city (Berkeley vs SF) and falls back gracefully when GPS is unavailable.
  • Marker clutter: Our first version showed 388 parking markers in Berkeley — it looked like a bug. We built density controls and distance-based filtering to keep the map clean and readable.

Accomplishments that we're proud of

  • Claude AI doesn't just talk about parking — it actually controls the app. Say "navigate to the closest free spot" and NavigationPanel launches automatically with a real route.
  • We're showing more parking options than Google Maps in SF — 200+ spots vs their typical 5-10 lots.
  • Real SFMTA government data means we can tell you exactly when street cleaning happens on your specific block, not just "check the signs."
  • Built a fully functional PWA that judges can install on their phone in 30 seconds.

What we learned

  • Real-world AI latency is 5-10x slower than sandbox testing. Always build for the real number.
  • Government open data is incredibly powerful when you know where to find it. SF's SFMTA dataset has every parking sign in the city — we just had to download and query it.
  • Voice UX is completely different from text UX. Users need visual feedback at every step because they can't see what's happening.

What's next for parkSmart

  • AI Parking Agent: proactive spot recommendations that update every 30 seconds, spoken aloud while you drive
  • SpotAngels integration: crowdsourced parking data from millions of real users across the US
  • React Native mobile app: reuse 80% of the web logic for a real App Store app
  • Berkeley parking data: partner with the City of Berkeley for official sign data like we have for SF
  • Predictive availability: use historical crowdsource data to predict which spots will be open before you arrive

Built With

Share this project:

Updates