Methodology & sources
UP NEPA! is a free, public-good map of electricity reliability in Lagos. For every feeder it shows the official NERC band promise — the minimum daily hours of supply the tariff commits to — set against officially-announced disruptions. Nothing more, nothing less.
This is a promise-vs-announced map. It puts two official facts side by side:
- the promise: the NERC tariff band each feeder is on, which carries a guaranteed minimum number of supply hours per day; and
- the announced disruptions: planned maintenance and outages that the distribution companies (DisCos) publish themselves.
UP NEPA! does not measure how much electricity was actually delivered to your home. It cannot tell you whether the light was on at 9 p.m. last night. A day with no announced outage is not a verified-supply day — it simply means nothing was announced.
For each feeder, each day, we compute a single derived figure:
effective = clamp(promised − announced loss, 0, promised)
The promised hours come from the feeder’s NERC band. The announced loss is the total hours removed by officially-announced disruptions overlapping that day. The result is the effective promise after announcements.
This is a deliberately conservative, official-only number. It is the gap between what was promised and what was officially taken away — never a claim about reality on the ground.
You might expect a simple feed of “hours of power delivered per feeder.” It does not exist publicly. NERC’s Service-Based Tariff order requires DisCos to publish a daily, rolling 7-day average of hours-of-supply for every Band A feeder — but in practice neither EKEDC nor Ikeja Electric publishes a usable per-feeder dataset.
The only official “measured” signal is NERC’s roughly monthly Band A downgrade orders, which name feeders that failed to meet their committed hours. These arrive as scanned PDFs, cover only a slice of feeders, and lag by weeks. They are useful context but cannot power a live map.
So UP NEPA! ships the honest model it can build today from official sources, rather than implying a measurement it does not have.
Under the Service-Based Tariff, every feeder is assigned a band, and each band carries a minimum guaranteed daily supply commitment:
| Band | Promised hours/day |
|---|---|
| Band A | 20h |
| Band B | 16h |
| Band C | 12h |
| Band D | 8h |
| Band E | 4h |
Source: NERC Service-Based Tariff (band minimum hours). NERC electricity tariffs. Band minimums are applied as a single constant in the codebase, so a regulatory correction is a one-line change.
Disruption announcements are collected automatically from official DisCo channels — the EKEDC (@EKEDP) and Ikeja Electric (@IkejaElectric) social feeds, plus their website notice pages. A language model reads each post and extracts the affected areas, timing, and type; every imported record links back to its original source so you can verify it yourself.
Auto-imported announcements are labelled “auto-imported” until a human confirms them, at which point they become “verified”. Area names are fuzzy-matched to feeders; anything we cannot confidently match is logged and skipped rather than guessed.
There is no public dataset of exact per-feeder GPS coordinates. Feeder positions on the map are approximate, area-centroid based — derived from the feeder’s name and service area, not a surveyed location. The “Areas” overlay draws an indicative radius around each point, not a real service boundary. Treat positions as “this neighbourhood,” not “this transformer.”
Base map imagery is served from public Google Maps tiles, with a CARTO fallback. Tile providers are configured through a single pluggable registry so the basemap can be swapped without touching the rest of the app. Imagery is used for orientation only and remains the property of its respective providers.
The feeder list is compiled from official DisCo publications and press releases. It is not exhaustive: documentation skews toward Band A and Band B feeders, so coverage is denser there. Bands are reliable; the exact feeder roster is best-effort and will grow. This is a transparency tool, not an official register.
The honest gap model is the foundation. The next layer is a community-reported “is the light on right now?” stream — a genuinely measured signal contributed by people on the ground. The data-stream badges and the reserved “Live status” slot you see in the app are the architectural seams for that layer; it can be added without a rewrite. Until then, everything on the map is official promise vs official announcement.