InfraAlert

A city service where citizens report potholes, leaks and broken streetlights on a map, and staff triage them and send repair crews. A language model reads each report, code sets the priority, and a person decides who goes.

InfraAlert

What changed

  • Kept the model out of decisions. It only turns a report into structured facts, and a published formula sets the priority, with a floor that lifts any life-safety hazard to critical.
  • Grouped reports of the same problem into one incident, so staff triage a pothole once instead of once per report.

What I worked on

  • I built it as one FastAPI service with a React frontend on Cloud Run, backed by Postgres and PostGIS, with slow work sent through Cloud Tasks.
  • I designed the priority formula and the dispatch screen that shows why an incident ranks where it does and which nearby team has the right skills.

InfraAlert has two sides. Citizens drop a pin on the map, describe the problem in their own words and add photos, with no account needed. City staff get a control room: a queue of incidents on a map, and the tools to triage them and dispatch a repair crew.

The staff queue: incidents ranked by priority, with the suggested team for each and a map of where they are

Who decides what

The model reads each report and pulls out the issue type, any hazards, and how confident it is. It decides nothing. Priority comes from a fixed formula that weighs the hazard, the issue type, nearby sensitive places such as hospitals and clinics, and how many people reported the problem. Any life-safety hazard lifts the score to critical, whatever the sum. Staff see exactly how each score was built.

A pothole incident: the priority score broken down by component, with the nearby sensitive places and the suggested team

A dispatcher picks the team, and the system suggests the nearest one with the right skills. When the model can't read a report, it goes to a person to classify. The citizen's status page follows each step, without the staff-only detail.

The citizen's status page after a team was assigned

Built with FastAPI, React, Postgres and PostGIS, Gemini on Vertex AI, Cloud Tasks and Cloud Run.