</ripple>
Snap a pothole; on-device AI files the report in 3 seconds. No account.

3 sec
photo → classified report
10
issue categories, on-device AI
5
Melbourne councils targeted
SPECIFICATIONS
| ROLE | SOLO BUILD |
|---|---|
| YEAR | 2025 |
| TYPE | WEB APP |
| STATUS | IN DEVELOPMENT |
| STACK | react 19 · typescript · vite · tailwind · mapbox · supabase · tensorflow.js · mobilenet +5 more |
| LINKS | [github ↗] |
| AVAILABILITY | in development |
“Infrastructure issues go unreported because the friction to report is too high.”
Civic infrastructure reporting platform.Snap a photo of a pothole, broken light, or graffiti · AI classifies it in 3 seconds, geolocks the report, and communities vote to help councils prioritize repairs.js means no images leave your phone.Privacy-first, no account required.
== WHAT IS THIS ==
Civic infrastructure reporting platform. Snap a photo of a pothole, broken light, or graffiti · AI classifies it in 3 seconds, geolocks the report, and communities vote to help councils prioritize repairs. On-device TensorFlow.js means no images leave your phone. Privacy-first, no account required.
== </the problem> ==
Infrastructure issues go unreported because the friction to report is too high. Council portals require accounts, forms, and manual categorization. Without volume data, councils can't prioritize repairs effectively. Communities have no way to signal which issues matter most.
== </my approach> ==
Built a 3-second reporting pipeline: snap a photo, on-device AI classifies it, geolocation pins it to a community map. Community upvoting creates social proof for council prioritization. Zero accounts, zero personal data, all AI runs on-device.
== </the story> ==
Ripple started from a simple frustration: you see a pothole every day on your commute, report it to the council, and nothing happens. Multiply that across a city and you get thousands of unreported issues because the friction to report is too high and councils have no way to prioritize.
Ripple makes reporting take 3 seconds. Open the app, snap a photo, and the on-device AI (TensorFlow.js running MobileNetV2) classifies the issue · pothole, broken streetlight, graffiti, accessibility hazard, illegal dumping, and 5 more categories. The report is automatically geolocated and pinned to a live community map. No typing, no forms, no account required.
The community layer is what makes it work at scale. Neighbors see reports on the map and upvote issues they encounter too. When a pothole has 47 votes, the council knows it's not one person complaining · it's a neighborhood consensus. The live Mapbox map uses clustering, category-colored pins, and heatmaps to visualize problem density across suburbs.
Pilot deployment targets 5 Melbourne councils: City of Melbourne, City of Yarra, Moreland, Darebin, and Port Phillip. Privacy-first: no accounts, no personal data collection, all image classification runs on-device.
== </architecture> ==
Frontend is React 19 with TypeScript, Vite, and Tailwind CSS, built as an offline-first PWA. Mapbox GL JS 3.20 renders the dark-v11 base map with category-colored pins, clustering at zoom levels, and heatmap overlays for issue density.
The AI pipeline runs entirely client-side. TensorFlow.js loads MobileNetV2 on app init and classifies photos locally · no images are ever transmitted to a server. Classification results (category + confidence score) are sent with the geolocated report to Supabase.
Backend runs on Supabase: PostgreSQL with Row Level Security, Realtime channels for live report updates, and Deno Edge Functions for aggregation. Elasticsearch provides full-text search across reports and powers analytics dashboards for council operators. Resend handles transactional email notifications.
Offline support uses IndexedDB (via IDB library) to queue reports when connectivity drops. Reports sync automatically when the device reconnects. Zustand manages client state with persistence.
== </key features> ==
3-second AI reporting
Snap a photo and TensorFlow.js classifies the issue instantly on your device. No forms, no typing.
Community voting
Neighbors upvote issues they see. 50 votes on a pothole tells the council it's a neighborhood priority, not one complaint.
Live community map
Real-time Mapbox interface with category-colored pins, clustering, and heatmaps showing problem density.
On-device AI
TensorFlow.js runs MobileNetV2 locally. No images leave your phone. 10 infrastructure categories classified in under a second.
Offline-first
IndexedDB queues reports when offline. Auto-syncs when connectivity returns. Works in tunnels, basements, dead zones.
Council analytics
Elasticsearch-powered dashboards for council operators to search, filter, and prioritize reports across suburbs.
== </key decisions> ==
DECISION 01
On-device AI was non-negotiable. Sending photos of people's neighborhoods to a server creates both privacy and trust problems. TensorFlow.js with MobileNetV2 runs fast enough on modern phones that classification feels instant, and the entire inference pipeline stays on the user's device.
DECISION 02
The community voting system is deliberately simple (upvote only, no downvote) to prevent gaming and keep the signal clean. A pothole with 50 upvotes is unambiguous · 50 people saw it and confirmed it exists.
DECISION 03
No accounts removes the biggest friction point in civic apps. Most people won't create an account to report a broken streetlight. Ripple uses anonymous sessions with optional email for status updates on your reports.
DECISION 04
Elasticsearch over Supabase full-text search was chosen for the council-facing analytics. Councils need to search across thousands of reports by category, suburb, date range, and status. Elasticsearch handles this at speed with faceted filtering.
== </what i learned> ==
On-device ML is production-ready for classification tasks. MobileNetV2 via TensorFlow.js runs fast enough on mid-range phones that users don't notice the inference.
Anonymous systems get 10x more reports than account-gated ones. Removing friction matters more than collecting user data.
Community voting creates cleaner signal than individual report severity ratings. Consensus is harder to game than self-assessment.
react 19 · typescript · vite · tailwind · mapbox · supabase · tensorflow.js · mobilenet · turf.js · zustand · framer-motion · elasticsearch · pwa
IN DEVELOPMENT