Methodology
Every number you see on the map is sourced. This page lists the architectural decisions (ADRs), emission factors, and data sources Gridomics computes from.
Architecture Decision Records (ADRs)
Every material decision — from data source to calculation method — lives as an ADR, and the “never invent a number” rule is enforced through them. A selection of the load-bearing ones is below; the full set is in the repo.
- ADR-0001 Tech stack — SvelteKit + Cloudflare Workers + KV + D1 Accepted
Hexagonal architecture; ports + adapters; bounded contexts enforced by dependency-cruiser.
- ADR-0002 Data sources — ENTSO-E primary for EU Accepted
ENTSO-E Transparency Platform A75 for generation, freshness derived from fetch_audit.
- ADR-0003 Value provenance — trust every number on screen Accepted
Every numeric value carries a Provenance object (method + sources + citation chain). Never invent a number.
- ADR-0004 Snapshot storage — KV aggregate blob + D1 history Accepted
Single KV blob kv:snapshot:current = API contract. D1 fetch_audit + snapshot_history. Honesty rule on partial updates.
- ADR-0005 Branching + deploy — develop → main Accepted
Develop integration + main release; rebase-merge for linear history; preview deploys on develop.
- ADR-0006 Partial-coverage handling — coverage-aware calculator Accepted
When fuel coverage < 100 %, rescale intensity to the COVERED generation, surface a coverage badge, refuse below 85 %.
- ADR-0007 Trunk-based workflow Proposed
Make main the default + topic branches; develop becomes a passive mirror via sync workflow.
- ADR-0008 Demand ingestion — ENTSO-E A65 Accepted
Realised total load (A65, processType=A16) as additive nullable field; independent fetch path.
- ADR-0009 Day-ahead prices — ENTSO-E A44 Accepted
EUR/MWh day-ahead spot price selected for the snapshot's observedAt; negative prices kept (renewables glut).
- ADR-0012 Consumption-based (flow-traced) carbon intensity Accepted
Domestic generation blended with imports (each carrying the exporter's consumption intensity), solved by fixed-point iteration (Tranberg et al. 2019). Untraceable imports are excluded, never guessed.
- ADR-0020 Trust & verification layer Accepted
An auditable read path + /status surfacing freshness, coverage and recent errors — so the honesty model is checkable, not merely asserted.
- ADR-0028 Forecast metric — wind+solar ÷ demand Accepted
The forecastable quantity is wind+solar as a share of demand, NOT renewable share of generation — carried in its own field so the two can never be conflated.
- ADR-0034 Generation-completeness guard Accepted
Reject a slot whose total generation is far below demand (a partial ENTSO-E publish), so a trace of renewables never renormalises to a false ~100 %.
- ADR-0037 Forward-known fields display the current time Accepted
Price + forecast are shown for the CURRENT slot, not the ~60-min-lagged generation slot — the day-ahead price is a full-day curve with no latency.
- ADR-0039 Single-fuel-partial baseload guard Accepted
Reject a slot where a must-run baseload fuel (nuclear) vanished versus the last complete slot — catches single-fuel partials the gen-vs-demand guard can't.
- ADR-0042 Price-in-time + price anomaly Accepted
A per-zone, same-hour 7-day baseline so the map can surface where power is unusually dear/cheap right now, normalising out structural cheapness.
- ADR-0045 Statistics layer Accepted
The permanent daily archive powers cross-country rankings, generation mix, trends and the price-duration curve — each coverage-gated, so a thin day is a labelled gap.
Emission factors (IPCC AR5/AR6)
Lifecycle median factors in gCO₂eq/kWh per IPCC AR5 WGIII Annex III (carried into AR6). Keys are ENTSO-E PsrType B-codes.
| PsrType | Fuel | Median | Range | Citation |
|---|---|---|---|---|
B01 | Biomass — Dedicated | 230 | 130–420 | IPCC AR5 WGIII Annex III Table A.III.2 (Biomass – Dedicated) |
B02 | Fossil Brown coal / Lignite | 1054 | 800–1300 | IPCC AR5 WGIII Annex III lifecycle median for lignite (Schlömer et al. 2014 Supplementary Information). Median sourced via Electricity Maps CZ-zone factor library and cross-checked against energeticky-semafor docs/carbon-methodology.md §4 (Daniel-reviewed: '0.6 × lignite (1054) + 0.4 × hard coal (820)' is the CZ-weighted coal blend Semafor uses for its derived intensity, with the 1054 lignite figure traced explicitly). Range is the broad Schlömer SI compilation across basins and combustion technologies. |
B04 | Fossil Gas — Combined Cycle | 490 | 410–650 | IPCC AR5 WGIII Annex III Table A.III.2 (Natural Gas – Combined Cycle) |
B05 | Fossil Hard coal — Pulverised | 820 | 740–910 | IPCC AR5 WGIII Annex III Table A.III.2 (Coal – PC) |
B06 | Fossil Oil | 840 | 740–910 | IPCC AR5 WGIII Annex II.6 Table A.II.6.1 (Oil products, lifecycle median). Promoted from `pending` per ADR-0006 — citation was available at MVP, transcription deferred. |
B09 | Geothermal | 38 | 6–79 | IPCC AR5 WGIII Annex III Table A.III.2 (Geothermal) |
B11 | Hydro — Run-of-river and poundage | 24 | 1–2200 | IPCC AR5 WGIII Annex III Table A.III.2 (Hydropower). NB: the wide upper range reflects reservoir-flooding outliers — kept honestly. |
B12 | Hydro — Water Reservoir | 24 | 1–2200 | IPCC AR5 WGIII Annex III Table A.III.2 (Hydropower) |
B14 | Nuclear | 12 | 3.7–110 | IPCC AR5 WGIII Annex III Table A.III.2 (Nuclear) |
B16 | Solar | 48 | 18–180 | IPCC AR5 WGIII Annex III Table A.III.2 (Solar PV – Utility Scale) |
B17 | Waste (Waste-to-Energy) | 730 | 540–1100 | IPCC AR6 WGIII Chapter 6 (waste-to-energy from MSW combustion). Wide range reflects municipal-waste-composition variance across technologies (mass-burn, RDF, gasification). Median used in the calculator; min/max carried in the JSON so the UI can render the band per ADR-0006 §1(a). |
B18 | Wind Offshore | 12 | 8–35 | IPCC AR5 WGIII Annex III Table A.III.2 (Wind Offshore) |
B19 | Wind Onshore | 11 | 7–56 | IPCC AR5 WGIII Annex III Table A.III.2 (Wind Onshore) |
Pending factors
Fuels for which we have no defensible IPCC citation. Their share in generation reduces coverage; ADR-0006 sets the threshold.
| PsrType | Fuel | Reason |
|---|---|---|
B03 | Fossil Coal-derived gas | Coverage gap in AR5 Table A.III.2. Use Fossil Gas (B04) as a conservative proxy only with an explicit override file and a documented note. |
B07 | Fossil Oil shale | Coverage gap; rarely material outside Estonia. |
B08 | Fossil Peat | Coverage gap; material primarily in Ireland / Finland. |
B10 | Hydro Pumped Storage | Storage technology, not primary generation. Including a generation factor would double-count emissions (pumping consumed grid mix; releasing returns that energy). Right treatment is flow-traced accounting against the grid mix at pumping time — v1.1 work. Per ADR-0006 §2 the calculator names B10 explicitly in the citation chain when present so users see it's a 'storage, accounted separately' gap, not a 'we don't know' gap. |
B13 | Marine | Emerging technology; not covered in AR5 Table A.III.2. Coverage gap. |
B15 | Other renewable | Heterogeneous category by definition — geothermal-not-classified-elsewhere, tidal, wave, novel renewables. UNECE 2021 lists 6+ technology categories under it. No single defensible factor exists. Will be split into specific PsrType extensions if ENTSO-E adds them; until then carries via the coverage-aware calculator (ADR-0006). |
B20 | Other | Unknown composition by definition — never assigned a factor. |
Data sources
- ENTSO-E Transparency Platform — transparency.entsoe.eu — A75 generation, A65 load, A44 day-ahead prices.
- NESO — National Energy System Operator (GB) — neso.energy — Great Britain generation mix + carbon intensity (the primary GB source).
- Energy-Charts (Fraunhofer ISE) — energy-charts.info — independent cross-check of generation + daily price (ADR-0025/0032).
- IPCC AR5 + AR6 WGIII — lifecycle CO₂eq factors; see citations above.
- Natural Earth 50m — naturalearthdata.com — zone geometries.
Open source
The full codebase is public. Audit, fork, contributions welcome: https://github.com/dstefl/gridomics