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
Capture
The photo and GPS fix are stored before the server even replies. A capture is never lost; everything after it is retryable.
- 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
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
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
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
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.
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.
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.
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.
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.
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.
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.
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.
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 by
Built with
- Go
- PostgreSQL + PostGIS
- Flutter
- Cloud Run
- Cloudflare R2 + Workers
- Vision-language models
Writing about TraceSarkar
- Bands, not percentages: a spatial join you can’t afford to get wrongHow TraceSarkar matches a photo of a pothole to the ward that owns the road and the contract that paid for it — and why every gate is built to ask rather than guess.Building · TraceSarkar
- No model in the path: why we hand-write the post and the PDFTraceSarkar uses AI to read a photograph. It refuses to use AI to write a sentence about anyone. Here’s where we drew that line, and why.Principles · TraceSarkar
- Safe by construction: privacy engineering for a civic app on a zero budgetFaces destroyed before any model sees them, locations snapped instead of jittered, and database constraints that make the unsafe path impossible rather than unlikely.Building · TraceSarkar