Inspiration
Anyone who drives in a dense city knows the loop: circle the block, squint at the curb, give up, circle again. The strange part is that cities are already full of cameras pointed at their streets. They just aren't being used to answer one simple question: is that curb spot open right now?
We built Parkii to answer it. It turns cameras that already exist into live, camera-observed street-parking availability, and lets you ask for a spot by voice.
What it does
You say, "Find me parking near the Castro Theatre." Parkii's Claude agent checks which monitored curb spots are currently open, looks at the camera frame itself to double-check the curb, picks the nearest fresh open spot, and starts directions. A short in-app hold keeps Parkii from sending the next driver to the same space. (It can't reserve a public street space, and we say so in the app.) If you search somewhere we have no cameras, Parkii tells you it has no live data there instead of guessing.
How we built it
- Vision: a Python worker reads each camera feed (YouTube Live HLS, direct HLS, or JPEG snapshots) and runs YOLO11s to detect cars, trucks, buses, and motorcycles.
- Real-time state: detections stream into Convex, which computes occupancy for every calibrated stall and pushes changes to nearby clients live.
- Occupancy math: for each vehicle we take its ground footprint, the bottom 35% of its bounding box, and measure how much of it falls inside a stall polygon $S_i$:
$$ o_i = \frac{\lvert F \cap S_i \rvert}{\lvert F \rvert}, \qquad \text{occupied if } o_i \ge 0.4 $$
A stall's status is then a majority vote over its last three readings, so one noisy frame can't flip it.
- Voice agent: Claude runs a tool loop (
look_at_camera,list_open_spots,hold_spot,show_camera,start_navigation). Cartesia handles speech-to-text and streams the spoken reply as it is generated. - Chat agent: a Fetch.ai uAgent on ASI:One answers the same question in chat.
- App: React with MapLibre for the map and live camera view.
- Scaling to a second city: we registered all 853 online NYC DOT traffic cameras. Subagents reviewed every snapshot for visible curb parking, and the cameras that passed were enabled.
Challenges we ran into
- Passing traffic looks like parked cars. On an angled camera, a car driving in the next lane overlaps the curb stalls in the image. Scoring the whole bounding box gave passing traffic 0.24 to 0.38 and caused false "taken" readings. Switching to the footprint separated the cases cleanly: parked cars scored about 0.6 to 0.8 and moving traffic 0 to 0.1.
- "Publicly viewable" is not "permitted." We held off on NYC until we had approval from NYC DOT to use the footage for this hackathon.
- Calibration is the bottleneck. A camera gives no coverage until someone draws its legal stalls and pins them on the map. Of the 853 NYC cameras, 239 showed some curb in our review, 102 are enabled, and none has calibrated stalls yet.
- Night images are tiny. The NYC snapshots are about 352×240, and our review ran on night frames, so far curbs are a few pixels wide and the judgments need a daytime check.
- Detection can't tell legal from illegal. Hydrants, loading zones, and bus lanes look like open curb. We probed NYC's sign and street-centerline data as a legal layer, and found it has gaps on the exact block one camera watches.
What we learned
- The hard part of computer-vision products is often not the model but the geometry and the data around it: where the curb is, what is legal, how fresh the reading is.
- Being honest about uncertainty makes the product better. Parkii reports data freshness, says when it has no coverage, and never claims to reserve a spot.
- Permissions and data quality can take as much of the build as the code.
What's next
- Automatic stall proposals from street geometry and curb segmentation, with a human approving each one.
- A rules layer from city parking-regulation data to label spots metered, time-limited, or no-stopping.
- Turnover prediction: "this spot will likely open in about 5 minutes."
Built With
- anthropic-api
- asi-one
- cartesia
- claude
- convex
- datasf
- fetch.ai
- maplibre
- nominatim
- numpy
- nyc-open-data
- opencv
- openstreetmap
- python
- react
- react-map-gl
- shapely
- typescript
- uagents
- ultralytics
- vite
- yolo
- yt-dlp
Log in or sign up for Devpost to join the conversation.