Case study

HimmelMeer

Live above-the-fog forecasting for Switzerland, from an operational ensemble.

Role
Design, engine, and build
Timeframe
2025 – Present
  • Ensemble NWP
  • Probabilistic decision product
  • Latency-optimised pipeline
  • Live operational service
  • ICON-CH1-EPS ensemble members11 (1 ctrl + 10 perturbed)
  • Full ensemble run, inside the 3-hourly forecast cadence138 min on a 2-core, 12 GB VM

The problem

Switzerland’s winter fog sits in the valleys while the peaks stand in sun, and the only way to know which is which has been to trust a forecaster’s map or drive up and look. HimmelMeer turns MeteoSwiss’s operational forecast into a direct answer at any point on the terrain: an interactive map that shades exactly the ground below the elevation the sky is expected to be clear, updated continuously as new model runs land.

How it works

The forecast comes from ICON-CH1-EPS, MeteoSwiss’s kilometre-scale operational ensemble, decoded member by member from GRIB rather than trusted as a single control run. Sun is not painted from a threshold on the mean: the pipeline computes the expected cloud presence per pixel across 11 (1 ctrl + 10 perturbed), smooths only the genuinely uncertain part, the cloud-to-clear-sky edge, and gates that against the high-resolution terrain model so the fog-to-land shoreline itself stays crisp. Sun is shown only where the members agree, because a false promise of sun is the costly error a fog forecast can make, not an overcautious cloud.

The HimmelMeer map of Switzerland, showing the translucent fog mask over low elevations and clear terrain above it, with a timeline scrubber for the forecast horizon.
The live map: translucent fog below the forecast sun-floor, clear terrain above it, scrubbable across the full forecast horizon. HimmelMeer
> ENGINE_ROOM The daemon and the latency budget

The pipeline runs as a continuous daemon rather than a cron job, watching MeteoSwiss for each new forecast cycle and computing every lead time, day and night, the moment data lands; the objective is minimising the wall-clock gap between a forecast becoming available and it going live on the site, not raw throughput. On a free-tier two-core server that gap is 138 min on a 2-core, 12 GB VM, which is the difference between the ensemble shipping inside MeteoSwiss’s own update cadence and permanently falling behind it. Getting there took memory-bounded scheduling, compressed swap and demand-driven prefetching of only the next few lead times, rather than more hardware.

What this demonstrates

SciML & ML

An operational NWP ensemble turned into a genuinely probabilistic decision product end to end: member-wise decoding, a presence-and-terrain-gate classification designed around which error is actually costly, and a latency-constrained daemon engineered to a fixed real-time budget on minimal hardware.