Skip to content
← All work

Civic issues · MumbaiSoloPilot · Borivali ward

TraceSarkar

Photograph a pothole. Get back who is responsible, what they were paid to do, and what you can do about it.

The problem

One geotagged photo is classified, matched to the ward and the public road contract that covers it, and turned into a sourced record with the next step drafted — a complaint, an RTI, a share card. The citizen sends it; the platform never does.

Governance failure in the Mumbai region isn’t caused by a shortage of data. It’s caused by a shortage of synthesis and a shortage of consequence.

Five facts about a single pothole — that it exists, which ward owns that stretch, which contract built it, whether it’s still under warranty, and what deadline the law sets — live in five disconnected places: a citizen’s phone, a PDF ward map, a tender portal keyed by tender ID, a defect-liability clause, and a High Court judgment.

In October 2025 the Bombay High Court held that safe roads are part of the right to life and that a reported pothole must be attended to within 48 hours. Structured, timestamped evidence is now directly convertible into consequence. Nobody was producing it.

of 2,405 BMC road works resolved to the right ward
98.17%
of 2,405 BMC road works resolved to the right ward
contract matches judged right by a human reviewer, none naming the wrong contractor
50/50
contract matches judged right by a human reviewer, none naming the wrong contractor
BMC road works archived, write-once, twice a day
4,878
BMC road works archived, write-once, twice a day

How it works

  1. 1

    Capture

    The photo and GPS fix are stored before the server even replies. A capture is never lost; everything after it is retryable.

  2. 2

    Redact

    Faces and number plates are found by detectors that run on our own servers and destroyed with a mosaic — before any image reaches a third-party model.

  3. 3

    Classify

    A vision model sorts the photo into a closed taxonomy. Below 0.65 confidence it asks the user instead of guessing. Models that train on inputs are refused by code.

  4. 4

    Locate

    PostGIS finds the ward from BMC’s own boundary polygons — then checks the distance to the ward line against the phone’s GPS error before it trusts the answer.

  5. 5

    Attribute

    The point is matched to BMC’s road-works geometry and the contract behind it, reported in confidence bands, never a falsely precise percentage.

  6. 6

    Act

    A complaint, an RTI draft, a WhatsApp card and an evidence PDF are generated from the facts — with no language model in the path. You decide what to send.

Decisions I’d make again

Precision over recall

A wrong contractor name published next to a pothole is a defamation fact pattern. A missing one costs a feature. Every gate is built to ask rather than guess.

No model writes the share post

A model would write better sentences than a template. It would also, eventually, write a fact. The failure mode we chose is a stilted sentence, not a false one.

Legal constants are data

The 48-hour pothole deadline isn’t a literal in Go. Every SLA, fee and limit lives in a versioned table with an effective date and a citation.

Snap, never jitter

Public positions are snapped to a ~111 m grid. Random jitter leaks: publish the same point enough times and the average converges on the truth.

The journey so far

From the first annoyance to telling people about it. Dates come from the commit history.

  1. 10 Aug 2026Get annoyed

    Six weeks of writing before any code

    The first commit was a vision, a problem statement and a research pack — the legal context, the data sources, the personas. No code until the idea survived on paper.

  2. 24 Aug 2026Research

    BMC’s open roads API

    A data-availability audit turned up BMC’s own road-works geometry. That made the contract join a database problem, not a policy problem.

  3. 23 Sep 2026Build

    First code

    Scaffold, config, a write-once archive in R2, migrations. Built one system at a time — only one open at any moment, each with a bar it had to meet.

  4. 24 Sep 2026Build

    BMC blocks foreign clouds

    The first CI run failed because BMC filters by geography. Collection moved to Mumbai, then to a scheduled Cloud Run job in asia-south1.

  5. 29 Sep 2026Ship

    A host died; the bars were met

    Four days after we wrote down the risk, the shared host died. The API moved to Cloud Run. Same day: attribution and jurisdiction met their measured bars, and the pilot moved to Borivali.

  6. 5 Oct 2026Build

    Real photographs, real bugs

    The first two real captures found three bugs the synthetic probes never could — including a road contractor named next to a garbage report. Probes test the join; photographs test the product.

  7. 14 Oct 2026Ship

    Share kit, evidence PDF, all 24 wards

    Posts in English, Marathi and Hindi generated from facts, a deterministic evidence PDF, and road-defect routing for every BMC ward.

  8. Tell peopleNext

    One RWA, one journalist, one story

    No paid acquisition: growth comes from the share. Next is recruiting a handful of RWA secretaries and a public v0.1 before the 2027 monsoon.

Built with

  • Go
  • PostgreSQL + PostGIS
  • Flutter
  • Cloud Run
  • Cloudflare R2 + Workers
  • Vision-language models

Writing about TraceSarkar