What this is
loadcurve.eu turns European electricity data into a single live number — your zone's current wind+solar share — plus ten years of history to put that number in context, across 35 bidding zones, hour by hour, from 2015 to the present. It's built and run by one person, as a static site with no backend, no accounts, and no tracking.
This page covers the decisions behind how it's built. For the precise definitions, formulas and data lineage behind every number, see the methodology page — this page links to it throughout rather than repeating it.
The stack
The site is static and build-less by design: no JavaScript bundler, no framework, no server-side rendering. The browser fetches pre-generated JSON (and, for the explorer's bulk history, Parquet) directly and draws charts with Observable Plot and the map with d3-geo. Caddy serves the files; there is no application server and no database at request time. The processing pipeline that produces those JSON/Parquet files is a single Python script built on DuckDB (see The pipeline).
All three libraries, and the site's fonts, are self-hosted rather than loaded from a CDN (see Privacy) — the only requests your browser makes are to loadcurve.eu itself.
Map projection
The map uses a conic conformal projection (d3.geoConicConformal), rotated and parallel-tuned for Europe's latitude band, with a fixed geographic bounding box fitted to the available space. A general-purpose world projection would waste most of its frame on the Atlantic and the Sahara; tuning the projection to Europe specifically, and fitting it to a fixed box rather than to whichever zones happen to have data on a given day, keeps the map's framing stable as you change layers, periods or zone selection.
Two renewable metrics
The site deliberately tracks two renewable figures rather than one, because they answer different questions. Wind+solar share — (wind + solar) / load — is the variable, weather-driven share that the live hero number and the Dunkelflaute framing are built on; it excludes hydro on purpose, because Dunkelflaute is specifically about low wind and low sun. Total renewable share — renewable / load, summed across all renewable production types — is the broader figure behind the map's renewable layer and the “greenest zone” reading, and it's why hydro-heavy zones like Norway read as highly renewable. Conflating the two would hide exactly the contrast — variable vs. dispatchable renewables — that makes either number interesting. Full definitions and the exact production-type list are on the methodology page.
Deliberate exclusions
Germany's series begins on 1 October 2018, not 2015. Before that date Germany shared a single combined bidding zone with Austria and Luxembourg (DE-AT-LU); since Austria is tracked separately here, including the pre-split combined data would double-count Austrian and Luxembourg consumption in the European totals. Omitting it is a deliberate correctness decision, not a data gap — see methodology for the full reasoning, including a two-day junk fragment from 2015 that the same cutoff rule removes.
Weather normalisation
The consumption trend chart answers a specific question: once you remove the effect of weather, is underlying electricity demand rising or falling? Each zone's daily consumption is regressed on heating and cooling degree-days, and each day is then adjusted to a common reference weather. The result is a deliberately simple, transparent linear model — not a forecast, and not an attempt to isolate any single other driver (economic activity, electrification, efficiency gains all remain folded into what's left). The full derivation and its stated limits are on the methodology page.
The pipeline
A single Python/DuckDB script runs hourly, unattended: it pulls fresh data from ENTSO-E and Open-Meteo, re-fetches the most recent 10 days to absorb upstream revisions, recomputes every derived metric, and writes the static JSON/Parquet files the browser reads. There's no manual step between a new hour of European electricity data existing and it showing up on this site.
Privacy
There is no analytics, no tracking script, and no cookie banner, because there's nothing on this site that needs one. The only data your browser sends anywhere is the HTTP request for the page itself. Fonts, charting and mapping libraries, and the world map data are all self-hosted rather than loaded from third-party CDNs, so visiting this site doesn't tell Google Fonts, jsdelivr, or anyone else that you were here. See the privacy notice for the full GDPR disclosure (server logs, hosting).
Who built this
[OWNER VOICE — personal note from the person behind loadcurve.eu goes here. Not yet written.]