{
  "story": "unmeasured-air",
  "title": "The Air Nobody Measures",
  "built": "2026-09-17",
  "built_by": "scripts/build-unmeasured-air.py",
  "credit": "A Code for Africa story, built on sensors.AFRICA open data.",
  "layers": [
    {
      "file": "air.json",
      "name": "sensors.AFRICA air quality archive, 20 city datasets",
      "publisher": "sensors.AFRICA (incubated by Code for Africa), via openAFRICA",
      "url": "https://open.africa/organization/sensors-africa",
      "landing": "https://open.africa/dataset?q=sensorsafrica-airquality-archive",
      "method": "Semicolon CSV of raw sensor readings, one row per reading. The quality filter drops PM2.5 outside 0 to 1000, flatlines of six or more identical hours, and hours where the node reported humidity above 85 per cent. An annual mean counts as valid only where nine months each have a filtered reading on 75 per cent of their days. The archive build applies that rule to raw days; scripts/build-unmeasured-air.py reapplies it to filtered days, the days the mean is taken over, and that changes Nakuru 2023 from valid to partial and Abuja 2023 from valid to partial. Built by scripts/build-sensors-africa.py, 17 September 2026.",
      "license": "The openAFRICA dataset pages show the licence field as 'Creative Commons Attribution', linked to opendefinition.org/licenses/cc-by, with no version number (read on the Nairobi dataset page, 2026-10-04). The 4.0 comes from the openAFRICA site footer, which says Code for Africa content on the site is released under a Creative Commons 4.0 International License. The CKAN catalogue records CC BY for Nairobi, Accra, Nakuru, Abuja, Kumasi, Meru, Dar es Salaam, Kisumu, Addis Ababa and the Lagos datasets. The licence field is not stated for Kano, Gezawa-Kano, Lusaka, Akure and EFAB-Met-Abuja. Documented, not gating: those cities are used and the gap is stated here and in the story.",
      "accessed": "2026-09-17",
      "published": "2026",
      "note": "Two of the twenty datasets include a BAM 1020 reference instrument rather than a low-cost board: Accra sensor 1495 and Addis Ababa sensor 1503. Both are excluded from the citizen-sensor figures and named in the chapter 12 note."
    },
    {
      "file": "air.json",
      "name": "sensors.AFRICA network description and hardware",
      "publisher": "Code for Africa",
      "url": "https://sensors.africa/about",
      "landing": "https://sensors.africa/air/how-sensors-work",
      "method": "Project pages naming SDS011, PMS5003 and DHT22 hardware.",
      "license": "Not stated",
      "accessed": "2026-09-17",
      "published": "",
      "note": "Network start date, total sensors deployed and any stated reason for node attrition could not be verified from a primary source."
    },
    {
      "file": "wind.json",
      "name": "Near-surface wind field, January and July monthly means",
      "publisher": "NOAA Physical Sciences Laboratory",
      "url": "https://psl.noaa.gov/data/gridded/data.ncep.reanalysis.html",
      "method": "NCEP/NCAR Reanalysis 1 long-term monthly means at sigma 0.995, base period 1991 to 2020, read on the native 2.5 degree grid and written out at 5 degrees. Only January and July are written: the chapter shows the harmattan and the monsoon reversal and nothing else. Built by scripts/build-unmeasured-air-wind.py.",
      "license": "PSL dataset metadata records \"Usage Restrictions: None\"",
      "accessed": "2026-09-17",
      "published": "",
      "note": "Chapter 4 quotes two kinds of figure from this file: the mean over the Sahel box the legend names, and the value at the nearest 2.5 degree grid point to Kano and to Nairobi."
    },
    {
      "file": "/data/provenance/air-sensors/<city>.geojson",
      "name": "sensors.AFRICA board positions, for the city map overlay",
      "publisher": "Code for Africa / sensors.AFRICA, via openAFRICA",
      "url": "https://open.africa",
      "method": "Board coordinates and their days-weighted mean PM2.5, merged from nairobi_sites.csv, nodes.csv and pm25_node_annual.csv on sensor_id. Built by scripts/build-air-sensor-points.py. The dots use fixed WHO breaks (5, 10, 15, 25, 35) rather than the map's per-city quantiles, so a colour means the same thing in every city.",
      "license": "As the archive layer above",
      "accessed": "2026-09-17",
      "published": "",
      "note": "Nairobi, Lagos, Accra and Dar es Salaam. A neighbourhood with no dot is unmeasured, not clean, and the map key says so."
    },
    {
      "file": "climate.json",
      "name": "Africa heat, Sahel rain and dust, with the verified claims the chapter prints",
      "publisher": "NOAA NCEI, NOAA PSL with the University of Washington JISAO, and the IPCC, WMO and journal sources named under cited_in_text",
      "url": "https://www.ncei.noaa.gov/access/monitoring/climate-at-a-glance/global/time-series/africa/land/tavg/12/12/1910-2026",
      "method": "Africa land surface temperature departures from the 1901 to 2000 mean (annual, 1910 to 2025), the Sahel June to October rainfall index as a z-score against 1901 to 2017 (the source units conflict, so no millimetres are published), the dust periods parsed out of the exact quotes of two verified claims, and Nigeria gas flaring volumes. Every sentence that states a finding in chapters 6 and 11 is one of the claims in the file's facts list, which carries the source, page or section and the quoted wording. Built by scripts/build-unmeasured-air-climate.py.",
      "license": "NOAA NCEI: not stated in the file header (US Government work, publicly available). NOAA PSL: none stated beyond a request to cite DOI 10.6069/H5MW2F2Q. Documented, not gating.",
      "accessed": "2026-10-03",
      "published": "",
      "note": "The WMO and NOAA temperature baselines differ (1991 to 2020 against 1901 to 2000), so the page prints both without putting them on one axis. The page makes no claim that climate change makes the harmattan dustier: the rainfall index and the dust reconstruction are separate records, and the IPCC states low confidence in any quantitative estimate of how dust will respond."
    },
    {
      "file": "emitters.json",
      "name": "The 2,000 largest located emitting facilities, 2024, with per-person CO2",
      "publisher": "Climate TRACE; Global Carbon Project (Global Carbon Budget 2023), per-person values as processed by Our World in Data; World Bank country classification",
      "url": "https://climatetrace.org/data",
      "method": "Facility tonnes are CO2e for 2024 from Climate TRACE emitting-facility data (release not recorded), and the shares are shares of the 2,000 largest located facilities, the smallest of which is 3.1 Mt CO2e, not shares of all emissions: road transport, farming and land use are not in the file. Distances are great-circle from each city position to each facility. Per-person values are CO2 only for 2022 and do not sit on one scale with the CO2e facility tonnes. Built by scripts/build-unmeasured-air-emitters.py.",
      "license": "Climate TRACE: CC BY 4.0 on the data page and the terms page, with exceptions the terms page lists (country-level estimates taken from EDGAR and FAOSTAT, some source-level data from E-PRTR and US EPA FLIGHT). Global Carbon Budget 2023 national dataset: ICOS CCBY4 Data Licence, citing the original data sources. Our World in Data processing: CC BY. World Bank country classification: CC BY 4.0.",
      "accessed": "2026-10-03",
      "published": "2024",
      "note": "164 of the 389 fossil-fuel rows are named as a basin or field aggregate drawn at one point, so a distance to one is a distance to that point and not to a single plant. Two rows the chapter names are such aggregates: the Côte d'Ivoire basin deepwater fields off Ghana (4.65 Mt) and the LNG operations of Mozambique's Rovuma basin (3.34 Mt). The Rovuma row is a basin total: Eni, the operator of Area 4, says Coral South FLNG has shipped LNG from the Rovuma Basin since November 2022. The row keyed lusaka is the Mpika board."
    }
  ],
  "cited_in_text": [
    {
      "id": "who-db",
      "title": "WHO Ambient Air Quality Database V8.0",
      "publisher": "World Health Organization",
      "published": "2026-06-30",
      "url": "https://cdn.who.int/media/docs/default-source/air-pollution-documents/air-quality-and-health/who-ambient-air-quality-database-version-2026-v8.xlsx",
      "landing": "https://www.who.int/data/gho/data/themes/air-pollution/who-air-quality-database",
      "accessed": "2026-09-17",
      "license": "WHO data, free use with attribution",
      "note": "8,023 settlements in 127 member states, 2010 to 2024. Of the ten cities here only Nairobi (2021, 13.13, one urban station, 38 per cent temporal coverage), Addis Ababa (2016 to 2019, 20.5 to 29.7) and Lagos (2010, 27.4, in V6.1) have a PM2.5 value. Accra has PM10 only. The other six have no row. V6.1 at https://cdn.who.int/media/docs/default-source/air-pollution-documents/air-quality-and-health/who_ambient_air_quality_database_version_2024_(v6.1).xlsx cross-checked."
    },
    {
      "id": "who-guideline",
      "title": "WHO global air quality guidelines 2021",
      "publisher": "World Health Organization",
      "published": "2021-09-22",
      "url": "https://www.who.int/publications/i/item/9789240034228",
      "accessed": "2026-09-17",
      "license": "WHO publication",
      "note": "Annual mean 5 and 24-hour mean 15 ug/m3, ISBN 9789240034228. The two values could not be read from a WHO page directly and are corroborated from three peer-reviewed articles."
    },
    {
      "id": "accra-gravimetric",
      "title": "Spatial-temporal patterns of ambient fine particulate matter (PM2.5) and black carbon (BC) pollution in Accra",
      "publisher": "Environmental Research Letters",
      "published": "2021",
      "url": "https://iopscience.iop.org/article/10.1088/1748-9326/ac074a",
      "accessed": "2026-09-17",
      "license": "CC BY 4.0",
      "note": "A mean of 37 ug/m3 across its ten year-long sites, with a standard deviation of 40 that is not a second mean. Harmattan mean 89 against 23 non-Harmattan. Jamestown 40, East Legon 34, against 71 in 2006 and 2007. DOI 10.1088/1748-9326/ac074a."
    },
    {
      "id": "estl-fusion",
      "title": "East African City Centers Show Lower PM2.5 Levels than Their Suburbs",
      "publisher": "Environmental Science and Technology Letters",
      "published": "2025",
      "url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC12424180/",
      "accessed": "2026-09-17",
      "license": "Open access",
      "note": "Nairobi 21.7, Dar es Salaam 33.1, Kampala 31.4, 2019 to 2023. Methods: \"reference-grade data were unavailable for Dar es Salaam\". DOI 10.1021/acs.estlett.5c00451."
    },
    {
      "id": "nsps-purpleair",
      "title": "Investigation of particulate matter Air Quality Index (AQI) and risk assessment in some locations in Nigeria",
      "publisher": "Journal of the Nigerian Society of Physical Sciences",
      "published": "2024",
      "url": "https://journal.nsps.org.ng/index.php/jnsps/article/download/2120/337",
      "accessed": "2026-09-17",
      "license": "CC BY",
      "note": "Abuja 40.81 and Lagos 37.39, 1 May 2021 to 30 April 2023. DOI 10.46481/jnsps.2024.2120."
    },
    {
      "id": "uganda-correction",
      "title": "Calibration of low-cost sensor data for ambient PM2.5 monitoring across urban and rural settings in South Central Uganda",
      "publisher": "Atmospheric Pollution Research",
      "published": "2025",
      "url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC12671985/",
      "accessed": "2026-09-17",
      "license": "Open access",
      "note": "PM2.5 = 2.9271 + 0.4994 * PA_cf1 - 0.0675 * RH. DOI 10.1016/j.apr.2025.102580. Used here only to show that it moves these cities away from their anchors, not to correct the series."
    },
    {
      "id": "nakuru-network",
      "title": "Air quality sensors in a rapidly growing Kenyan city are improving health",
      "publisher": "Stockholm Environment Institute",
      "published": "2021",
      "url": "https://www.sei.org/features/air-quality-sensors-kenya-city-improving-health/",
      "accessed": "2026-09-17",
      "license": "SEI publication",
      "note": "Confirms four PurpleAir PA-II-SD sensors deployed across Nakuru municipality (County Environment Department HQ, Westside Mall, County Water and Sewage Company, Nyayo Gardens). No city-wide annual mean is published, so this story cites the deployment, not a value."
    },
    {
      "id": "lusaka-network",
      "title": "CEEEZ - Parirenyatwa Rd, Lusaka, Zambia",
      "publisher": "Centre for Energy, Environment and Engineering Zambia, via aqicn.org",
      "published": "",
      "url": "https://aqicn.org/station/@229753/",
      "accessed": "2026-09-17",
      "license": "Station feed, not a peer-reviewed source",
      "note": "One CEEEZ-operated station in Lusaka feeding aqicn.org, labelled in the story 'station feed via aqicn.org, offline at access' because the feed is currently not available there. No primary CEEEZ page was found: ceeez.org and ceeez.org.zm did not resolve from the research machine on 2026-10-04, and aqicn.org's network page for Zambia CEEEZ is the only record that CEEEZ provides the feed. No peer-reviewed annual mean is published, so this story cites the station, not a value."
    },
    {
      "id": "martin-density",
      "title": "No one knows which city has the highest concentration of fine particulate matter",
      "publisher": "Atmospheric Environment: X",
      "published": "2019",
      "url": "https://www.sciencedirect.com/science/article/pii/S2590162119300437",
      "accessed": "2026-09-17",
      "license": "CC BY",
      "note": "A 2019 study found that 24 of 234 countries had more than 3 PM2.5 monitors per million people, that 141 had no regular PM2.5 monitoring at all, and that the global mean population distance to the nearest monitor was 220 km."
    },
    {
      "id": "who-deaths",
      "title": "Ambient (outdoor) air quality and health fact sheet",
      "publisher": "World Health Organization",
      "published": "",
      "url": "https://www.who.int/news-room/fact-sheets/detail/ambient-(outdoor)-air-quality-and-health",
      "accessed": "2026-09-17",
      "license": "WHO publication",
      "note": "Ambient air pollution caused 4.2 million premature deaths worldwide in 2019."
    },
    {
      "id": "soga-africa",
      "title": "The State of Air Quality and Health Impacts in Africa",
      "publisher": "Health Effects Institute, State of Global Air",
      "published": "2022",
      "url": "https://www.stateofglobalair.org/sites/default/files/documents/2022-10/soga-africa-report.pdf",
      "landing": "https://www.stateofglobalair.org/resources/africa",
      "accessed": "2026-09-17",
      "license": "Free use with attribution",
      "note": "1.1 million deaths across the whole of Africa in 2019 from all air pollution, household, ambient particulate and ozone together (report page 3). For sub-Saharan Africa the rate was 155 deaths per 100,000 as of 2019, against 85.6 worldwide (page 8). Not the same scope as the WHO 4.2 million, which is ambient only, and chapter 10 says so."
    },
    {
      "id": "s5p-no2",
      "title": "Sentinel-5P OFFL NO2: Offline Nitrogen Dioxide (L3), 2023 annual mean",
      "publisher": "European Union / ESA / Copernicus, via Google Earth Engine",
      "published": "",
      "url": "https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S5P_OFFL_L3_NO2",
      "accessed": "2026-09-17",
      "license": "Copernicus Sentinel data terms, free and open with attribution",
      "note": "TROPOMI tropospheric NO2 column, averaged over 2023 and taken to the 17 Nairobi constituency polygons as a population-weighted mean of 0.0009 degree cells, in micromol/m2, by scripts/build-polygon-no2.py. A column over the whole atmosphere above a place, not what anyone breathes at street level."
    },
    {
      "id": "osm",
      "title": "OpenStreetMap, through the Overpass API",
      "publisher": "OpenStreetMap contributors",
      "published": "2026",
      "url": "https://www.openstreetmap.org/copyright",
      "accessed": "2026-09-17",
      "license": "ODbL 1.0",
      "note": "Settlement and road geometry behind the Nairobi site analysis whose negative result chapter 8 reports."
    },
    {
      "id": "nairobi-geo",
      "title": "Nairobi constituency polygons",
      "publisher": "Unequal World provenance register",
      "published": "",
      "url": "/data/provenance/geo/nairobi.geojson",
      "accessed": "2026-09-17",
      "license": "As recorded in the provenance register",
      "note": "The 17 polygons drawn behind the Nairobi site map."
    },
    {
      "id": "nairobi-burden",
      "title": "Nairobi exposome burden by constituency",
      "publisher": "Unequal World provenance register",
      "published": "",
      "url": "/data/provenance/geo/nairobi-burden.geojson",
      "accessed": "2026-09-17",
      "license": "As recorded in the provenance register",
      "note": "The burden score and its wealth, air and green components on the same 17 polygons, cut from the 100 m grid by scripts/build-burden-poly.py. Embakasi North has no score, because its wealth input rests on a poverty figure with no source. Chapter 8 reads it to ask where the network went, never to estimate what anyone breathed."
    },
    {
      "id": "cra-fact-sheets",
      "title": "Kenya County Fact Sheets 2022",
      "publisher": "Commission on Revenue Allocation",
      "published": "2022",
      "url": "https://cra.go.ke/wp-content/uploads/2022/06/Kenya-County-fact-sheets-Report-Final-Res.pdf",
      "accessed": "2026-09-17",
      "license": "No licence statement in the report",
      "note": "Poverty incidence by constituency, from the map the report labels \"Poverty Levels 2019 (%)\". The report does not state how the figure was produced. Stored in the atlas as 100 minus the headcount rate, so a higher number is a better-off constituency. Embakasi North is left out of the poverty ranking: the report prints 97.5 for it, the same figure as its electricity access, and no other primary source gives a value."
    },
    {
      "id": "ncep-reanalysis",
      "title": "NCEP/NCAR Reanalysis 1, long-term monthly means of near-surface wind (sigma 0.995), base period 1991 to 2020",
      "publisher": "NOAA Physical Sciences Laboratory, Boulder, Colorado",
      "published": "1996",
      "url": "https://psl.noaa.gov/data/gridded/data.ncep.reanalysis.html",
      "accessed": "2026-09-17",
      "license": "PSL dataset metadata records \"Usage Restrictions: None\"",
      "note": "The wind field drawn on the globe in chapter 4, written to wind.json by scripts/build-unmeasured-air-wind.py. The sigma 0.995 pair is used rather than the Gaussian 10 m pair, whose speeds are about half and draw a field too quiet to read. The PSL web page text says 1981 to 2010; the files have climo_period 1991/01/01 to 2020/12/31, and the files are what is read and cited."
    },
    {
      "id": "marticorena-dust",
      "title": "Temporal variability of mineral dust concentrations over West Africa: analyses of a pluriannual monitoring from the AMMA Sahelian Dust Transect",
      "publisher": "Atmospheric Chemistry and Physics",
      "published": "2010",
      "url": "https://doi.org/10.5194/acp-10-8899-2010",
      "accessed": "2026-09-17",
      "license": "CC BY 3.0",
      "note": "Cited in chapter 4 for the harmattan dust season itself. Nothing in this story measures dust; the chapter shows the wind that carries it and says so."
    },
    {
      "id": "countries-110m",
      "title": "Natural Earth 1:110m admin 0 countries, TopoJSON build",
      "publisher": "Natural Earth",
      "published": "",
      "url": "https://www.naturalearthdata.com/about/terms-of-use/",
      "accessed": "2026-09-17",
      "license": "Public domain",
      "note": "Country outlines behind the city map, from public/data/geo/countries-110m.json, already in this repository."
    },
    {
      "id": "noaa-ncei-africa-temp",
      "title": "Climate at a Glance, Global Time Series: Africa land surface temperature, annual",
      "publisher": "NOAA National Centers for Environmental Information",
      "published": "2025",
      "url": "https://www.ncei.noaa.gov/access/monitoring/climate-at-a-glance/global/time-series/africa/land/tavg/12/12/1910-2026",
      "accessed": "2026-10-03",
      "license": "Not stated in the file header: US Government work, publicly available. Documented, not gating.",
      "note": "Departures from the 1901 to 2000 mean, 1910 to 2025, read from the data CSV. The figures in chapter 6 (the 2010s mean, the hottest year, the stripes) are computed from it in scripts/build-unmeasured-air-climate.py."
    },
    {
      "id": "noaa-psl-sahel-rain",
      "title": "Sahel Rainfall Index, monthly, 1901 to 2017 (dataset DOI 10.6069/H5MW2F2Q)",
      "publisher": "NOAA Physical Sciences Laboratory, from the University of Washington JISAO",
      "published": "",
      "url": "https://psl.noaa.gov/data/timeseries/month/SAHELRAIN/",
      "accessed": "2026-10-03",
      "license": "None stated beyond the request to cite the DOI",
      "note": "The June to October mean as a z-score against 1901 to 2017. The source carries conflicting unit labels, so only the standardised value is published and no millimetre figure is printed. Chapter 6 names the driest run of decades from it."
    },
    {
      "id": "evan-2016-dust",
      "title": "The past, present and future of African dust",
      "publisher": "Nature 531, 493-495 (Evan, Flamant, Gaetani, Guichard)",
      "published": "2016",
      "url": "https://doi.org/10.1038/nature17149",
      "accessed": "2026-10-03",
      "license": "Nature article, abstract read through the Europe PMC record; terms not checked",
      "note": "Supports the 1851 to 2011 dust reconstruction: highest dust in the 1910s to 1940s and the 1970s to 1980s, low dust in the 1860s, 1950s and 2000s (verified claim F05). Its projection of a fall in dust over the twenty-first century (F06) is not used in the story."
    },
    {
      "id": "ipcc-ar6-wg2-ch9",
      "title": "Climate Change 2022: Impacts, Adaptation and Vulnerability, Chapter 9 Africa",
      "publisher": "IPCC AR6 Working Group II",
      "published": "2022",
      "url": "https://www.ipcc.ch/report/ar6/wg2/downloads/report/IPCC_AR6_WGII_Chapter09.pdf",
      "accessed": "2026-10-03",
      "license": "Not stated in the extract read (2026-10-04); IPCC publication.",
      "note": "Verified claims F01, F02, F03, F08 (North African dust fell 1984 to 2012, citing Shao et al., 2013), F09 (meningitis and the harmattan), F12, F13, F14 and F20. F01 now stores the whole p.1325 sentence, which attributes the 1960s to 1980s West African rainfall decline to a combination of anthropogenic aerosols and greenhouse gases emitted between the 1950s and 1980s. Section numbers and quoted wording are in the facts list of climate.json."
    },
    {
      "id": "ipcc-ar6-wg1-ch6",
      "title": "Climate Change 2021: The Physical Science Basis, Chapter 6 Short-lived Climate Forcers",
      "publisher": "IPCC AR6 Working Group I",
      "published": "2021",
      "url": "https://www.ipcc.ch/report/ar6/wg1/downloads/report/IPCC_AR6_WGI_Chapter06.pdf",
      "accessed": "2026-10-03",
      "license": "IPCC publication, terms not checked",
      "note": "Verified claim F07, the low confidence in any quantitative estimate of how dust emissions will respond to climate change, and F16, the residential sector as the most important source of PM exposure in Southern Asia and Africa."
    },
    {
      "id": "ipcc-ar6-wg1-africa-factsheet",
      "title": "IPCC AR6 WGI Regional Fact Sheet: Africa",
      "publisher": "IPCC AR6 Working Group I",
      "published": "2021",
      "url": "https://www.ipcc.ch/report/ar6/wg1/downloads/factsheets/IPCC_AR6_WGI_Regional_Fact_Sheet_Africa.pdf",
      "accessed": "2026-10-03",
      "license": "IPCC publication, terms not checked",
      "note": "Verified claim F10, that surface temperature in Africa has generally risen faster than the global average (page 1)."
    },
    {
      "id": "wmo-africa-2024",
      "title": "State of the Climate in Africa 2024 (WMO-No. 1370)",
      "publisher": "World Meteorological Organization",
      "published": "2025",
      "url": "https://wmo.int/sites/default/files/2025-05/Africa_2024final1.pdf",
      "accessed": "2026-10-03",
      "license": "WMO publication, terms not checked",
      "note": "Verified claim F11, 2024 as the warmest or second warmest year on record. The WMO baseline is 1991 to 2020 and the NOAA series is against 1901 to 2000, so the two figures are printed in separate sentences and never on one axis."
    },
    {
      "id": "mostefaoui-2024",
      "title": "Greenhouse gas emissions and their trends over the last 3 decades across Africa",
      "publisher": "Earth System Science Data 16, 245-275 (Mostefaoui et al.)",
      "published": "2024",
      "url": "https://doi.org/10.5194/essd-16-245-2024",
      "accessed": "2026-10-03",
      "license": "Journal article, abstract read; terms not checked",
      "note": "Verified claim F19, African fossil CO2 averaging 1,373 Mt a year over 2010 to 2018, 4 per cent of the global total."
    },
    {
      "id": "vanderwerf-2017",
      "title": "Global fire emissions estimates during 1997-2016 (GFED4s)",
      "publisher": "Earth System Science Data 9, 697-720 (van der Werf et al.)",
      "published": "2017",
      "url": "https://doi.org/10.5194/essd-9-697-2017",
      "accessed": "2026-10-03",
      "license": "Creative Commons Attribution 3.0, as the journal page states it",
      "note": "Verified claim F18: the two Africa rows of Table 3 (northern 451 and southern 669 Tg of carbon a year) sum to 1,120 Tg C a year over 1997 to 2016. The share of the global 2,160 Tg C, 51.9 per cent, is this page's sum of Table 3 and is not printed in the paper. The figure is carbon, not CO2e. Savanna fires are 88.3 and 92.4 per cent of the two Africa rows (Table 3). The paper (section 4.4, printed p.711) says fire emissions are not generally a net CO2 source, because regrowing vegetation in many burned areas takes up a roughly equivalent amount over years to decades. That passage is stored as quote_2 of F18 in climate.json. The paper does not use the word gross, and the story does not either."
    },
    {
      "id": "climate-trace-facilities-2024",
      "title": "Climate TRACE emitting-facility data, 2024, CO2e on a 100-year basis",
      "publisher": "Climate TRACE",
      "published": "2024 data",
      "url": "https://climatetrace.org/data",
      "accessed": "2026-10-04",
      "license": "CC BY 4.0 (data page and terms page), with exceptions the terms page lists for EDGAR, FAOSTAT, E-PRTR and US EPA FLIGHT source data",
      "note": "The 2,000 largest located facilities, as held in public/data/emissions/global-sources.json; the smallest of the 2,000 is 3.1 Mt CO2e (the source file's own floor is 0.5 Mt, and the 2,000 cut is what applies). The data release is not recorded: the project file labels itself 'v7', which is the Climate TRACE API version and not a numbered data release, and the file was in the repository by 3 September 2026. Climate TRACE's data page on 2026-10-04 shows release 5.11.0 (24 September 2026), which is not necessarily the one used. Road transport, farming and land use are not in the file, and the climate gases it counts are separate from the PM2.5 the story measures."
    },
    {
      "id": "gcp-2023-national-co2",
      "title": "Global Carbon Budget 2023: national fossil CO2 emissions (production-based), per person for 2022",
      "publisher": "Global Carbon Project, hosted by the ICOS Carbon Portal; per-person values processed by Our World in Data",
      "published": "2023",
      "url": "https://meta.icos-cp.eu/objects/_9U_AMxuaV1EtI58ZJlOguF9",
      "accessed": "2026-10-04",
      "license": "ICOS CCBY4 Data Licence (page label; the page is script-rendered, so confirm by eye once); the paper is CC BY 4.0. Our World in Data processing: CC BY.",
      "note": "Tonnes of CO2 per person for 2022, production-based (territorial). The values in public/data/emissions/consumption-emissions.json were processed by Our World in Data from the Global Carbon Budget 2023 data (file owid-co2-data.csv), so the story cites the Global Carbon Project dataset and paper as the origin and names Our World in Data as the processor. Our World in Data's live per-person page now draws on the 2025 edition, so recent values there can differ. Carbon dioxide only, so it is not on one scale with the CO2e facility tonnes.",
      "dataset_doi": "https://doi.org/10.18160/GCP-2023",
      "paper": "Friedlingstein et al., Global Carbon Budget 2023, Earth System Science Data 15, 5301-5369, https://doi.org/10.5194/essd-15-5301-2023",
      "processed_by_url": "https://ourworldindata.org/grapher/co-emissions-per-capita"
    },
    {
      "id": "worldbank-ggfr",
      "title": "Global Gas Flaring Tracker data, flare volume, Nigeria",
      "publisher": "World Bank Global Gas Flaring Reduction Partnership",
      "published": "2026",
      "url": "https://www.worldbank.org/en/programs/gasflaringreduction/global-flaring-data",
      "accessed": "2026-10-03",
      "license": "The GFMR data page (read 2026-10-04) states no licence for the 2012 to 2025 files and carries a disclaimer about errors and omissions. The World Bank Data Catalog entry for the Global Gas Flaring Database (metadata last updated 18 January 2023) states Creative Commons Attribution 4.0 and does not show whether it covers the 2025 files. Documented, not gating.",
      "note": "Nigeria flare volume in billion cubic metres, 2012 to 2025, satellite-derived (VIIRS). Attribution line on the page: NOAA, the Payne Institute at the Colorado School of Mines, World Bank/GFMR. Chapter 11 prints 2025 against 2012 and the 2023 low."
    },
    {
      "id": "eni-coral-south-2025",
      "title": "Eni celebrates the 100th cargo of LNG from Coral South FLNG, Rovuma Basin, Mozambique",
      "publisher": "Eni (Delegated Operator of Area 4)",
      "published": "8 April 2025",
      "url": "https://www.eni.com/en-IT/media/news/2025/04/eni-celebrates-100th-cargo-lng-coral-south-flng.html",
      "accessed": "2026-10-04",
      "license": "Not applicable (press release)",
      "note": "Supports one thing: LNG from the Rovuma Basin, offshore Mozambique, was being produced and shipped from November 2022, so the Mozambique Rovuma LNG row in the 2024 Climate TRACE facility data is a basin total for producing operations. Verbatim: 'Since its first LNG shipment in November 2022, Coral South FLNG has positioned Mozambique as a key player in the global LNG market'. The Rovuma row is a basin aggregate drawn at one point, not a single plant."
    }
  ],
  "figures": [
    {
      "key": "who_annual_guideline",
      "value": 5,
      "source": "who-guideline",
      "where": "chapters 2, 3 and 5"
    },
    {
      "key": "who_24h_guideline",
      "value": 15,
      "source": "who-guideline",
      "where": "not printed in the story"
    },
    {
      "key": "countries_total",
      "value": 234,
      "source": "martin-density",
      "where": "chapter 1"
    },
    {
      "key": "countries_no_monitoring",
      "value": 141,
      "source": "martin-density",
      "where": "chapter 1"
    },
    {
      "key": "countries_well_monitored",
      "value": 24,
      "source": "martin-density",
      "where": "not printed in the story"
    },
    {
      "key": "nairobi_who_year",
      "value": 2021,
      "source": "who-db",
      "where": "chapter 1"
    },
    {
      "key": "nairobi_who_coverage_pct",
      "value": 38,
      "source": "who-db",
      "where": "chapter 1"
    },
    {
      "key": "lagos_who_year",
      "value": 2010,
      "source": "who-db",
      "where": "chapter 1"
    },
    {
      "key": "lagos_who_coverage_pct",
      "value": 60,
      "source": "who-db",
      "where": "chapter 1"
    },
    {
      "key": "addis-ababa_who_year",
      "value": 2018,
      "source": "who-db",
      "where": "chapter 1"
    },
    {
      "key": "addis-ababa_who_coverage_pct",
      "value": 88,
      "source": "who-db",
      "where": "chapter 1"
    },
    {
      "key": "cities_in_the_archive",
      "value": 10,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 1"
    },
    {
      "key": "cities_with_a_citizen_mean",
      "value": 9,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 1"
    },
    {
      "key": "cities_with_a_who_pm25_value",
      "value": 3,
      "source": "who-db",
      "where": "chapter 1"
    },
    {
      "key": "mean_distance_to_monitor_km",
      "value": 220,
      "source": "martin-density",
      "where": "chapter 1"
    },
    {
      "key": "valid_city_years",
      "value": 9,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "valid_city_years_nairobi",
      "value": 7,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "cities_with_a_valid_annual_mean",
      "value": 3,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "cities_with_no_independent_figure",
      "value": 4,
      "source": "reference/reference-pm25.csv",
      "where": "chapter 2"
    },
    {
      "key": "archive_datasets",
      "value": 20,
      "source": "archive layer in sources.json",
      "where": "chapter 12"
    },
    {
      "key": "archive_datasets_without_a_licence_field",
      "value": 5,
      "source": "archive layer in sources.json",
      "where": "chapter 12"
    },
    {
      "key": "nairobi_mean_2024",
      "value": 34.3,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "nairobi_mean_2019_to_2023",
      "value": 21.0,
      "source": "derived/pm25_annual.csv with derived/pm25_monthly.csv",
      "where": "chapter 2"
    },
    {
      "key": "nairobi_x_who_2024",
      "value": 6.9,
      "source": "derived/pm25_annual.csv",
      "where": "not printed in the story"
    },
    {
      "key": "nairobi_anchor_value",
      "value": 21.7,
      "source": "reference/reference-pm25.csv",
      "where": "chapter 2"
    },
    {
      "key": "lagos_mean_2024",
      "value": 34.5,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "lagos_x_who_2024",
      "value": 6.9,
      "source": "derived/pm25_annual.csv",
      "where": "not printed in the story"
    },
    {
      "key": "lagos_anchor_value",
      "value": 37.39,
      "source": "reference/reference-pm25.csv",
      "where": "chapter 2"
    },
    {
      "key": "accra_mean_2024",
      "value": 31.6,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "accra_x_who_2024",
      "value": 6.3,
      "source": "derived/pm25_annual.csv",
      "where": "not printed in the story"
    },
    {
      "key": "accra_anchor_value",
      "value": 37.0,
      "source": "reference/reference-pm25.csv",
      "where": "chapter 2"
    },
    {
      "key": "abuja_mean_2023",
      "value": 37.5,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "abuja_x_who_2023",
      "value": 7.5,
      "source": "derived/pm25_annual.csv",
      "where": "not printed in the story"
    },
    {
      "key": "abuja_anchor_value",
      "value": 40.81,
      "source": "reference/reference-pm25.csv",
      "where": "chapter 2"
    },
    {
      "key": "kano_mean_2026",
      "value": 32.1,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "kano_x_who_2026",
      "value": 6.4,
      "source": "derived/pm25_annual.csv",
      "where": "not printed in the story"
    },
    {
      "key": "kumasi_mean_2025",
      "value": 83.8,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "kumasi_x_who_2025",
      "value": 16.8,
      "source": "derived/pm25_annual.csv",
      "where": "not printed in the story"
    },
    {
      "key": "nakuru_mean_2026",
      "value": 33.2,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "nakuru_x_who_2026",
      "value": 6.6,
      "source": "derived/pm25_annual.csv",
      "where": "not printed in the story"
    },
    {
      "key": "dar-es-salaam_mean_2018",
      "value": 14.0,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "dar-es-salaam_x_who_2018",
      "value": 2.8,
      "source": "derived/pm25_annual.csv",
      "where": "not printed in the story"
    },
    {
      "key": "dar-es-salaam_anchor_value",
      "value": 33.1,
      "source": "reference/reference-pm25.csv",
      "where": "chapter 2"
    },
    {
      "key": "lusaka_mean_2025",
      "value": 42.7,
      "source": "derived/pm25_annual.csv",
      "where": "chapter 2"
    },
    {
      "key": "lusaka_x_who_2025",
      "value": 8.5,
      "source": "derived/pm25_annual.csv",
      "where": "not printed in the story"
    },
    {
      "key": "lagos_diurnal_peak",
      "value": 43.2,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "lagos_diurnal_peak_hour",
      "value": 8,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "lagos_diurnal_trough",
      "value": 25.4,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "lagos_diurnal_trough_hour",
      "value": 16,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "abuja_diurnal_peak",
      "value": 66.8,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "abuja_diurnal_peak_hour",
      "value": 21,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "abuja_diurnal_trough",
      "value": 35.1,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "abuja_diurnal_trough_hour",
      "value": 15,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "accra_diurnal_peak",
      "value": 43.1,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "accra_diurnal_peak_hour",
      "value": 6,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "accra_diurnal_trough",
      "value": 21.2,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "accra_diurnal_trough_hour",
      "value": 15,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "nairobi_diurnal_morning_peak",
      "value": 22.0,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "nairobi_diurnal_morning_peak_hour",
      "value": 7,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "nairobi_diurnal_evening_peak",
      "value": 22.1,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "nairobi_diurnal_evening_peak_hour",
      "value": 20,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "nairobi_diurnal_trough",
      "value": 14.2,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "nairobi_diurnal_trough_hour",
      "value": 3,
      "source": "derived/diurnal.csv",
      "where": "chapter 3"
    },
    {
      "key": "wind_sahel_speed_jan",
      "value": 4.0,
      "source": "ncep-reanalysis",
      "where": "chapter 4"
    },
    {
      "key": "wind_sahel_from_jan",
      "value": 53,
      "source": "ncep-reanalysis",
      "where": "chapter 4"
    },
    {
      "key": "wind_sahel_speed_jul",
      "value": 2.8,
      "source": "ncep-reanalysis",
      "where": "chapter 4"
    },
    {
      "key": "wind_sahel_from_jul",
      "value": 217,
      "source": "ncep-reanalysis",
      "where": "chapter 4"
    },
    {
      "key": "wind_kano_speed_jan",
      "value": 4.6,
      "source": "ncep-reanalysis",
      "where": "chapter 4"
    },
    {
      "key": "wind_kano_from_jan",
      "value": 67,
      "source": "ncep-reanalysis",
      "where": "chapter 4"
    },
    {
      "key": "wind_nairobi_speed_jan",
      "value": 2.7,
      "source": "ncep-reanalysis",
      "where": "chapter 4"
    },
    {
      "key": "wind_nairobi_from_jan",
      "value": 79,
      "source": "ncep-reanalysis",
      "where": "chapter 4"
    },
    {
      "key": "abuja_harmattan",
      "value": 58.0,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "abuja_rest_of_year",
      "value": 33.8,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "abuja_harmattan_node_hours",
      "value": 21093,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "abuja_rest_node_hours",
      "value": 12934,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "abuja_harmattan_months_covered",
      "value": 18,
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "abuja_rest_months_covered",
      "value": 15,
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "abuja_coverage_first_month",
      "value": "2022-11",
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "abuja_coverage_last_month",
      "value": "2026-08",
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "accra_harmattan",
      "value": 34.1,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "accra_rest_of_year",
      "value": 22.0,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "accra_harmattan_node_hours",
      "value": 30477,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "accra_rest_node_hours",
      "value": 19318,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "accra_harmattan_months_covered",
      "value": 15,
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "accra_rest_months_covered",
      "value": 15,
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "accra_coverage_first_month",
      "value": "2023-09",
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "accra_coverage_last_month",
      "value": "2026-08",
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "kano_harmattan",
      "value": 36.2,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "kano_rest_of_year",
      "value": 30.9,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "kano_harmattan_node_hours",
      "value": 2908,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "kano_rest_node_hours",
      "value": 2920,
      "source": "derived/diurnal.csv",
      "where": "chapter 5"
    },
    {
      "key": "kano_harmattan_months_covered",
      "value": 2,
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "kano_rest_months_covered",
      "value": 5,
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "kano_coverage_first_month",
      "value": "2026-02",
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "kano_coverage_last_month",
      "value": "2026-08",
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 5"
    },
    {
      "key": "accra_paper_harmattan_mean",
      "value": 89,
      "source": "accra-gravimetric",
      "where": "chapter 5"
    },
    {
      "key": "accra_paper_rest_of_year_mean",
      "value": 23,
      "source": "accra-gravimetric",
      "where": "chapter 5"
    },
    {
      "key": "nairobi_all_2017",
      "value": 13.2,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_pms5003_2017",
      "value": null,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_sds011_2017",
      "value": 13.2,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_all_2018",
      "value": 12.2,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_pms5003_2018",
      "value": 9.8,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_sds011_2018",
      "value": 13.3,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_all_2019",
      "value": 10.0,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_pms5003_2019",
      "value": 10.4,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_sds011_2019",
      "value": 9.5,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_all_2020",
      "value": 11.5,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_pms5003_2020",
      "value": 12.7,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_sds011_2020",
      "value": 8.0,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_all_2021",
      "value": 22.4,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_pms5003_2021",
      "value": 24.3,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_sds011_2021",
      "value": 6.8,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_all_2022",
      "value": 17.6,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_pms5003_2022",
      "value": 19.1,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_sds011_2022",
      "value": 4.3,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_all_2023",
      "value": 20.1,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_pms5003_2023",
      "value": 21.6,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_sds011_2023",
      "value": 5.9,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_all_2024",
      "value": 27.7,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_pms5003_2024",
      "value": 28.4,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_sds011_2024",
      "value": 21.6,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_all_2025",
      "value": 22.7,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_pms5003_2025",
      "value": 22.7,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_sds011_2025",
      "value": null,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_all_2026",
      "value": 24.9,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_pms5003_2026",
      "value": 24.9,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_sds011_2026",
      "value": null,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_site_count",
      "value": 63,
      "source": "derived/nairobi_sites.csv",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_mean_2020_with_158_fault",
      "value": 27.45,
      "source": "derived/pm25_annual.csv",
      "where": "limits"
    },
    {
      "key": "nairobi_mean_2020_without_158_fault",
      "value": 14.15,
      "source": "derived/pm25_annual.csv, re-measured on the raw monthly archives",
      "where": "limits"
    },
    {
      "key": "nairobi_mean_2022_with_158_fault",
      "value": 20.66,
      "source": "derived/pm25_annual.csv",
      "where": "limits"
    },
    {
      "key": "nairobi_mean_2022_without_158_fault",
      "value": 18.03,
      "source": "derived/pm25_annual.csv, re-measured on the raw monthly archives",
      "where": "limits"
    },
    {
      "key": "nairobi_mean_2023_with_158_fault",
      "value": 26.24,
      "source": "derived/pm25_annual.csv",
      "where": "limits"
    },
    {
      "key": "nairobi_mean_2023_without_158_fault",
      "value": 18.18,
      "source": "derived/pm25_annual.csv, re-measured on the raw monthly archives",
      "where": "limits"
    },
    {
      "key": "nairobi_mean_2019_to_2023_without_158_fault",
      "value": 16.2,
      "source": "derived/pm25_annual.csv, re-measured on the raw monthly archives",
      "where": "chapter 2"
    },
    {
      "key": "nairobi_same_chips_2018_2019_n",
      "value": 10,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2018_2019_mean_from",
      "value": 10.0,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2018_2019_mean_to",
      "value": 6.8,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2018_2019_median_change",
      "value": -2.7,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2018_2019_moved_under_1",
      "value": 2,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2019_2020_n",
      "value": 13,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2019_2020_mean_from",
      "value": 8.7,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2019_2020_mean_to",
      "value": 9.8,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2019_2020_median_change",
      "value": 0.6,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2019_2020_moved_under_1",
      "value": 4,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2020_2021_n",
      "value": 6,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2020_2021_mean_from",
      "value": 13.2,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2020_2021_mean_to",
      "value": 19.2,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2020_2021_median_change",
      "value": 4.7,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2020_2021_moved_under_1",
      "value": 3,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2021_2022_n",
      "value": 5,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2021_2022_mean_from",
      "value": 18.2,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2021_2022_mean_to",
      "value": 15.8,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2021_2022_median_change",
      "value": -5.5,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2021_2022_moved_under_1",
      "value": 0,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2022_2023_n",
      "value": 6,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2022_2023_mean_from",
      "value": 17.6,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2022_2023_mean_to",
      "value": 19.0,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2022_2023_median_change",
      "value": 1.9,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2022_2023_moved_under_1",
      "value": 1,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2023_2024_n",
      "value": 5,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2023_2024_mean_from",
      "value": 22.0,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2023_2024_mean_to",
      "value": 26.5,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2023_2024_median_change",
      "value": 1.7,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2023_2024_moved_under_1",
      "value": 1,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2025_2026_n",
      "value": 5,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2025_2026_mean_from",
      "value": 24.8,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2025_2026_mean_to",
      "value": 24.9,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2025_2026_median_change",
      "value": 0.2,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_same_chips_2025_2026_moved_under_1",
      "value": 1,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_fleet_step_2020_2021",
      "value": 10.9,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_chip_years_left_out",
      "value": 8,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_chip_years_left_out_158",
      "value": 3,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_chip_years_left_out_near_zero",
      "value": 5,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_158_stuck_value",
      "value": 78,
      "source": "derived/pm25_node_annual.csv, re-measured on the raw monthly archives",
      "where": "chapter 7"
    },
    {
      "key": "nairobi_registration_chips_carrying",
      "value": 141,
      "source": "derived/nodes.csv",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_registration_chips_only_there",
      "value": 47,
      "source": "derived/nodes.csv",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_chips_total",
      "value": 191,
      "source": "derived/nodes.csv",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_sites_inside_county",
      "value": 47,
      "source": "nairobi-geo",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_sites_outside_county",
      "value": 16,
      "source": "nairobi-geo",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_constituencies_without_a_board",
      "value": 5,
      "source": "nairobi-geo",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_constituencies",
      "value": 17,
      "source": "nairobi-geo",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_constituencies_with_a_board",
      "value": 12,
      "source": "nairobi-geo",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_most_boards_in_one_constituency",
      "value": 9,
      "source": "nairobi-geo",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_site_mean_days_min",
      "value": 2,
      "source": "derived/nairobi_sites.csv",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_site_mean_days_max",
      "value": 1265,
      "source": "derived/nairobi_sites.csv",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_constituencies_ranked_by_poverty",
      "value": 16,
      "source": "cra-fact-sheets",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_poorest6_boards",
      "value": 26,
      "source": "cra-fact-sheets",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_richest6_boards",
      "value": 3,
      "source": "cra-fact-sheets",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_r_boards_poverty",
      "value": -0.64,
      "source": "cra-fact-sheets",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_r_boards_burden",
      "value": 0.6,
      "source": "nairobi-burden",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_r_no2_poverty",
      "value": -0.51,
      "source": "s5p-no2",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_r_sitemean_poverty",
      "value": 0.13,
      "source": "cra-fact-sheets",
      "where": "chapter 8"
    },
    {
      "key": "nairobi_r_sitemean_burden",
      "value": 0.29,
      "source": "nairobi-burden",
      "where": "chapter 8"
    },
    {
      "key": "network_pm25_chips_2017",
      "value": 13,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_cities_2017",
      "value": 3,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_pm25_chips_2018",
      "value": 62,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_cities_2018",
      "value": 4,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_pm25_chips_2019",
      "value": 44,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_cities_2019",
      "value": 4,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_pm25_chips_2020",
      "value": 27,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_cities_2020",
      "value": 1,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_pm25_chips_2021",
      "value": 21,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_cities_2021",
      "value": 2,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_pm25_chips_2022",
      "value": 22,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_cities_2022",
      "value": 3,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_pm25_chips_2023",
      "value": 36,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_cities_2023",
      "value": 7,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_pm25_chips_2024",
      "value": 51,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_cities_2024",
      "value": 7,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_pm25_chips_2025",
      "value": 61,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_cities_2025",
      "value": 8,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_pm25_chips_2026",
      "value": 55,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_cities_2026",
      "value": 9,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_peak_year_nairobi_chips",
      "value": 51,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_2026_nakuru_chips",
      "value": 25,
      "source": "derived/pm25_node_annual.csv with derived/nodes.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_first_month",
      "value": "2017-08",
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 9"
    },
    {
      "key": "network_last_month",
      "value": "2026-08",
      "source": "derived/coverage_monthly.csv",
      "where": "chapter 9"
    },
    {
      "key": "deaths_world_2019",
      "value": "4.2 million",
      "source": "who-deaths",
      "where": "chapter 10"
    },
    {
      "key": "deaths_africa_2019",
      "value": "1.1 million",
      "source": "soga-africa",
      "where": "chapter 10"
    },
    {
      "key": "deaths_ssa_rate_per_100k",
      "value": 155,
      "source": "soga-africa",
      "where": "chapter 10"
    },
    {
      "key": "deaths_global_rate_per_100k_soga",
      "value": 85.6,
      "source": "soga-africa",
      "where": "chapter 10"
    },
    {
      "key": "nairobi_raw",
      "value": 26.2,
      "source": "derived/ANALYSIS.md section D",
      "where": "chapter 12"
    },
    {
      "key": "nairobi_corrected",
      "value": 11.6,
      "source": "derived/ANALYSIS.md section D",
      "where": "chapter 12"
    },
    {
      "key": "nairobi_correction_anchor",
      "value": 21.7,
      "source": "estl-fusion",
      "where": "chapter 12"
    },
    {
      "key": "accra_raw",
      "value": 23.5,
      "source": "derived/ANALYSIS.md section D",
      "where": "chapter 12"
    },
    {
      "key": "accra_corrected",
      "value": 9.9,
      "source": "derived/ANALYSIS.md section D",
      "where": "chapter 12"
    },
    {
      "key": "accra_correction_anchor",
      "value": 37.0,
      "source": "accra-gravimetric",
      "where": "chapter 12"
    },
    {
      "key": "abuja_raw",
      "value": 43.5,
      "source": "derived/ANALYSIS.md section D",
      "where": "chapter 12"
    },
    {
      "key": "abuja_corrected",
      "value": 20.9,
      "source": "derived/ANALYSIS.md section D",
      "where": "chapter 12"
    },
    {
      "key": "abuja_correction_anchor",
      "value": 40.8,
      "source": "nsps-purpleair",
      "where": "chapter 12"
    }
  ],
  "limits": [
    "The boards are uncorrected low-cost sensors. No co-location study exists for these units against a reference monitor, so the absolute level of every city mean is uncertain.",
    "47 chips that are not PM2.5 sensors, 45 of them DHT22 humidity chips, report stray PM2.5 values in the archive, and the archive's city means include them. For the city-year each chapter 2 bar shows, they are at most 460 of 2,864 chip-days (Nakuru 2026), and dropping them moves a days-weighted chip mean by at most 0.4 (Accra 2024). The bars are left as the archive computes them.",
    "Chapter 9 counts low-cost PM2.5 chips by year from pm25_node_annual.csv, each chip once by its sensor_id. coverage_monthly.csv counts a chip once per dataset and counts humidity chips that report stray PM2.5 values, and Kano and Gezawa-Kano are the same three devices, so its monthly count runs higher. The EFAB-Met-Abuja dataset, a placeholder at 0.123, 0.123 whose chips mostly also report under real cities, is left out. The archive runs August 2017 to August 2026, so the first and last years are part-years.",
    "Sensor 158, a PMS5003 at Kinoo, has two faults in the raw archive: its channels collapse together from 18 September to 24 October 2020, and through 2022 and 2023 it reads a near-constant 78 on most reporting days. Chapter 7 leaves those chip-years out. The city means in chapter 2 are built upstream from every filtered hour and still include them. Rerunning the archive filters on the raw monthly files without 158's hours in September and October 2020 and on its stuck days moves the Nairobi mean for 2020 from 27.45 to 14.15, for 2022 from 20.66 to 18.03 and for 2023 from 26.24 to 18.18, and the 2019 to 2023 mean from 21.0 to 16.2, against the satellite fusion's 21.7.",
    "build-sensors-africa.py looks up a chip's humidity across its registered locations in an order set by Python's string hashing, which changes from run to run. For a chip with two locations, such as sensor 158, which hours pass the 85 per cent humidity cut can differ between two builds of the same archive, so the derived means are not exactly reproducible until that lookup is made deterministic.",
    "Sensor 420 in Nakuru reads 71.6 on 136 days in 2025 and 115.1 on 36 days in 2026, above every other Nakuru chip with 30 or more days, none of which passes 60.2. Nothing in the archive shows a fault, so it is kept. Leaving it out lowers a days-weighted mean of the Nakuru chips by 2.5 in 2025 and 1.3 in 2026. That is a size, not a corrected city mean, which is built from pooled hours.",
    "In Nairobi 141 of 191 chips report under location 7 (-1.298, 36.791) in their location history and 47 report from nowhere else. Readings filed under that id cannot be placed at the coordinate, so chapter 8 draws it hollow and leaves it out of every count and correlation.",
    "Raw filtered values sit closer to the independent anchors than the Ugandan PurpleAir correction does, in all three cities where both can be compared, so the story prints raw filtered values and shows the correction rather than applying it.",
    "The correction comparison in chapter 12 comes from derived/ANALYSIS.md, computed on the 17 September archive snapshot before the Lagos, extended Abuja and Addis Ababa datasets were added, and only over node-hours with a paired humidity reading. Every other figure in the story is recomputed from the current CSVs.",
    "Chapter 12 sets each raw mean against these independent values: Nairobi 21.7 (Satellite fusion, 2019 to 2023); Accra 37.0 (Gravimetric, 2019 to 2020); Abuja 40.8 (PurpleAir, 2021 to 2023). For Nairobi that is the published satellite-fusion mean, and derived/ANALYSIS.md sets Nairobi against 26.0, the midpoint of a 20 to 32 range, which the story does not use. The raw means are taken over each city's own years with a paired humidity reading (Nairobi 2020 to 2026, Accra 2024 to 2026, Abuja 2023), which are not the years of the independent estimates.",
    "The Nairobi site map and the site table come from the same snapshot. Nairobi city-day means moved by up to 0.8 between the two builds.",
    "Two archive streams are reference-grade BAM 1020 instruments rather than low-cost boards: Accra sensor 1495 (2019 to 2021) and Addis Ababa sensor 1503 (2016 to 2021). Addis Ababa has no other board at all, so its whole record is that one instrument, and its values fall inside the range of the US Embassy figures WHO publishes for the city. Neither city-year is counted as a citizen sensor reading here, and the WHO Addis Ababa value is not used as an independent check on it.",
    "A licence is not stated in the openAFRICA catalogue metadata for Kano, Gezawa-Kano, Lusaka, Akure and EFAB-Met-Abuja. The other datasets state CC BY. The gap is documented and gates nothing.",
    "derived/PROFILE.md, which was not rebuilt with the newest archives, gives the Abuja harmattan split as 55.2 against 34.1. Recomputed from the current derived/diurnal.csv weighted by node-hours it is 58.0 against 33.8, which is what the story prints.",
    "No PM2.5 reference value or peer-reviewed annual mean could be found for Kano, Nakuru, Mpika or Lusaka, so those bars stand with no independent check.",
    "The Kumasi and Lusaka (Mpika) datasets each list a second sensor beside the one PM2.5 chip: a paired humidity chip with no PM2.5 readings of its own. The city caveat in chapter 2 says one board for that reason.",
    "The openAFRICA dataset pages and the Code for Africa Medium posts returned 403, so the licence statement comes from the CKAN API rather than the page, and the network start date, total deployment and attrition are unverified.",
    "Chapter 3 diurnal hour bins with fewer than 50% of a city median bin's node-hours are excluded from that city's stated peak and trough and drawn as a faint dashed segment in the chart.",
    "The openAFRICA dataset licence field reads 'Creative Commons Attribution' with no version number; the 4.0 comes from the site footer. Read on the Nairobi dataset page only (2026-10-04). Documented, not gating.",
    "The Climate TRACE data release behind public/data/emissions/global-sources.json is not recorded in the project. The file's 'v7' label is the API version. Chapter 11 names the source and the year, not a release.",
    "The two basin rows named in chapter 11 (Côte d'Ivoire deepwater fields off Ghana, Rovuma basin LNG) are aggregates drawn at one point. Distances to them are distances to that point."
  ],
  "consulted_not_cited": [
    {
      "title": "AirQo API",
      "publisher": "Makerere University",
      "url": "https://airqo.net/products/api",
      "accessed": "2026-09-17",
      "why_not_cited": "No open data licence is stated, so only its published figures are used, through the peer-reviewed papers reporting them."
    },
    {
      "title": "IQAir and aqi.in city pages",
      "publisher": "Commercial aggregators",
      "url": "",
      "accessed": "2026-09-17",
      "why_not_cited": "Not primary sources. They are the only places with a Nakuru or Lusaka annual figure, which is chapter 1."
    },
    {
      "title": "AI-enabled air quality predictive model for fine particulate matter incorporating meteorological data: a case of Dar es Salaam city",
      "publisher": "East African Journal of Information Technology",
      "url": "https://journals.eanso.org/index.php/eajit/article/view/5282",
      "accessed": "2026-09-17",
      "why_not_cited": "Seven PurpleAir stations across Dar es Salaam, April to May 2026, DOI 10.37284/eajit.9.1.5282. No city-wide annual mean is published, and the figure this story prints for the city is 2018, so the deployment cannot be set against it."
    },
    {
      "title": "Air quality assessment in three East African cities using calibrated low-cost sensors with a focus on road-based hotspots",
      "publisher": "Environmental Research Communications",
      "url": "https://iopscience.iop.org/article/10.1088/2515-7620/ac0e0a",
      "accessed": "2026-09-17",
      "why_not_cited": "Site measurements in Nairobi (roadside 48.5, urban background 31.6, rural 4.5, DOI 10.1088/2515-7620/ac0e0a), not a city annual mean, so no chapter sets it against a city bar."
    },
    {
      "title": "Kumasi senior high schools Airnote study",
      "publisher": "DOI 10.1007/s44408-025-00066-2",
      "url": "",
      "accessed": "2026-09-17",
      "why_not_cited": "Paywalled; the reported annual median of 17.18 could not be confirmed from the article."
    },
    {
      "title": "Lancet Child and Adolescent Health six-city personal exposure study",
      "publisher": "DOI 10.1016/S2352-4642(23)00261-4",
      "url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC10716619/",
      "accessed": "2026-09-17",
      "why_not_cited": "Personal exposure with backpack monitors, not an ambient station mean, so it cannot be set against a city mean."
    }
  ],
  "closing": {
    "note": "Sources for the sentences in the closing section of index.html. Accessed 2026-10-04.",
    "chips": [
      {
        "id": "sensors-africa-about",
        "label": "sensors.AFRICA",
        "source": "sensors.AFRICA, About",
        "publisher": "sensors.AFRICA (Code for Africa)",
        "url": "https://sensors.africa/about",
        "accessed": "2026-10-04",
        "supports": "sensors.AFRICA is a citizen science initiative incubated by Code for Africa.",
        "quote": "The initiative was seed-funded by innovateAFRICA and is being incubated by Code for Africa.",
        "licence": "Not stated on the page.",
        "note": "The page says 'incubated', not that Code for Africa runs, built or owns it. The story says 'incubated'."
      },
      {
        "id": "openafrica-sensors-africa",
        "label": "openAFRICA",
        "source": "openAFRICA, sensors.AFRICA organisation page",
        "publisher": "openAFRICA (a Code for Africa platform)",
        "url": "https://open.africa/organization/sensors-africa",
        "accessed": "2026-10-04",
        "supports": "The sensors.AFRICA archive is published openly on openAFRICA (95 datasets listed on the day).",
        "quote": "Africa's largest citizen science initiative using sensors monitor air + water + sound + radiation pollution.",
        "licence": "Dataset licence field: 'Creative Commons Attribution', no version shown. Site footer: Creative Commons 4.0 International."
      },
      {
        "id": "africandrone-about",
        "label": "africanDRONE",
        "source": "africanDRONE, home page (About)",
        "publisher": "africanDRONE",
        "url": "https://africandrone.org/",
        "accessed": "2026-10-04",
        "supports": "africanDRONE is incubated and supported by Code for Africa.",
        "quote": "We are incubated and supported by Code for Africa (CfA), the continent's largest network of civic technology and data journalism labs, with teams in 21 countries.",
        "quote_nonprofit": "We are an African non-profit empowering civic drone pioneers across the continent.",
        "licence": "Not stated."
      },
      {
        "id": "africandrone-camps",
        "label": "Drone camps",
        "source": "africanDRONE, drone events (Cape Town and Lagos journalism camps)",
        "publisher": "africanDRONE",
        "url": "https://africandrone.org/drone-events",
        "accessed": "2026-10-04",
        "supports": "The events page records drone journalism camps in Cape Town and in Lagos.",
        "quote_cape_town": "In Cape Town, South African journalists and civil society organisations explored mapping, storytelling and inequality-focused drone journalism, alongside regulation and safe operations. This first national drone camp introduced newsroom participants from the country's media to hands-on flight and practical reporting applications.",
        "quote_lagos": "africanDRONE, Code for Africa and Workstation Lagos hosted a drone journalism camp in Lagos, training local journalists and community mapping experts in safe drone use, aerial storytelling, community mapping and data skills to strengthen reporting across the city.",
        "licence": "Not stated.",
        "note": "Neither entry carries a date on the page, so the story gives none. The 'Read more' links on the events page (africandrone.org/drone-camps/...) returned 404 on 2026-10-04. Dated secondary lead for Cape Town, not cited: Mail & Guardian, 11 July 2016, which names Drone Camp Cape Town on 13 to 15 July. A dated africanDRONE blog post for Lagos (20 December 2022) mentions an event organised with Code for Africa on 1 September 2022; it does not name the camp, so the link is an inference and is not used."
      },
      {
        "id": "africandrone-malawi",
        "label": "Malawi pilot",
        "source": "africanDRONE, supporting forest monitoring in Malawi (24 January 2023)",
        "publisher": "africanDRONE",
        "url": "https://africandrone.org/africandrone-blog/malawi-mapping",
        "accessed": "2026-10-04",
        "supports": "africanDRONE helped WRI carry out a drone-based pilot to monitor reforested land in northern Malawi.",
        "quote": "africanDRONE was tasked with helping US-based organization WRI carry out a pilot project for drone-based monitoring of reforestated land in northern Malawi.",
        "licence": "Not stated.",
        "note": "The post says africanDRONE was tasked with helping WRI carry out the pilot, so the story says it helped and does not say it ran the pilot. This is a reforestation-monitoring mapping pilot, not a journalism training."
      }
    ],
    "photo": "Photograph credit: africanDRONE. The caption and the alt text both say the pilots are at the Ondiri wetlands, near Nairobi."
  }
}
