π Winner: Community Problem Track Award @ ITfest 2026! π
Find a parking spot before you even get there.
Parkie uses computer vision to detect cars in parking lots from live camera feeds and shows real-time availability on a mobile map β so drivers can find open spots instantly, without circling the block.
π· Camera β π€ AI Vision (YOLOv11) β β‘ Backend API β π± Mobile App
β π₯οΈ Dashboard
- Lot owners register their parking lots on the web dashboard and define parking slot polygons by clicking on a camera frame
- AI Vision Agent runs YOLO inference on the camera feed, detects which slots are occupied, and reports to the backend
- Drivers open the mobile app, see a live map with color-coded pins (π’ green / π‘ yellow / π΄ red), and navigate to the best spot
- Updates flow in real-time via Supabase Realtime β no refreshing needed
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PARKIE SYSTEM β
ββββββββββββββββ¬βββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ€
β π· Camera β π€ AI Vision β β‘ Backend API (FastAPI) β
β Feed/RTSP β YOLOv11 + CV2 β REST Β· Supabase Β· bcrypt β
β β β β
β β Inference: 5s β 13 endpoints β
β β Reporting: 15s β Verification workflow β
β β Smoothing: 5x β Frame capture (OpenCV) β
ββββββββββββββββ΄βββββββββββββββββββ΄βββββββββββββββββββββββββββββββββ€
β ποΈ Supabase (PostgreSQL) β
β Tables: users Β· parking_lots β
β Realtime: WebSocket push on UPDATE β
ββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ€
β π± Mobile App β π₯οΈ Web Dashboard β
β Expo Β· React Native Β· Maps β Vite Β· TypeScript Β· Canvas β
β Live pins Β· Navigation β Lot CRUD Β· Slot polygon editor β
β Nearby search (Nominatim) β Camera frame capture β
ββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββ
unihackers/
βββ backend_api/ # FastAPI REST API
β βββ main.py # App + all endpoints
β βββ admin_verify.py # CLI tool for lot verification
β βββ docs.md # API documentation
β βββ requirements.txt
β
βββ ai_vision/ # Computer vision pipeline
β βββ vision_agent.py # Production agent (headless)
β βββ smart_parking.py # Local viewer with GUI
β βββ select_slots.py # Interactive slot polygon selector
β βββ train_pklot.py # PKLot dataset training script
β βββ requirements.txt
β
βββ Frontend/
βββ Parkie/ # Mobile app (Expo / React Native)
β βββ screens/ # HomeScreen
β βββ components/ # GoogleMaps, NearbySearch, ParkingCard...
β βββ lib/ # API service, Supabase client, data transforms
β βββ theme/ # Design tokens (dark amethyst theme)
β
βββ Dashboard/ # Web dashboard (Vite / TypeScript)
βββ src/
βββ main.ts # SPA: auth, lots, canvas slot editor
βββ api.ts # API client
βββ style.css # Styling
- Python 3.10+ with
pip - Node.js 18+ with
npm - Supabase project (supabase.com)
- ngrok (for tunneling the backend)
cd backend_api
pip install -r requirements.txtCreate a .env file:
SUPABASE_URL=[https://your-project.supabase.co](https://your-project.supabase.co)
SUPABASE_SERVICE_KEY=your-service-role-keyStart the server:
uvicorn main:app --reload --port 8000π Swagger docs available at
http://localhost:8000/docs
cd ai_vision
pip install -r requirements.txtCreate a .env file:
BACKEND_URL=http://localhost:8000
LOT_ID=your-lot-uuidRun the agent:
# Production (headless, reports to backend)
python vision_agent.py --video assets/demo_video.mp4
# With debug GUI
python vision_agent.py --video assets/demo_video.mp4 --debug
# Define parking slots first (interactive)
python select_slots.py --video assets/demo_video.mp4cd Frontend/Parkie
npm install
npx expo startUpdate
config/api.jswith your backend URL (ngrok or local).
cd Frontend/Dashboard
npm install
npm run devUpdate
VITE_API_BASE_URLin.envor the fallback insrc/api.ts.
| Method | Endpoint | Description |
|---|---|---|
POST |
/register |
Create a lot owner account |
POST |
/login |
Authenticate and get user profile |
GET |
/lots |
All verified lots (mobile app) |
GET |
/lots/colors |
Lightweight color-only updates |
GET |
/lots/{id} |
Single lot details |
GET |
/lots/{id}/config |
Camera URL + slot polygons (AI agent) |
GET |
/my_lots/{owner_id} |
Owner's lots (dashboard) |
POST |
/lots |
Register a new parking lot |
POST |
/lots/{id}/setup |
Save slot polygon configuration |
POST |
/update_lot |
Update occupancy (AI agent β backend) |
POST |
/capture_frame |
Grab a camera frame as base64 |
PATCH |
/lots/{id}/verify |
Admin: verify/reject a lot |
| Column | Type | Notes |
|---|---|---|
id |
uuid |
Primary key |
name |
text |
|
email |
text |
Unique |
password |
text |
bcrypt hashed |
created_at |
timestamptz |
| Column | Type | Notes |
|---|---|---|
id |
uuid |
Primary key |
owner_id |
uuid |
FK β users.id |
name |
text |
|
latitude |
float8 |
|
longitude |
float8 |
|
camera_url |
text |
RTSP/HTTP stream URL |
slots_data |
jsonb |
Array of 8-coord polygon vectors |
capacity |
int |
Total slots |
available_spots |
int |
Currently free |
status_color |
text |
green / yellow / red / gray |
is_verified |
boolean |
Admin approval flag |
last_updated |
timestamptz |
Last AI scan time |
The vision agent uses a multi-step approach for robust parking detection:
- YOLO Inference β YOLOv11m detects vehicles (car, motorcycle, bus, truck, bicycle)
- Polygon Matching β 10-point sampling checks if a vehicle overlaps a slot polygon
- Large Vehicle Filter β Detections > 12% of frame area are ignored (passing buses/trucks)
- Occupancy Smoothing β 5-frame sliding window with majority vote prevents flicker
- Backend Reporting β Stable occupancy posted every 15 seconds
The mobile app uses a premium dark amethyst theme:
| Token | Value | Usage |
|---|---|---|
| Background | #0a0a0a |
Main screen |
| Primary | #8d23be |
CTAs, active elements |
| Surface | #401056 |
Cards, glass panels |
| Status Green | #10b981 |
< 70% occupied |
| Status Yellow | #f59e0b |
70β85% occupied |
| Status Red | #ef4444 |
> 85% occupied |
Glassmorphism with rgba(64, 16, 86, 0.4) backgrounds and violet borders throughout.
Built with β and π at ITfest 2026 Hackathon. :3
Made for ITfest 2026 Β· TimiΘoara, Romania π·π΄


