Inspiration
In cities like Bengaluru, citizens often report potholes, garbage overflow, broken streetlights, water leakage, open drains, unsafe footpaths, and traffic signal issues. But these complaints are usually unstructured, duplicated, wrongly categorized, and difficult to track. We wanted to build a smarter civic reporting system that helps citizens raise issues easily and helps city teams understand, prioritize, and route them faster.
What it does
FixMyCity AI allows citizens to report civic issues by uploading a photo, adding a short description, and sharing the location. The AI analyzes the report, identifies the issue category and a specific, human-readable description of exactly what it sees (not just a generic bucket like "electrical issue" — something like "Exposed Electrical Wiring on Pole"), estimates severity, detects possible duplicate complaints, and routes the ticket to the right department. It also gives citizens a simple status update so they know whether the issue has been received, verified, assigned, is in progress, or has been resolved.
How we built it
The citizen-facing app is a separate Flutter mobile app — camera capture, GPS location, and an urgency note, no on-device detection. It talks to a TanStack Start backend (exposed over both raw RPC and OpenAPI) that hosts the actual agent pipeline.
Classification runs as a Genkit flow calling Gemini 3.6 Flash on the uploaded photo. The interesting part: duplicate detection isn't a step we hard-code in TypeScript and hand the model the result of — it's a tool (findNearbyReports) we give the model, and the model decides for itself whether to call it when reasoning about severity. The prompt tells it that multiple recent nearby reports of the same hazard should push its severity estimate up, not down, and we've seen this change real outcomes in testing: the same kind of report submitted somewhere with existing nearby reports of the same issue tends to come back with a higher severity than the identical input submitted somewhere isolated — the agent is genuinely incorporating retrieved context into its own judgment, not running a fixed sequence.
Data and file storage run on Google Cloud — Postgres on Cloud SQL for tickets and presubmit drafts (via Prisma), and photos go straight to Cloud Storage. We started on Convex for its reactive queries, then pulled it out in favor of one GCP-native database, so the whole stack — including the Genkit flow itself — runs on Google Cloud with no third-party platform in the loop. The trade-off: the admin dashboard no longer updates in real time from reactive queries; it polls every few seconds via TanStack Query instead. The backend deploys itself, too — Cloud Build redeploys both Cloud Run services on every push to main.
A trust score (clear image, exact GPS accuracy, corroborating nearby reports, recency) is computed deterministically in code rather than left to the LLM, so the scoring rubric remains auditable. Department routing is an explicit mocked lookup table, per the brief's constraint against real government integration.
Challenges we ran into
The biggest challenge was converting unclear, real-world complaints into structured data. Citizen reports may have poor image quality, omit details, provide vague descriptions, or repeat the same issue. Another challenge was designing a routing flow that feels realistic without depending on actual government systems. We solved this by creating a mock department routing workflow and a simple priority-scoring system.
Accomplishments that we're proud of
We are proud that FixMyCity AI is more than just a complaint form. It acts like an intelligent civic assistant that can classify issues, detect duplicates, assign priority, and create actionable tickets. We are also proud of the citizen-friendly tracking flow, because transparency is an important part of public issue reporting. The project demonstrates how AI can support both citizens and city operations in practical ways.
What we learned
We learned that civic tech problems are not only about collecting data, but also about making that data usable. A good report should be clear, categorized, prioritized, routed, and trackable. We also learned how AI can be used beyond chatbots by supporting a complete workflow from report submission to decision-making.
What's next for FixMyCity AI
Next, we want to add map-based issue clustering, WhatsApp reporting, multilingual support, real-time department dashboards, SLA tracking, and analytics for city hotspots. We also want to improve duplicate detection using location, image similarity, and report timing. In the future, FixMyCity AI could integrate with municipal systems to help cities respond faster and give citizens better visibility into the resolution of local issues.
Built With
- convex
- dart
- flutter
- gemini-vision-api
- genkit
- github
- react.js
- tailwind-css
- tanstack-start
- typescript
Log in or sign up for Devpost to join the conversation.