Case Study 01 · Ward Services Platform
A civic services platform for an urban ward in Nairobi County. Residents report problems and apply for bursaries, every request gets a receipt they can check, and ward staff work from one console instead of notebooks and WhatsApp threads.
§01The problem
A Nairobi ward is the level of government residents actually touch. It is where a blocked drain gets reported, where a parent applies for school fees support, where road works either happen or don't. Yet the office that handles all of this typically runs on paper registers, phone calls, and the recollection of whoever was on duty.
The result is structural, not personal. A complaint that isn't written down can't be followed up. A bursary decision that isn't recorded can't be explained. Residents have no way to check what happened to their request, and the office has no way to see its own workload, so it can't prove it is doing the work even when it is.
The brief was to give the ward the same operational visibility I build for hotels and logistics companies, and to design it so the next ward can deploy it without starting over.
§02The accountability loop
The core mechanism is simple: every report gets a tracking ID at the moment it's submitted, like CMP-2026-4817. The resident keeps the ID; the office can't quietly lose the request. Status moves through three states, each with a published service target, and the resolution note is written for the resident, not just for the file.
Blocked culvert confirmed on site. Clearing crew scheduled with county public works.
§03The bursary pipeline
Ward bursaries are one of the most visible things local government does, and one of the easiest to question. The application form captures what a reviewer actually needs to allocate fairly: total fees, amount already paid, amount requested, education level, and sub-location. Every decision carries a review note, and the applicant sees it.
Because the data is structured, the office can finally answer the questions that matter: how much was requested against how much was approved, and whether support is reaching every part of the ward or clustering in one.
§04Ward-owned spatial data
Most wards don't have a usable map of their own territory. The platform includes a GIS layer fed by community enumerators using KoboToolbox: water points, sanitation, schools, health facilities, markets, drainage, and household records. Submissions come in as CSV and every point keeps its provenance: submission ID, who collected it, when, and whether a staff member has verified it.
The sensitive part is households: size, tenure status, water, power and sanitation access. That data is essential for planning and dangerous if exposed. So the rule isn't in the interface, it's in the database: the public can only ever read verified, non-household points. Household records are visible to authenticated staff only, and no frontend bug can change that.
§05The staff console
Small offices usually get one shared admin password. That makes every action anonymous and every mistake unrecoverable. Instead, each staff account carries eleven independent permissions, assigned by a super-admin, and the console only shows what a person is allowed to touch. A clerk can log complaints without approving bursaries; a reviewer can approve bursaries without deleting records.
| Capability | Front desk | Bursary reviewer | Field officer | Super-admin |
|---|---|---|---|---|
| View & update complaints | ||||
| View bursary applications | ||||
| Approve / reject bursaries | ||||
| Manage projects & notices | ||||
| Manage map & field data | ||||
| Reports & AI insights | ||||
| Delete records | ||||
| Manage staff accounts |
EXAMPLE PROFILES · NEW ACCOUNTS START WITH NO WRITE ACCESS
§06Reporting & AI briefs
The reports view turns operational data into the picture a ward office has never had: complaints by category and status, resolution rate, submissions over time, bursary demand by education level and sub-location, and total requested against total approved. It exports to CSV for county reporting.
On top of that, one click sends an aggregated summary, never raw records, to Claude, which writes a short plain-language brief for staff: which categories are rising, where response is slow, and where support looks unevenly distributed. The point is not automation for its own sake. It's giving a busy office the one paragraph it would otherwise never have time to write.
Operational
Resolution rate
Share of complaints closed, by category, over time. The number an office can be held to.
Equity
Distribution by sub-location
Where bursary demand comes from and where support lands, so gaps become visible.
Financial
Requested vs approved
Total bursary demand against allocation, the gap that justifies next year's budget ask.
Narrative
AI insight brief
Four to six plain-language observations generated from aggregates, for staff and elected leadership.
§07Architecture
Public institutions can't afford clever systems that only their builder understands. The stack is deliberately mainstream: a Next.js app on Vercel, Postgres on Supabase with authentication, and access rules written as row-level security policies so the database, not the app, is the last line of defence. The whole schema is four readable SQL migrations.
§08Design decisions
The measure of a civic platform isn't whether it works in one ward. It's whether the next ward can run it without the person who built it. These are the decisions that follow from that.
The receipt is the product
A tracking ID costs nothing to issue and changes the relationship: the resident now holds evidence, and the office now has a queue it can measure.
Rules live in the database
Who can see what is written as Postgres policy. The interface can have bugs; the data boundary shouldn't depend on it.
The ward owns its data
Field data is collected by the ward's own enumerators, with provenance on every record. Partners can train and advise without taking custody of the data.
Design for the cheapest phone
The web app is mobile-first, and the USSD channel is designed to reach residents who will never open a browser.
Configuration, not fork
Ward identity, categories and boundaries are data, not code. A new deployment is a new database and a config file.
I'm interested in deploying this with other local governments and in research collaborations on technology-enabled accountability in East Africa.