Methodology & sources
Every figure traces to a settled or live figure from Elexon, NESO or DUKES. No modelled numbers. This page sets out, figure by figure, the source, the formula in words, and the known limitations — including the limitations and biases we disclose rather than hide.
On this page: Denominator · Nameplate · Verdict pair · Reliability block · Capacity trap · Gas vs wind · Operational warnings · Wind unreliability · Year-to-date shares · The history store · Guards & the honesty bargain · Share cards
The denominator — national demand
Every live share divides by national demand, reconstructed from the supply side so the shares sum to 100% by construction:
national demand = positive transmission generation (excl. interconnectors and pumped storage) + net interconnector imports (all INT*, exports net off) + embedded solar (NESO) + embedded wind (NESO)
Pumped-storage pumping is demand, not supply, so it is excluded; interconnector exports net off inside net imports. A build-time guard reconciles this against Elexon's national demand outturn, INDO (+ the same embedded estimate) and fails past a 12% gap — a tripwire for a gross feed failure, not a precision claim. (INDO, not transmission demand ITSDO: ITSDO additionally counts interconnector exports as demand, so it diverges from national demand on an export night.)
Nameplate (installed capacity)
Wind 32.082 GW (onshore 16.166 + offshore 15.916), solar 18.28 GW — 50.4 GW of wind + solar combined. These are UK-wide; the small NI capacity makes a published share mildly conservative, never inflated. Which denominator powers which figure matters: the capacity trap and the wind unreliability carpet divide by this DUKES figure; a live solar capacity-share would instead use NESO's GB, DC-basis figure (~23 GW, 2026) — the two bases must never be mixed.
The reliability gauge — how much leans on weather & imports
The cut. We group supply not by fuel but by what matters for reliability — whether you can call on it when you need it:
Firm power = gas + nuclear + biomass + hydro & other firm fuels Weather & imports = wind + solar + net interconnector imports
The gauge is a proportional arc: one slice per source, length in proportion to its output, green-toned for the firm (reliable) sources and red-toned for the weather & imports (unreliable) ones. The arc reads RELIABLE or arms red as UNRELIABLE when the firm share falls below 50% — i.e. when most of the grid is leaning on sources that can vanish together.
Share of national demand. Each source is shown as a share of national demand — what Britain is consuming right now. Imports appear as a slice when importing, and on an export night the surplus is drawn as a magenta tail beyond the demand mark. The underlying verdict is computed identically in the build (Python) and the browser (JavaScript), pinned by a parity gate.
Why imports sit with wind and solar, not with firm power. Wind is correlated across ~1,000–2,000 km: a winter blocking high becalms Britain, France, Germany and the Benelux at once. In exactly those hours every connected market is short, prices spike everywhere, and the interconnectors run flat or reverse — imports fail precisely when they are needed. So wind, solar and imports are the correlated-failure bucket: they fall away together. Gas, nuclear and biomass do not share that weather correlation.
Why biomass sits with firm power. Biomass (chiefly Drax) is dispatchable and weather-independent — operationally it behaves like gas, available in the calm. By the only test this gauge applies — can you call on it when the wind dies? — it is firm. The separate case against biomass (its subsidy and its carbon accounting) is a question of cost, not reliability, and lives on the Subsidy Clock; we keep the two arguments in their own lanes.
Firmness, not this instant. The gauge reads a 5-minute snapshot, and on a breezy day imports and wind are real power flowing right now. "Weather & imports" is a statement about what is guaranteed when the continent is also becalmed — not a claim that those megawatts are absent at this moment. We classify by what you can count on in the tail, and we say so.
The reliability block — reliable (firm) share of demand, per half-hour
Two measures, one question. The block beneath the gauge asks how much of Britain’s demand was met by firm power in each half-hour of the past year — and whether now is typical. It combines a live dial with a settled half-hourly day-grid (a “carpet”): the dial shows the current reliable (firm) share; the carpet shows the same measure for every settlement period of the rolling past year.
Metric: firm share of demand. Each cell is computed by reusing the gauge’s own formula (engine.grid_engine.compute_verdict), joining settled Elexon FUELHH to NESO’s embedded solar and wind on the national-demand basis. On net-export half-hours — when firm generation exceeds GB demand and the surplus is exported — the share is clamped to 100% reliable, matching the live dial’s clamp. There is no second formula: the block and the gauge cannot disagree, and an independent raw-CSV recompute gate checks the published carpet against source.
The carpet. The carpet is a grid of columns (one per settled day, oldest at the left, newest at the right) and 48 rows (settlement periods SP1–SP48, SP1 = 00:00 local time), so date runs left to right and time of day runs top (00:00) to bottom (24:00). Colour runs a continuous traffic-light ramp — green where firm power fully met demand (100% reliable), through amber, to deep red where the grid leaned heavily on weather and imports (0% reliable) — interpolated in OKLab, a perceptually-uniform colour space, so an equal step in firm share reads as an equal perceived step and the midpoint is a true amber, not a muddy blend. Green = reliable / red = unreliable echoes the verdict gauge directly above; amber is only the midpoint hue, never a threshold. Where several days fall in one screen column the least reliable (reddest) half-hour wins, so the worst spells are never averaged away. A missing settlement period is left neutral, distinct from an honest reading. The carpet lags live by approximately three weeks.
The dial. The dial is a plain 0–100% arc carrying a red→amber→green ramp (0% red/least reliable at the left, 100% green/fully reliable at the right); it shows no nameplate or MW labels because the metric is a share of demand, not a capacity factor. The needle points to the current firm share, clamped to [0, 100%], so it swings right toward green exactly as the verdict gauge above it does; an ink tick marks the rolling-year mean, so now reads against the average. The full distribution lives in the legend below, to keep the coloured arc legible.
The legend and its range markers. Below the carpet the same red→amber→green ramp appears as a key, labelled Unreliable at the red end and Reliable at the green. A “now” caret marks the current firm share — the same value the dial’s needle points to. Beneath it, a box-plot summarises the rolling year’s distribution: a thin whisker spans the middle 9 in 10 (the 10th–90th percentile), a thicker bar spans the usual half (the 25th–75th percentile), and an ink tick marks the average. The numbers underneath label the 9-in-10 ends and the average.
A mixed settled-and-estimated layer. The firm fuels are settled Elexon FUELHH; the embedded solar and wind are NESO’s modelled outturn estimates, not metered. The live gauge reads NESO’s embedded forecast; the carpet reads NESO’s embedded outturn estimate — sibling products from the same methodology owner, the outturn estimate being the corrected version. A small step at the join is expected and disclosed. The carpet lags live by approximately three weeks.
The capacity trap
Three measures, one question. Entry 02 asks how much of Britain’s installed wind and solar capacity is working right now — and whether that is typical. It combines a live combined gauge with two settled half-hourly day-grids (“carpets”), one for wind and one for solar, placed side by side: the gauge shows the current combined load factor; each carpet shows the same measure, source by source, for every settlement period of the rolling past year.
The live gauge (combined wind + solar). Live wind + solar output ÷ DUKES UK wind + solar nameplate (50.4 GW, end-2024). The numerator is full national output: transmission wind from Elexon FUELINST plus NESO’s embedded wind and solar forecast — the same basis as the reliability gauge. The denominator is DUKES UK nameplate: mildly conservative (UK not GB), but the only public installed-capacity figure on a consistent wind+solar basis. The gauge reads the current output in both MW and as a percentage of that nameplate.
The wind carpet (settled, per half-hour). (Transmission FUELHH WIND + embedded wind outturn) ÷ DUKES total UK wind nameplate (annual-step). Both embedded and transmission wind are in the numerator — the full national output — over the full DUKES installed total. This is a true load factor. The cross-year artifact — the rising apparent CF as the offshore transmission share grew — does not apply here. (NESO’s live embedded-wind capacity is the embedded slice only and is the wrong denominator against a mixed numerator.)
The solar carpet (settled, per half-hour). Embedded solar outturn ÷ NESO embedded-solar capacity (contemporaneous, GB, DC/MWp). Because solar generation is entirely embedded — no transmission-metered solar exists — both numerator and denominator are from the same NESO embedded series on the same scope and basis: the methodology-correct match. A DUKES solar figure would introduce a 4–5 GW mismatch (UK not GB, AC-equivalent not DC, end-2024 not current vintage). Night cells are genuine zero output, not gaps.
Time-of-day axis and the clock change. Each carpet is a grid of columns (one per settled day, newest at the right) and 48 rows (settlement periods SP1–SP48, SP1 = 00:00 local time), so date runs left to right and time of day runs top (00:00) to bottom (24:00). Settlement periods follow the local clock, so the DST change is handled for free: the spring-forward day yields a naturally shorter column of 46 periods; the autumn-back day yields 50 periods, of which SP49 and SP50 fall outside the 48-row grid and are dropped.
The colour scale. Each cell runs from white (no output) to the saturated source colour at full nameplate output — blue for wind, amber for solar. The ramp is interpolated in OKLab, a perceptually-uniform colour space, so an equal step in capacity factor reads as an equal step in perceived density: the deepening colour tracks output evenly, rather than staying pale and then darkening abruptly the way a naive RGB blend does. Interpolating in OKLab also holds each source to a single clean hue, with no detour through purple. A data gap (a half-hour Elexon or NESO never published) is drawn neutral grey, distinct from an honest zero.
The legend and its range markers. Below each carpet, the same ramp appears as a key. A “now” caret marks the current capacity factor — the same value the live dial’s needle points to. Beneath it, a box-plot in the source colour summarises the rolling year’s half-hourly output: a thin whisker spans the middle 9 in 10 (the 10th–90th percentile), a thicker bar spans the usual half (the 25th–75th percentile), and an ink tick marks the average. The numbers underneath label the 9-in-10 ends and the average. The dial behind its needle carries the same bands.
Why the average, not the median. The central marker is the mean capacity factor — the load factor, i.e. the year’s energy divided by nameplate × hours. This is the standard, citable “how much it delivers” figure (UK wind ≈ 34%, solar ≈ 10%). We deliberately do not use the median: solar produces nothing for over half the year because it is dark, so its median half-hour is 0% — a fact about the Earth’s rotation, not the panels. The mean is the fair summary of output; the percentile band beside it shows the variability.
The forecast-vs-settled seam. The live gauge reads NESO’s embedded forecast; the carpets read NESO’s settled outturn estimate for the rolling last 365 settled days. These are sibling products from the same methodology owner — the outturn estimate is the corrected version, the forecast is the forward tick. A small step at the join is expected and disclosed. The carpets lag live by about three weeks.
Gas vs every wind farm
Formula in words: the whole wind fleet's metered output against the whole gas fleet's, from one snapshot. The card is shown only while gas genuinely out-produces all wind. The per-station version ("one gas plant beats the lot") needs per-unit data (Elexon B1610) and is a deliberate fast-follow — asserted only when true.
Operational warnings — the scarcity ladder
When the system operator is worried about margin, it says so on the record. We surface those notices and nothing else — counted and contextualised, never catastrophised. Three notice types form a scarcity ladder, shown here most to least severe:
NISM — Notice of Insufficient System Margin (most severe) EMN — Electricity Margin Notice CMN — Capacity Market Notice (least severe)
The live banner lights only while one of these is in force; otherwise it stays dormant. When more than one is active, the most severe wins (ties broken by the most recent issue time). The banner names the notice, its time window, the source (Elexon SYSWARN) and the issue time, so a reader can check it against NESO directly. A notice is a statement that the buffer is thin — not that the lights are about to go out; the two are routinely confused and we are careful not to.
What a margin notice is not. An EMN or CMN is the operator asking the market for more, with hours of warning — the system working as designed, not a blackout in progress. We report the notice and its severity; we do not dress it up.
Wind unreliability — the whole-record carpet & drought spikes
Formula in words. Each day's wind capacity factor is the mean power of (transmission WIND from Elexon FUELHH + embedded wind outturn from NESO Historic Demand Data) over that day's settled half-hours, divided by the DUKES 6.2 total UK wind nameplate for that year (annual-step). By combining both output streams and dividing by the full installed base this is a true load factor — unlike the retired transmission-only lower bound, it carries no cross-year artifact: the mix of embedded and transmission wind in the numerator has always matched the DUKES total denominator.
The carpet. The whole-record carpet plots every day from 2016 to the present: rows are years (2016 at the top, newest year at the bottom), columns are day-of-year (1 Jan at the left, 31 Dec at the right), calendar-aligned so 29 February has its own column (and is blank in non-leap years). It uses the same colour key as the Entry 02 wind carpet, so the two read consistently: colour runs pale at low output (a near-calm day) and deepens to blue at full output, OKLab-interpolated. The calm spells therefore show as the pale patches — read down a column to compare years, or across a row to follow one year. A partial final year is drawn in its available columns; missing days are left neutral grey.
A lull and its severity. A lull (or drought) is a run of consecutive days on which the daily capacity factor stays below 10%. Severity is measured by how deep it goes: a lull that touches below 5% on at least one day is classed as severe. The drought-spike plot below the carpet shows one vertical spike per lull: spike height encodes the lull's duration in days; spike colour encodes how deep it went (pale red for a shallow lull, deep red for one that fell far below the threshold). Reference lines run across the plot at 3 days, 1 week and 2 weeks, so a glance shows whether a given spell is routine or exceptional.
These figures supersede the former wind stripe and failure counter. Earlier share images and cached cards may show the lower-bound transmission-only figures, which are systematically higher (more days appearing below the threshold because embedded output was invisible). The combined-basis record differs: for instance, the all-time longest sub-10% run is shorter on this basis than the old lower-bound figure suggested. A cached share image may reflect the old number.
Year-to-date shares — a transmission-system mix, not the verdict
Formula in words: each year's settled generation by fuel, plus net interconnector flow, as a share of total transmission supply. Pumped-storage round-trip is excluded; the shares sum to 100% by construction.
Read this on its own basis — it is not the live verdict. The settled store is transmission-metered FUELHH only and carries no embedded solar or wind. Embedded solar is netted off national demand and cannot appear in a settled-data share at all, so these year-to-date figures are a transmission-system mix, not the national-demand verdict the gauge shows. The two use different denominators and must never be compared directly. Net interconnectors are a signed net flow: in a net-export year (2022) the import share is negative — it is drawn as a signed bar, never a pie wedge.
The history store
Settled half-hourly FUELHH and demand from Elexon back to the clean-data edge of 2016-01-01 (nothing earlier exists on the modern API). 77 days are genuine Elexon non-publications, recorded in a frozen manifest; we never fabricate the missing half-hours. The live clock is anchored to Elexon's server-stamped snapshot, not the device clock. Full notes and the open source are in the repository.
Build-time guards & the honesty bargain
The bargain is simple: every figure traces to a settled or live source, and a number that cannot be made to add up is never published. That is enforced in code, not by good intentions — the build fails loudly rather than ship a wrong figure. The guards, by stage of the pipeline:
- Solar cross-check (live). The NESO embedded-solar figure — the one estimate that moves the headline — is checked against the independent Sheffield Solar PV_Live outturn and the build fails if they disagree by more than 10%. (PV_Live sends no CORS header, so it can only ever be the server-side auditor, never the live figure.)
- Demand reconciliation (live). The supply-side denominator is reconciled against Elexon's national demand outturn, INDO, plus the same embedded estimate, and fails past a 12% gap — a tripwire for a gross feed failure (a zeroed, doubled or wrong-unit series), not a precision claim. The actual residual is recorded each run, not hidden.
- Snapshot completeness (live). A partial FUELINST publish — missing a core fuel, or implausibly low demand — is refused rather than rendered as if whole.
- Derived figures (settled). Before any daily figure is written, the build checks that the year-to-date shares sum to ~100%, every wind and solar capacity factor sits in range, each carpet's days are sorted and unique, the wind-drought episodes are internally valid (length ≥ 1 day, start ≤ end, below the 10% threshold), and the nameplate denominators are positive, in-envelope and self-reconciling. Any breach aborts the build and writes nothing. One value that looks wrong but is correct — a negative net-import share in an export year — is allowed by construction.
- Share cards. Cards are screenshotted into shareable images, so a wrong figure becomes a wrong picture. Each card is built from the same JSON the dashboard reads and is checked against the same guards before rendering; a separate source-trace test recomputes every card figure from the site data and fails on any drift.
When the live feed is stale or down. The live layer is anchored to Elexon's server-stamped snapshot, not your device clock. If the live fetch fails it falls back to the last good reading (latest.json), clearly labelled as such; once that reading is too old to show as current, the dashboard goes number-free rather than display a stale headline that looks live — a midday solar reading shown at midnight is a wrong number, not an old one. A build older than twelve hours renders as unavailable, with no numbers at all.
Share cards
Each share card is built from the same JSON data files the dashboard reads — latest.json, nameplate.json, reliability_year.json and wind_unreliability.json. A card figure and its corresponding dashboard figure use the same JSON field and the same format string; tests/test_sharecards_gate.py asserts every card figure independently and fails the build if anything drifts.
Live cards carry the Elexon snapshot timestamp so a shared card can be read in context. The gas-vs-wind card is adaptive: it states whichever source actually leads at build time. Settled cards carry an as-of generation timestamp so they can be read in context. The warning card classifies any active Elexon SYSWARN notice against the three-tier scarcity ladder — NISM (Notice of Insufficient System Margin), EMN (Electricity Margin Notice), CMN (Capacity Market Notice) — and shows "All clear" when none is in force.
Cache bust. Each card PNG is SHA-256-hashed; the first ten digits appear as a ?v= token on every image URL. Social platforms cache OG images aggressively; a changed figure changes its hash and forces a re-scrape.
No modelled figures. Every card value traces to a settled or live Elexon / NESO / DUKES figure already published on the dashboard. No figure is introduced that does not already exist in site/data/*.json.