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

Live FixMyCity operations map showing geolocated civic reports in the admin panel.
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 admin report list with status, priority, severity, and AI classification fields.
A municipality-scoped map keeps report status and category visible across the city.

The same report creates new evidence and accountability as it crosses each authority boundary.

Citizen evidence

Report lifecycle
  1. Citizen evidence
  2. Municipal review
  3. Crew assignment
  4. Field resolution
  5. Citizen update
  1. The FixMyCity Expo mobile app screen for starting a new issue report.
    Operational surface

    Citizen evidence

    The citizen records the issue with location, photo, and category evidence.

  2. FixMyCity admin report list with status, priority, severity, and AI classification fields.
    Operational surface

    Municipal review

    A municipal operator verifies the report and sets its scope and priority.

  3. FixMyCity crew recommendation modal with score factors, distance, and assignment action.
    Operational surface

    Crew assignment

    The system exposes its recommendation factors; assignment stays with the operator.

  4. FixMyCity crew management panel showing field teams and workload.
    Operational surface

    Field resolution

    The crew resolves the issue in the field and leaves proof of closure.

  5. The FixMyCity Expo mobile app map with report locations and status filters.
    Operational surface

    Citizen update

    The citizen sees the state change and outcome through the same report.

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 modal with score factors, distance, and assignment action.
03 / 05

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

Map, reports, crews, and mobile entry carry one operation.

FixMyCity is not one screen; it reshapes evidence around the people who act on it.

FixMyCity crew management panel showing field teams and workload.
03

The crew surface exposes capacity, expertise, and open work in one view.

The FixMyCity Expo mobile app map with report locations and status filters.
04

The mobile map keeps city reports readable by location and status.

The FixMyCity Expo mobile app screen for starting a new issue report.
05

The mobile report flow puts photo evidence at its first step.

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.