The story
Snap a photo of a broken road or overflowing bin. The AI checks it, scores it and sends it to the right city department, and every step is recorded so reports can't quietly vanish.
Combining signals that disagree: a report can look valid to the image model and still be a duplicate, spoofed GPS or spam, so the final verdict weighs AI confidence, community votes and user trust (AI×0.4 + Community×0.3 + Trust×0.3) instead of trusting any one of them.
How it’s built
Inside StreetLight
System architecture
- Flutter citizen app
- → FastAPI backend: router, Web3 writer (photo + GPS)
- React admin portal
- → FastAPI backend: router, Web3 writer (Kanban workflow)
- Flutter citizen app
- FastAPI backend: router, Web3 writer
- → 5-layer AI pipeline (validate + score)
- → Supabase PostgreSQL
- → Agentic scheduler: escalate, auto-close (background jobs)
- → Ethereum Sepolia contract (verified hash)
- → Firebase FCM alerts (status alerts)
- FastAPI backend: router, Web3 writer
- 5-layer AI pipeline
- → EfficientNet-B3 on Hugging Face Spaces (classify)
- Agentic scheduler: escalate, auto-close
- → Supabase PostgreSQL (escalate / close)
- Ethereum Sepolia contract
- Firebase FCM alerts
- 5-layer AI pipeline
- EfficientNet-B3 on Hugging Face Spaces
- Supabase PostgreSQL
Engineering decisions
Decision 01
One score, three opinions
Final score = AI × 0.4 + Community × 0.3 + Trust × 0.3. No single signal decides alone, so a convincing fake photo still needs the community and the reporter's history to agree.
Decision 02
Three lanes, not a yes/no
85 or more auto-verifies, 60 to 84 goes to an officer, under 60 is rejected. Automation handles the clear cases; humans only see the uncertain ones.
Decision 03
Privacy-first blockchain
Only SHA-256 image hashes and Keccak location hashes go on-chain. The ledger proves nothing was altered without ever storing a photo, coordinate or name.
Decision 04
Model as its own service
EfficientNet-B3 runs in its own Docker container on Hugging Face Spaces, so the model can be retrained and redeployed without touching the FastAPI backend.
Decision 05
Nothing silently stalls
Agentic background jobs escalate reports that stop moving and auto-close confirmed fixes, so a complaint can't just disappear in a queue.
