Last updated 9 October 2026
Most weather apps buy their rain forecast in. Helder computes its own, on its own server: radar comes in, we work out where the showers are heading, run twenty variants to get at the uncertainty, and blend that gradually into a numerical weather model — so you get one continuous forecast out to 24 hours instead of a hard seam after two.
This page explains how that works and shows what we measure so far, including where it comes off worse. At the bottom is the scoreboard, where fourteen sources are checked against measured reality every hour — ours among them.
Why the Netherlands. The engine runs on the radar composite of the Dutch weather service (KNMI) and on their UWC-W model, so the nowcast covers the Netherlands and a margin around it. Everywhere else the app falls back on global sources — NEXRAD and NOAA HRRR in North America, ECMWF elsewhere. The method below is not specific to the Netherlands; the data licence is.
Every five minutes our server fetches the KNMI radar composite: the two radars at Den Helder and Herwijnen, merged into one map of the Netherlands and its surroundings on a one-kilometre grid. That is a measurement, not a forecast — it is what is falling out of the sky right now. We keep the images for three weeks, because without a past you cannot verify anything.
From the last six radar images we read off the motion using optical flow, the same technique video software uses to work out how pixels shift between two frames. That gives a motion field: for every patch of map an arrow saying how fast and which way. We then advect the most recent image along those arrows (semi-Lagrangian extrapolation). For the first half hour that appears to work surprisingly well: showers hold their shape longer than you would think.
A single advected image pretends the future is settled, and it is not. So we run twenty variants with pySTEPS — an ensemble. The trick in STEPS is that it decomposes precipitation into scales: large rain areas stay recognisable for hours, small convective cells live about half an hour. Each ensemble member gets noise that imitates that behaviour, so the twenty members diverge roughly the way real showers do. Out of that spread comes not just "how many millimetres" but also "what are the odds it gets wet where you are".
After an hour or two there is nothing usable left in the radar image: showers form and die, and extrapolation cannot see that coming. For that you need a model that actually solves the atmosphere. We use UWC-W, the KNMI's HARMONIE configuration at 2 km, which publishes a fresh run every hour.
The handover is gradual rather than a switch: the first quarter of an hour is radar only, after an hour it is half and half, after four hours it is pure model. And because a model only gives hourly totals, we advect those fields along the same motion field and interpolate between the hours — otherwise you watch a model shower jump forward once an hour instead of drifting across the map.
Each run produces 64 steps out to 24 hours: every five minutes for the first two hours, then quarter-hourly, then hourly. For every step we store the field, the uncertainty band and a map image. The app draws its rain strip, rain graph, 8- and 24-hour map and rain alerts from those.
Below, the current run is playing: the last hour of measured radar, then eight hours ahead. It refreshes every five minutes, so what you see here is never older than that.
Where it runs. A single machine at Hetzner in Nuremberg (4 cores, 8 GB). Python with pySTEPS and eccodes; a run takes about two minutes and uses a gigabyte. Every five minutes, day and night. Results go through Redis to the API, and the app only ever talks to that API. There is no team and no data centre: this is one person with a hobby server.
A forecast you never check is an opinion. So we measure ourselves, every quarter of an hour, at twelve locations across the Netherlands. The truth is what the KNMI radar actually measured there. Every hour we record what fourteen sources promised for the next 1 to 24 hours, and later we compare promise against measurement.
Below is a snapshot. Every source, every lead time and an explanation of each measure are on the full scoreboard, in Dutch for now.
| Source | Mean error (mm) | Wet or dry correct |
|---|---|---|
| Helder — ensemble | 0.082 | 48% |
| Helder — blended with UWC-W | 0.085 | 46% |
| Helder — radar only | 0.083 | 40% |
| KNMI nowcast | 0.084 | 40% |
| KNMI HARMONIE | 0.117 | 38% |
| KNMI UWC-W | 0.115 | 36% |
| Apple Weather | 0.118 | 35% |
| ECMWF | 0.101 | 32% |
| MET Norway | 0.100 | 32% |
| Google Weather | 0.118 | 31% |
| ECMWF AIFS | 0.118 | 24% |
| Google — minute series | 0.074 | 19% |
Snapshot over the last 7 days, 2,016 comparisons per source, 12 locations. Green = best of all sources.
Here is how we read that, with the necessary caution. On the question will it rain, our ensemble seems to be doing well: over this week it comes out on top, and also two and three hours ahead, where the KNMI's own nowcast falls back quickly. On the question how many millimetres, only Google's minute series is closer — but it says dry almost all the time, which puts it last on "will it get wet". We think the difference fits how an ensemble works: averaging twenty variants flattens the peaks, which appears to sharpen the probability question and blunt the amount question. There is probably something to be won there.
An important caveat. This covers a week and twelve locations. That is enough to see whether something works, but too little to say who is "best": one week with the right kind of showers could reshuffle the order. We publish the standings because we think a forecast ought to be checked, not because we think the matter is settled. Come back in a month.
The ensemble numbers themselves: a CRPS of 0.073 against a mean error of 0.082 for the ensemble mean. That the first number is lower suggests the probability distribution is worth more than the single value — the spread does seem to add something. The Brier score for "will it get wet" comes out at 0.051, where 0.25 would be guessing.
| Source | Mean error (°C) | Systematic |
|---|---|---|
| Google Weather | 0.89 | +0.26 |
| Apple Weather | 1.03 | +0.69 |
| ECMWF AIFS | 1.09 | −0.20 |
| ECMWF | 1.12 | +0.08 |
| Helder (as in the app) | 1.16 | +0.66 |
| MET Norway | 1.22 | +0.40 |
| KNMI HARMONIE | 1.54 | +1.25 |
| KNMI UWC-W | 1.56 | +1.27 |
Truth: the ten-minute observations from the KNMI station network.
This is where we came off worse. For the Netherlands Helder showed HARMONIE's temperature, and in this period that model appears to run more than a degree warm against the stations (+1.25° over the past week, mostly at night and in the evening); Google, Apple and ECMWF do better. Since 9 October we move HARMONIE halfway towards ECMWF — deliberately not all the way. The row "Helder (as in the app)" shows what that does: recomputed over the same week, the mean error drops from 1.54° to 1.16°. Next we want to use the real temperature we measure at the same spot every ten minutes, to steer the first hours further.
All open data or open source, credited in the app under Settings → Sources.