Inspiration
Parking in dense cities is miserable, and it's getting worse. San Francisco drivers already spend about 83 hours a year looking for parking. In the Bay Area, BART has said it could cut train service hours by up to 70% if voters reject the regional transit sales tax on the November 3 ballot. Every rider transit loses becomes another driver looking for a spot, and they share the curb with a growing fleet of autonomous vehicles like Waymo and Zoox.
More cars are competing for the same number of spots, and two very different kinds of drivers are competing for them: humans who circle blocks, and robotaxis that need somewhere to wait between rides. With nowhere to go, robotaxis already idle on residential streets. We've all lost 20 minutes looping a block for a spot that opened a minute after we passed. The curb is the most fought-over space in the city, and nobody can see it. Curb makes it visible to both kinds of driver.
What it does
Curb is a live map of the curb that people and autonomous vehicles share.
- For drivers: Point your phone at a row of parked cars. Curb runs computer vision on the phone itself, finds open gaps between parked cars, reads the parking signs, and confirms spots that hold steady. A confirmed spot appears on your phone instantly and on everyone else's map in real time.
- Honest about uncertainty: An open spot doesn't stay open forever, so every spot shows a live "% likely open" that fades over five minutes. While you're heading to a spot, Curb keeps checking. If the spot is taken or its confidence drops below 50%, it suggests another one nearby.
- Signs that stick: Once Curb reads a parking sign, its rules apply to spots found later on the same side of the street, even if the sign isn't in view. Openings with no known sign are still shown, but Curb doesn't claim any rules for them.
- For everyone else: Every phone running Curb is also a sensor. One person's scan helps the next person find a spot.
- Guaranteed spots: Public curb is free and first-come, first-served, so Curb surfaces information about it rather than selling it. Homeowners can list private driveways that drivers can reserve and pay for, for a spot that's actually held.
- For autonomous vehicles: A robotaxi can use the same map to find a legal place to wait between rides. In our demo, an autonomous vehicle drives a live route on the map, holds a homeowner's driveway, and pays for it in USDC over x402, a protocol built for machine-to-machine payments. The driveway flips to "Booked" on every phone in real time.
How we built it
- On-device detection: VisionCamera streams iPhone camera frames into our own native Swift module (built with Nitro Modules). It runs two Core ML models through Apple's Vision framework on the CPU and Neural Engine: YOLOv8s for cars, trucks, buses, and motorcycles, and YOLO-World prompted for parking signs, no-parking signs, and parking meters. Full camera frames never leave the phone.
- Lightweight uploads: The phone sends only JSON to our FastAPI server: vehicle boxes, small JPEG crops of signs, GPS, and heading. The camera drops frames while the models are busy, and only one upload is in flight at a time, so the live view never falls behind.
- Gap detection: The server sorts vehicles left to right and finds openings between them that span a meaningful share of the frame. The edge of the frame only counts as a boundary next to a real car, so an empty frame never produces a fake spot.
- Temporal confirmation: A greedy IoU tracker gives each vehicle a persistent ID across frames. A gap only becomes a spot when the same two vehicles keep it open for 2 seconds. A background loop runs every second to expire stale gaps and spots and to refresh time-based parking rules.
- Confidence scoring: Each confirmed spot gets a base confidence: 80% from the detection confidence of its weakest bordering vehicle, 20% from how many times the gap was observed. The phone decays that score linearly to zero over five minutes and hides the spot after that.
- Live rerouting: While you're routing to a spot, its confidence keeps updating. If the spot disappears or drops below 50%, Curb offers a replacement nearby.
- Sign reading: Sign detections are tracked across frames, and each sign's location is triangulated from GPS, compass heading, and where it appears in the frame. The best crop goes to Claude Vision, which returns structured rules (summary, price, time limit, hours, restrictions) with a confidence score.
- Sign memory: Each sign pole is stored once. When a new spot is confirmed, Curb prefers a sign read in the current scan; otherwise it uses the nearest stored sign within 50 meters on the same side of the street, and never one from the opposite side.
- Scanner view: The camera view shows the vehicle boxes, candidate and confirmed gaps (with seconds observed and which vehicles bound them), and the sign reading as it comes in. When a gap is confirmed between two visible cars, a native SceneKit module renders a 3D car (a Tesla Model 3 model, CC BY 4.0) into the opening as a preview, labeled clearly as an illustration rather than a measured fit.
- Instant feedback: The scanning phone gets its confirmed spot straight back in the API response, without waiting for the broadcast.
- Storage and real-time events: Spots and signs are stored as GeoJSON in Azure Cosmos DB for geospatial "what's near me" queries. Azure Web PubSub pushes events to every phone the moment a spot opens, refreshes, is taken, or expires, and also streams the autonomous vehicle's live position and driveway bookings.
- Map: Mapbox, with every spot showing its "% likely open," reservable driveways in purple, booked driveways showing their price, the AV's live route, and Mapbox Directions to route you there.
- Payments: Driveway reservations, whether made by a person or an autonomous vehicle, go hold → pay → finalize over x402, using Coinbase CDP wallets and settling in USDC on Base Sepolia. Settlement evidence is saved before finalizing, so a failure retries only the finalize step and never charges twice.
- Demo scenario: For a reproducible presentation, we seed a scenario around the Palace of Fine Arts that uses real street geometry from OpenStreetMap with simulated observations and sign rules. It's kept in a separate namespace from real CV records.
- Infrastructure: Azure Container Apps provisioned with Bicep, a shared TypeScript contracts package keeping the mobile app, server, and payments service in sync, and Jest and pytest test suites.
Challenges we ran into
- We chased the wrong bottleneck across four platforms. Our first architecture streamed full camera frames to a server for inference. When it lagged, we assumed we needed more compute: we started on an Azure VM, moved to AWS EC2, then a T4 GPU on Google Colab, and finally rented an RTX 4090 on RunPod, raising the FPS and lowering image quality along the way. Each step gave us more GPU, but the app never felt faster, because the bottleneck was the network round trip, not the GPU. Every frame still had to upload, wait in a queue, run inference, and come back. So we moved all inference onto the iPhone with Core ML, and now only small JSON detections cross the network.
- Getting our models onto the phone. Our exporter didn't include Apple's built-in duplicate-box filtering (NMS) for segmentation models. We stripped the mask head, exported the detection branch through the standard detection exporter, and verified its box and class outputs were bit-identical to the original.
- A gap is not the same as a parking spot. Driveways, hydrants, crosswalks, and the space between two moving cars all look like gaps to a detector. We combined size (is the opening big enough?), sign reading (is it legal?), and persistence (does it hold for 2 seconds between the same two cars?) before calling anything a spot.
- Being honest about uncertainty. A spot seen three minutes ago isn't a promise. Rather than showing spots as simply open or closed, we score each one from the evidence behind it, fade it over time, and react while you're driving to it. The same principle applies to the ghost car preview, which we label as an illustration rather than a measured fit.
- Signs aren't always in view. The sign that governs a spot is often half a block away from the gap. We store each sign once and match it to later spots on the same side of the street, because applying no rule is safer than applying the wrong side's rule.
- Measuring in meters. We started with monocular depth (Depth Anything V2) to estimate gap widths in meters, but it was noisy and too heavy to run on every frame. The live system judges gaps by their size in the frame and how steadily they hold, and is tuned to prefer missing a spot over sending someone to one they can't fit in.
- Our system has no sense of place. The tracker matches boxes between frames in pixel space, so once a car leaves the screen, it's forgotten. Scanning works best standing still with both cars in view. While walking, the system can't build a picture of the whole street yet.
- Staying honest when the network fails. Upload failures could look like a working scan. We made delivery status visible in the camera view and made retries recover automatically.
- Figuring out what AVs actually need. We first imagined vehicles negotiating over spots, then realized a public spot can't be held: anyone can drive up and take it. So Curb gives information about public curb for free, and money only changes hands for spots that can actually be reserved.
Accomplishments that we're proud of
- Real-time computer vision running on the iPhone through a custom native module, with full frames never leaving the device.
- A working end-to-end loop: camera → on-device detection → server confirmation → the spot appears on your phone instantly and on everyone else's map through Web PubSub.
- Every spot carries a live probability that it's still open, and routing reacts when that probability drops.
- Parking signs are read into structured rules, and those rules keep applying to later spots on the same side of the street.
- An autonomous vehicle that drives a live route on the map, books a driveway, and pays for it with a real on-chain USDC transaction, with the booking appearing on every phone.
- We designed for humans and autonomous vehicles from the start instead of adding AV support afterward.
What we learned
- Measure where the latency is before you optimize. We went from an Azure VM to an RTX 4090 before realizing the real cost was the network, not the GPU. Profiling the full round trip on day one would have saved us hours.
- For real-time CV, inference belongs on the edge. When results go stale in a second, the model has to run next to the camera.
- Show the uncertainty. A percentage that fades over time is more useful, and more trustworthy, than a spot that claims to be open.
- Context matters as much as detection. Seeing cars in one frame is easy. Remembering where they are as the camera moves is what turns "I see cars" into a map of the street.
- One frame isn't enough to trust. Tracking detections over time did more for reliability than any single model change.
- Payments should match what can be guaranteed. Information about public curb should be open. Money belongs on spots that can actually be held.
What's next for Curb
- Pay-per-query data access: Let any robotaxi or AI agent query the live map and pay a fraction of a cent per request over x402, with no account needed, so the data pays for its own compute.
- Measuring in meters: Bring back depth, or use LiDAR where available, so every gap gets a real width, the ghost car becomes a true fit check, and spots are matched to the size of your car.
- Mapping a whole street as you move: Remember where each car is as the phone moves, so walking or driving past a block builds a map of all of it.
- Smarter sign parsing: Read the arrows on signs to work out exactly which stretch of curb each rule covers, and check rules against permits and street-cleaning schedules.
- AV sensor contributions: Let autonomous vehicles feed their own curb sightings into Curb in exchange for query credits, so every fleet becomes both a data source and a customer.
- Android support: On-device inference is iOS-only today.
- More guaranteed inventory: Bring private lots, garages, and loading zones onto Curb, while public curb stays free and first-come, first-served.
- Prediction and city partnerships: Forecast where spots are likely to open, and share anonymized curb-usage data to help cities plan loading zones and pickup/dropoff areas.
Built With
- azure
- azure-container-apps
- azure-container-registry
- azure-cosmos-db
- azure-managed-identity
- azure-signalr-service
- azure-virtual-machines
- azure-web-pubsub
- base
- bicep
- claude
- coinbase-cdp
- core-ml
- docker
- expo.io
- fastapi
- mapbox
- python
- react-native
- swift
- typescript
- visioncamera
- x402
- yolo-world
- yolov8

Log in or sign up for Devpost to join the conversation.