Pan-Nigeria election-results dashboard — live INEC IReV scraping, historical results 2015-present, ENP/swing/competitiveness analysis. Flask + Next.js.
# 🇳🇬 Nigeria Election Dashboard
**Live, open electoral data for Nigeria — every race, every cycle, one dashboard.**
**Open the dashboard** · **Public API** · Report a bug
---
Election results in Nigeria are scattered across PDFs, press conferences, and
paywalled trackers. This project puts them in one free, open place: live INEC
IReV scraping on election day, curated historical results back to 2015, and
the statistical lenses (turnout, swing, competitiveness) that make the numbers
mean something — Presidential down to Area Council, national down to ward.
## Features
- **Live on election day** — a polite, rate-limited scraper follows INEC IReV
and streams updates over SSE
- **Deep history** — INEC-certified results from 2015 to present, importable
from CSV/PDF with full provenance tracking
- **Real analysis** — turnout, margin, ENP (Laakso–Taagepera), swing, and a
competitiveness index, not just bar charts
- **Maps all the way down** — interactive choropleths from national → state →
LGA → ward
- **Free public API** — every number on the dashboard is one `curl` away.
Free keys, by application → apply here ·
docs/API.md
- **Open methodology** — sources, formulas, and known gaps documented
on-site
## Public API
The dashboard is free for everyone with no account. The API is free too —
apply for a key (name, email,
what you're building), get approved, and go:
```bash
curl -H "X-API-Key: ned_..." "
elections.innoedgetech.com"
curl -N -H "X-API-Key: ned_..."
elections.innoedgetech.com # SSE during live elections
```
Full endpoint reference: **docs/API.md**.
## Architecture
```
INEC IReV ──► [worker: scraper] ┐
▼
CSV/PDF ────► [job: importer] ──► [managed Postgres]
│
Browser ◄──── [web: Flask API] ◄──┤
│
Browser ◄──── [static: Next.js] ◄─┘
```
Backend: Python 3.11 + Flask + SQLAlchemy 2 + Alembic.
Frontend: Next.js 14 (App Router) + Tailwind + recharts + SWR + react-leaf …