Grid
Electricity accountability for Nigerian households and landlords.
- Flutter
- Dart
- Kotlin
- Swift
- Go
- PostgreSQL
- SQLite / Drift
The problem
A Nigerian household disputing an electricity bill has nothing to dispute it with. No reading history, no record of how long the power was actually on, and no document anyone at a distribution company is obliged to look at. So the bill gets paid, or the connection gets cut.
Since supply was split into service bands the gap has a shape: a Band A household pays roughly four times the Band D rate and is promised twenty hours a day. When those hours do not arrive, the difference is money that changed hands for a service that did not. Almost nobody can show it.
What I built
- Meter OCR on the device. Vision on iOS, ML Kit on Android, behind one façade with a null implementation so the app runs where neither exists.
- Supply inference — how many hours the power was actually on, measured rather than asked for, and valued against what the band promised.
- A dispute pack. Readings, supply hours, band adherence and the naira owed, assembled into a PDF a distribution company and a regulator will read, with an escalation ladder that counts the days while you wait.
- No backend at all in v1. Everything a household needs in order to act runs on the phone — the people who need this most are the ones whose data ran out. A Go server arrives later, for landlords sharing statements with tenants.
Decisions worth naming
- The engines are separately licensed. Every figure in a dispute pack comes out of one directory, and the whole point of the document is that the other side will argue with it. A number somebody is expected to accept, produced by arithmetic nobody outside the company may read, is a number with no standing — so that directory is Apache-2.0.
- Alerts are raised in the foreground and say so. With no server and no background execution, an app that implied it would warn you while closed would be lying. It says what it can and cannot do.
- Coverage is reported, not interpolated. iOS has no continuous execution; where a sample is missing the app says so rather than drawing a line through it.
What is not finished
- OCR accuracy on real meters. The ≥95% gate needs photographs of actual analogue dials. A simulator has no camera.
- A home-screen widget. Needs WidgetKit and an App Widget provider — native extension targets. What is built and tested is the snapshot the widget reads and its staleness rule.
- Five languages, and a regulatory review. Tariff bands and estimated billing have settled local phrasing, and Grid quoting a superseded procedure would damage the user’s case — the one thing it exists not to do.