FixMyCity

A city report should become accountable work, not disappear into a form.

FixMyCity municipality dashboard map showing geolocated civic reports.
Role
Product, UX/UI, architecture, mobile, web, API and AI integration
Status
Solo graduation project
Year
2026

A report leaves the form and becomes accountable work.

What starts with a photo and location remains traceable through municipal review, crew choice, field proof, and the citizen update.

FixMyCity municipal operations landing page and management surface.
  1. 01Citizen evidence
  2. 02Municipal review
  3. 03Crew assignment
  4. 04Field resolution
  5. 05Citizen update
A municipality-scoped map keeps report status and category visible across the city.

Not one form, but four working surfaces with different authority.

Citizen reporting, municipal operations, the transactional domain, and decision support share one lifecycle without inheriting each other’s authority.

The recommendation is explained. Assignment remains with the operator.

FixMyCity crew recommendation dialog with explainable score factors.
03 / 05

Expertise, availability, workload, distance, and urgency remain visible as separate factors.

A report is only useful if somebody can own the next step.

FixMyCity began with a full operational loop: a citizen submits a photo and location; a municipality reviews the evidence; a crew is assigned; field work returns an after-photo and note; the citizen sees the status change.

Building the whole loop exposed the hard parts that a single reporting form hides: geographic scope, role boundaries, evidence storage, assignment logic, notifications, audit history, and failure states across multiple clients.

One domain, four distinct surfaces.

The Expo mobile app is optimized for reporting and follow-up. The Next.js administration surface is scoped to the active municipality. A NestJS API owns the transactional domain, while a separate FastAPI service isolates image and language analysis. PostgreSQL/PostGIS, Redis, MinIO, and OSRM support spatial queries, queues, media, and routing.

The separation is intentional. AI output can assist classification, severity estimation, duplicate discovery, privacy checks, and text review without becoming the source of truth for municipal action.

Explain the recommendation before asking for trust.

Crew suggestions show the factors behind the score: category expertise, availability, workload, travel distance, and urgency. Routing can fall back when OSRM is unavailable. The interface keeps these limits visible so the operator can make the assignment rather than accept a black box.

The project is a graduation prototype, not a claim of real municipal adoption. Its value is the depth of the end-to-end system and the decisions made explicit inside it.

Interfaces change. The transactional domain and evidence chain remain consistent.

  1. 01Expo

    Citizen reporting and follow-up

  2. 02Next.js

    Municipality-scoped operations

  3. 03NestJS

    Transactional domain and roles

  4. 04FastAPI

    Isolated decision support

  • PostgreSQL / PostGIS
  • Prisma
  • Redis
  • MinIO
  • OSRM
  • Docker Compose
Scope notes
25
Data models
15
API modules
07
Admin E2E specs

Where the claim stops

FixMyCity is a solo academic prototype. It has not been deployed by a municipality, and the AI layer is decision support rather than an autonomous authority.