// case study

CivicSpot

A civic issue-reporting platform that lets citizens report and track city problems, with AI-verified photo evidence so reports can be trusted at a glance.

LiveReact · TypeScript · ViteSupabaseGoogle Vision API
CivicSpot screenshot

The project, quickly

// role

Solo full-stack developer - design, frontend, backend, and deployment.

// stack

React 18, TypeScript, Vite, Tailwind CSS, shadcn/ui, and Radix UI on the frontend.

// backend

Supabase for Postgres, authentication, real-time subscriptions, and edge functions.

// status

Live and deployed on Vercel, with the database and edge functions on Supabase.

The problem

Cities rely on citizens to flag problems like road damage, broken lighting, sanitation issues, and graffiti - but most reporting channels are slow, hard to verify, and easy to spam. A city can't act on a report if it can't trust the photo actually shows the issue described.

I wanted to build something that solved both sides of that problem at once: make it effortless for a citizen to report an issue from their phone, and give city administrators a way to trust and triage what comes in without manually checking every submission.

How it works

// verification

AI photo verification

Every uploaded photo is checked against the reported issue category using the Google Vision API, so a "pothole" report can't be filed with an unrelated photo.

// mapping

Interactive maps

Reports are geolocated automatically or placed manually, then plotted on an interactive Google Maps view so patterns across a city are visible at a glance.

// admin

Admin dashboard

Administrators triage reports by category, status, location, and date, update priority, and track resolution progress from a single dashboard.

// realtime

Auth & live updates

Supabase handles email-verified authentication and real-time subscriptions, so a citizen sees their report's status change the moment an admin updates it.

Tech stack

React 18
TypeScript
Vite
Tailwind CSS
shadcn/ui
Radix UI
Supabase
Google Vision API
Google Maps API
Vercel

What I'd improve next

The Vision API check currently confirms a photo is plausible for the issue category, but it can't yet judge severity - a hairline crack and a collapsed road both pass the same check. Adding a severity score would let admins triage by urgency instead of just category and date.

I'd also like to add offline-first report drafting, since the areas most likely to have civic issues (poor road conditions, damaged infrastructure) often have the weakest connectivity too.

© 2026 Shreesh Dwivedidesigned & built with curiosity.

Contact

My local time: loading…

Email

Always happy to help.

Compose

Stay in touch

I'm most responsive on LinkedIn.