2026-10-26
Changed
- Each polling unit now has a single web address: governorship, Senate and House versions of a polling-unit page redirect to the main one (which shows every race), with the race you came from shown first.
2026-10-25
Added
- Researched biographies for the 2027 Abia governorship candidates, written only from credible newspaper reports, with every sentence footnoted to its source and a list of press reports on each profile. Candidates with no credible coverage have no biography rather than unverified text.
- All 15,103 candidates on INEC's final lists for the 2027 elections are now on the site: 18 presidential tickets, 420 governorship tickets in 28 states, 1,303 Senate, 3,560 House of Representatives and 9,802 State House of Assembly candidates (INEC's assembly list has no Borno entries). Running mates are included.
- The 2027 elections page now lists every presidential ticket and, for each state, the governorship, Senate, House of Reps and State Assembly candidates by constituency, plus a page per local government showing the constituencies that cover it.
- Each 2027 candidate has a politician profile (about 15,000 new ones); existing profiles such as Tinubu, Atiku, Obi and sitting governors now show their 2027 candidacy and running mate.
2026-10-24
Added
- New polling-unit list for every local government (e.g. all 1,545 polling units in Alimosho, Lagos), with each unit's name, INEC code and ward; each state's polling-units page now links to these lists by LGA.
Fixed
- Old-style election results links (without the office, e.g. /elections/2023/results/kebbi/...) now redirect permanently to the current page, so each result has one address and old links from search no longer show empty pages.
- Politician search titles keep the person's role (e.g. "Governor of Edo State"), and placeholder entries such as "Other candidates" are kept out of search results.
2026-10-20
Changed
- Every page now has a single web address (no trailing-slash duplicates or redirects), so search engines index the page itself instead of treating it as an alternate copy.
- Nigeria 2.0's election data is now published under the CC BY 4.0 licence (free reuse with attribution), shown in the site footer and the datasets' search metadata.
Fixed
- Dataset search metadata on results pages now includes a description and creator for every part, fixing Google rich-result errors.
- Politician profiles now show each person's current office from our governor, senator and House records (e.g. Monday Okpebholo is shown as Governor of Edo State, not a senator), and list governorships they have held.
2026-10-19
Added
- Added Google AdSense to the site (verification tag, ad script and ads.txt).
- New per-state pages: governors (current governor, deputy and every governor since 1999), senators with 2023 senatorial results, and registered voters by local government.
- New 2027 governorship election page for each state voting in 2027, with the incumbent, last election's candidates and results, and declared candidates as they come in.
- New States hub listing every state with links to its governors, senators, wards, LGAs, registered voters, results and 2027 race.
- Politician pages now state the political offices each person has held and contested.
- New Find Your Ward page: type a town, village, street or school name to see which ward, local government and state it is under, or use your location to find the wards nearest to you.
- Party pages now show each party's full name and national officers (chairman, secretary, treasurer), and every party now has its own page that search engines can find.
Changed
- Election results pages for each local government, ward and polling unit now load fully when opened directly or from search (they showed an error before); polling-unit pages are titled by the unit's name, ward and LGA.
- Search titles and descriptions tuned across the site (state pages, results, senators, House of Reps, parties, API), the site icon and app manifest now show the Nigeria 2.0 logo, and login-only pages are kept out of search results.
- The sitemap now lists every ward, local government, politician and party page (about 16,900 pages, up from 285), so search engines can find them directly; pages reachable under an old name now point to a single address.
- Ward pages are now titled by ward name, LGA and state (instead of a ward code), and politician pages now show their role, party and full profile to search engines.
- Ward, polling-unit and local-government directory pages now show the actual counts in their search titles and summaries (e.g. how many wards and polling units a state has), and each LGA page now ships its full ward list to search engines.
Fixed
- Map tooltips on state pages no longer trigger browser warnings.
- State pages load their election summary again (governor, senators, 2023 presidential result); a recent senators update had broken it for every state.
- The per-state ward directory pages (e.g. /wards/lagos) no longer show a blank page; they are now built for all 36 states and the FCT.
2026-10-03
Added
- Transcribed 2023 House of Representatives polling unit sheets for Kano State (8,472 polling units) and synced live candidate tallies.
2026-10-02
Added
- Transcribed 2023 House of Representatives polling unit sheets for Kaduna State (7,178 polling units) and synced live candidate tallies.
2026-10-01
Added
- Transcribed 2023 House of Representatives polling unit sheets for Jigawa State (3,990 polling units) and synced live candidate tallies.
- Documented the EC8A transcription pipeline, live database publishing, status tracking, and Fusion 360 system monitor in `AGENTS.md`.
2026-09-23
Added
- Transcribed 2023 House of Representatives polling unit sheets for Imo State (4,312 polling units) and synced live candidate tallies.
2026-09-22
Added
- Transcribed 2023 House of Representatives polling unit sheets for Gombe State (2,854 polling units) and synced live candidate tallies.
- Transcribed 2023 House of Representatives polling unit sheets for Fct State (1,243 polling units) and synced live candidate tallies.
2026-09-21
Added
- Transcribed 2023 House of Representatives polling unit sheets for Enugu State (3,857 polling units) and synced live candidate tallies.
- Transcribed 2023 House of Representatives polling unit sheets for Ekiti State (2,444 polling units) and synced live candidate tallies.
2026-09-20
Added
- Transcribed 2023 House of Representatives polling unit sheets for Edo State (3,580 polling units) and synced live candidate tallies.
- Transcribed 2023 House of Representatives polling unit sheets for Ebonyi State (2,834 polling units) and synced live candidate tallies.
All notable changes to Nigeria 2.0 (the site, the API, and the underlying data
pipeline) are recorded here. Newest first.
The format is one dated section per change-set. Each entry is a short,
user-facing sentence — what changed and why it matters — grouped under
Added, Changed, Fixed, Data, or Removed.
Rule for contributors (human and AI): every change to this repository must
add an entry to the top of this file, under a section for today's date. See
CLAUDE.md for the enforced wording.
2026-09-19
Added
- Resilient Local LM Auto-Pause & Health-Check Engine: Added automated downtime recovery to `transcribe_local.py`. When local LM Studio goes offline, crashes, or unloads the model, worker threads cleanly enter a 30-minute pause loop that re-tests every 30 minutes (with 15-second fast wake-up detection) without failing, skipping, or dropping in-flight sheets.
- Constituency LGA Matching Enhancement: Enhanced `resolve_constituency` in `backend/scripts/publish_single_sheet.py` to match cleaned slugs against `constituencies_lga_map.json` and prevent generic direction words (e.g. "South") from false-matching compound LGA names (e.g. "Oshimili South").
- 100% Linkage of 2023 House of Representatives Members to Politician Profiles: Linked all 209 members of the 10th House of Representatives to their dedicated politician profile pages (`/politician/$id`), matching 68 re-elected incumbents with their multi-election career history (2019/2023) and generating clean profiles with 2023 victory records (`party_history`) for the remaining 141 representatives.
- Streaming Live Per-Sheet Pipeline & Federal Constituency Politician Vote Assignment: Implemented immediate real-time database publishing and live politician vote assignment for 2023 House of Representatives EC8A transcriptions (`backend/scripts/publish_single_sheet.py`), accompanied by `backend/app/data/constituencies_lga_map.json` mapping LGAs to their respective Federal Constituencies. Live-synced 188 initial Cross River State polling unit results and assigned candidate vote tallies.
Data
- 100% Completed 2023 House of Representatives Transcription for Delta State: Transcribed all 3,966 polling unit EC8A sheets across all 25 LGAs of Delta State using local Qwen 3.5 9B vision inference with zero failures, publishing results live to PostgreSQL, updating verified votes for all 10 Federal Constituency politicians in real time, and mirroring 100% of JSON transcriptions to backup storage (`E:\Data`).
- 100% Completed 2023 House of Representatives Transcription for Cross River State: Transcribed all 3,187 polling unit EC8A sheets across all 18 LGAs of Cross River State using local Qwen 3.5 9B vision inference with zero failures, streaming results live into PostgreSQL, updating all 8 Federal Constituency politicians in real time, and mirroring 100% of JSON records to backup storage.
- Live Deployment of 2023 House of Representatives Polling Unit Results (8 States): Ingested and deployed definitive 2023 House of Representatives election results across 25,550 polling units and 459,900 party breakdown records into the live database for Abia, Adamawa, Akwa Ibom, Anambra, Bauchi, Bayelsa, Benue, and Borno, including automated confidence scoring and official rollups across 1,684 wards and 164 LGAs.
2026-09-18
Data
- Transcribed 2023 House of Representatives EC8A Polling Unit Scans for 8 States: Completed machine-readable JSON transcription for 30,794 polling units across Abia (3,541), Adamawa (3,943), Akwa Ibom (3,189), Anambra (4,481), Bauchi (5,302), Bayelsa (495), Benue (4,910), and Borno (4,939), completing Borno's final 3,220 sheets with 100% precision using local Qwen 3.5 9B vision inference at zero external cost.
2026-09-11
Added
- Senator Demographics & Sorting by Votes Pulled: Researched and completed verified age and gender data for all 109 senators online, updated the database seeder and backend API, and sorted the `/senators` page by 2023 votes pulled with Senate President Godswill Akpabio placed first (#1), complete with interactive column sorting.
- 2019 Senate election results on `/senators`: Added a dedicated 2019 Votes column displaying certified INEC election results for all 109 senatorial districts alongside the sitting 10th National Assembly roster, featuring tags for returning incumbents and historical predecessor results for seats that turned over.
- 2019 Senate election dataset & seed: Compiled official INEC senatorial collation data into `senate_2019.json` and added `seed_senate_2019()` to ingest the full 2019 senatorial election results into candidate party history.
Data
- Complete 10th Senate demographics: Verified birth dates, ages, and genders for all 109 senators in `senators_data.py` and synced them into the database.
- Complete 2023 Senate verified results dataset (`senate_2023_verified.jsonl`): Researched, verified, and compiled certified INEC Form EC8E declarations, returning officer announcements, and election tribunal judgments for all 109 senatorial districts across all 36 states and the FCT, populating certified vote tallies for winners and runners-up.
- Updated 2023 Senate election data & seed: Enriched `senate_2023.json` and updated `seed_senate_2023()` to sync verified candidate votes and positions into `PartyHistory` and `LegislativeResult`.
Changed
- Expanded orientation notes in `read_me_before_coding.md` with hard-learned developer and deployment gotchas covering the multi-repo Git setup, Coolify vs. S3/CloudFront pipelines, build order dependencies, Windows IPv6 DNS flags, and prerender crawl behaviors.
2026-09-10
Added
- Dedicated state ward and polling unit directories at `/states/[state]/wards` and `/states/[state]/polling-units`, directly answering essential queries including ward counts, polling unit totals, and 2023 election winners across every LGA in the state.
- Instant-answer summary callout boxes and Schema.org FAQPage structured data for search engines and voters looking up ward counts, polling unit totals, and past election results by state, LGA, and ward.
2026-07-26
Changed
- The **Evidence table at the bottom of a page now only lists the race you are
looking at**. Previously a state's presidential tab showed governorship and senate
evidence too, and LGA and ward pages — which only ever show presidential results —
listed evidence for races that appeared nowhere on the page.
- State results pages now open on the presidential race and let you switch
between presidential, governorship, senate and House with tabs at the top,
instead of scrolling past the governorship to reach anything else. Links to a
specific race (ending `#senate`, for example) still open on that race.
- Results are now built from confidence scores rather than a fixed source order.
Where several readings of the same polling unit disagree, we now take the one we
trust most instead of always preferring the machine reading. Hand-crosschecked
transcriptions rank highest, then clean machine readings, then readings either
source flagged as unsure. Anything a penalty rule has knocked below 50 is no longer
used as a unit's result at all — the next-best reading is used instead.
- Ward, LGA and state totals now only count polling units we are confident in
(a score of 80 or more). Units whose only reading is flagged unsure are shown on
their own page but left out of the totals above them, so an uncertain reading can
no longer quietly move a state result. This lowers some totals against previous
figures: the units are still there, but they are no longer counted until we have a
better reading of them.
Added
- Confidence scores are now penalised for obvious misreads, and hovering a
confidence badge on a polling-unit page lists exactly what was deducted and why.
Four rules so far on 2023 presidential readings: (1) −50 where a minor party
(not APC/LP/PDP/NNPP) is recorded with more than 2,000 votes; (2) −50 where APC, PDP
and LP all read 0 while two or more minor parties each score over 100 (a mis-aligned
sheet); (3) −55 where accredited voters read above 1,500 — more than twice the legal
maximum for a polling unit; (4) −55 where the total votes exceed the unit's registered
voters, which cannot happen.
Data
- Loaded the full 2023 crosschecked presidential dataset as evidence — **163,150
polling units** across all 37 states now carry an independent "2023 transcription"
reading alongside the LLM one (previously only ~3,900). Each is scored for
confidence: 90 for crosschecked units, 70 for units flagged unsure.
Added
- Each transcription in a polling unit's Evidence table now shows its own
confidence score, so you can see how much to trust each individual reading
(not just the merged result).
Changed
- Faster deploys. The site build now prerenders pages in parallel (concurrency)
with automatic retry on transient network blips — full builds dropped from several
minutes to ~1.5 minutes and no longer fail on a single flaky fetch. Deploys now
upload only the files that actually changed and invalidate only those paths, instead
of re-pushing everything and clearing the whole CDN cache.
Added
- The ward polling-unit list now shows a Confidence column, so you can see each
unit's 0–100 sheet-quality score alongside its votes.
Changed
- Results pages now say "Estimated Results" throughout (headings, breadcrumbs and
captions), making clear these are our estimates transcribed from INEC result sheets,
not official declared figures.
- The "Declared" evidence badge is now labelled "Online Reports" to reflect
what those figures actually are.
- The changelog page now uses a smaller, more compact font.
Added
- Each polling-unit result now carries a confidence score (0–100), shown top-right
of the result. The first signal is the quality of the INEC result sheet the figure
came from: a missing sheet location, a blurry/illegible scan, or an auto-voided
inflated misread scores low; a clean sheet scores high.
- Ward, LGA and state totals now exclude low-confidence polling units (score below
80) from the roll-up. Those units still appear on their own page — they just don't
count toward the aggregate — so the published totals lean on trustworthy sheets.
Fixed
- The evidence table on a polling-unit page no longer hides parties outside the
four national ones. It now shows a column for any party with a recorded vote in
the evidence, so a local winner (e.g. BP with 247 votes) is visible instead of
looking like the evidence disagreed with the result above it.
Added
- New Changelog page (`/changelog`) rendering this file, plus a repository
rule that every change must record an entry here.
- Ward result tables now show an extra column for any party that **won at least
one polling unit** in the ward, so locally significant parties (e.g. BP in
Aba North) are no longer hidden behind the fixed APC/LP/PDP/NNPP columns.
- Accredited-voter figures now appear per polling unit on ward pages, sourced
from the transcribed EC8A evidence (previously shown only for the handful of
flagged "problem" units).
Changed
- Polling-unit pages now group each election's **result sheet(s) and evidence
directly under that election's result**, with the sheet links at the bottom of
each election's block — instead of pooling all sheets and evidence at the
bottom of the page.
- Result-sheet links are now served from the `pu_sheets` table (all 37 states),
so sheets appear on every polling-unit page, not just Akwa Ibom and Adamawa.
Removed
- Dropped the redundant legacy `election_sheets` table (and its CSV loader),
which only ever covered Akwa Ibom and Adamawa. All sheet data now lives in the
single `pu_sheets` table.