UJJWAL
Case study 10 · Municipal complaint system

CivicSathy

A complaint and infrastructure tracking system designed for Itahari Sub-Metropolitan City.

A broken road or an overflowing drain is reported by phone, forgotten, and reported again. CivicSathy gives every complaint a tracking ID, a location on a map and an AI severity estimate, so a municipality can see where problems cluster and act on the worst first.

Source code
CivicSathy shown on desktop and mobile
01 / Overview

The problem

Ward offices in a growing city like Itahari receive complaints about roads, sanitation, water, electricity, flooding and safety through calls and visits. The same problem gets reported many times, and nobody has a clear picture of which wards need attention.

What I built

Citizens register with their ward, report a problem with a category, location, map pin and optional photo, and follow it with a tracking ID such as CS-W5-A3B7. Others can mark that they are affected or comment. Administrators triage tickets, assign teams and vehicles, broadcast announcements, and publish resolution reports.

This was a team project with five developers. I wrote 52 of the 182 commits.

CivicSathy: The citizen app: report, track and follow up. Local run with demo data.
The citizen app: report, track and follow up. Local run with demo data.
02 / Features

What it does

For citizens

  • Complaints with category, ward, location, map pin, photo and an anonymous option
  • Tracking IDs per ward
  • A public feed with "I'm affected" votes and comments
  • Duplicate warning for similar reports within about 200 metres

For the municipality

  • AI triage of severity, team, equipment, hours and vehicles
  • Task assignment with teams and vehicles
  • Escalation list for tickets pending more than 48 hours
  • Ward heatmap and PDF reports
CivicSathy: The ward heatmap across Itahari, with demo complaints.
The ward heatmap across Itahari, with demo complaints.
03 / Architecture

How it's built

CivicSathy technology stack
LanguageJava 17
WebJakarta Servlet 6, JSP, Apache Tomcat 11, Maven
DataMySQL, 14 tables with foreign keys
AIGoogle Gemini 2.5 Flash over REST, with the complaint photo sent as image input
Maps and reportsLeaflet with a heat layer on OpenStreetMap; OpenPDF
StructureMVC with a DAO layer: 22 servlets, 11 DAOs, 11 models

CivicSathy follows a classic MVC structure on Jakarta Servlets with a DAO layer over MySQL. Every query is a prepared statement, and authentication filters protect citizen and admin areas with 30-minute sessions.

04 / Engineering

Engineering highlights

01

AI that looks at the photo

When an administrator runs the analysis, the complaint text and photo go to Gemini together. It returns a severity from low to critical, a suggested team, equipment, estimated hours, team size and a vehicle, which are stored with the ticket.

02

Fewer duplicate reports

Before a complaint is submitted, the system looks for similar titles within roughly 200 metres using a Haversine distance query, and shows them to the citizen first.

03

A map of where problems are

A Leaflet heatmap shows complaints by location across the city's wards, so administrators can see clusters at a glance.

06 / Status

Where it stands

CivicSathy was built as a university team project and is not in production use. The source code is on GitHub, and the screens on this page come from a local run with demo data.

If I took it further, I would replace the SHA-256 password hashing with argon2id and add CSRF tokens before any real deployment. Knowing what a project still needs is part of the job.

Planning a product like CivicSathy? I design, build and launch web apps for businesses in Nepal and abroad.

All work