Fix Rain is now called by model agreement, not the driest model
On a morning the ground-handling row showed as flyable and it rained. The cause: the rain number on that row, and on the ridge rows, came from a single auto-selected model that happens to be the most rain-shy of the ones available — it drew a dry line while five of six models called rain that hour. Measured over the summer against station weather, that one model misses roughly half of all rain hours.
Rain is now a vote of six models, not one. For ground handling and all five ridge sites, the go/no-go rain check counts how many models expect rain in the flying window. Three or more agreeing is a NO-GO; one or two is shown as a warning (“2 of 6 models expect rain — check radar”) rather than cancelling the day on a single model’s say-so.
Why a vote and not just a stricter single model. Requiring agreement roughly halves the misses while keeping the false-alarm rate about where it already was — and part of any “false alarm” is just rain that fell in the grid cell but not on the one sensor, which is why a single model flipping the day to NO-GO would over-warn. The threshold of three was picked from the summer data, not guessed.
The rain bars on the cell now show model agreement, not one model’s number. Each hour’s bar is taller and darker the more of the six models expect rain — a tall solid bar means most agree, a short faint one means only one or two do. Hover for the count and the expected millimetres. This replaces the old single “best match” line that read 0.0 mm straight through the rain.
Rain is the opposite kind of call from gusts: a wet wing costs more than a wasted trip, so it is tuned to catch misses, not to avoid crying wolf. Rapla thermal flying is unchanged (it keeps its own trace-rain tolerance). The wind and gust gates, and the Paldiski model-agreement cap, are untouched. Analysis and implementation by Claude Code under pilot direction; method and per-model numbers in the precipitation section of docs/wind_forecast_playbook.md.
22 August 2026
New The site now picks the wind model for you
The wind study of the last two weeks measured which forecast model is actually right, per site and per question, against station observations. Those findings are now wired into the pages themselves. Until today every chart drew four model lines with equal weight and left the choice to you — even though the study showed the choice matters a lot, and that the best model changes with the question: one model for the mean wind, a different one for the gust ceiling, at the same site.
Every site page names a recommended wind and gust series. It is drawn as one solid pair; the raw model lines stay on the chart, dimmed, so you can still see the spread. The legend says which model each recommendation came from, what its measured bias is, and how it was calibrated — including that the calibration window is summer only, which matters for the ridge sites that mostly fly in the cold half of the year.
Ground handling reads calibrated models now, not the default blend. The Kollane / Stroomi / Kakumäe row used to take whatever the “best match” auto-blend produced. It now takes the mean wind from the model that best calls the 3 m/s “is there enough wind” line, and the gust from the model that cries wolf least at the 8 m/s line — a comfort call, so a false alarm that cancels a fine evening is the error worth minimising. This visibly moves the dashboard. The hourly wind and gust curves in that row are different numbers than they were yesterday, not a re-drawing of the same ones. On the first run the shift was large enough to change the flyability call behind about a third of the site-days measured — in both directions: one site’s evening became flyable, a neighbouring site’s next day stopped being.
Wind direction is the exception — there is deliberately no recommended model. Every model gets direction about equally right, so the pages do not pretend otherwise and no direction line is promoted. What Paldiski gains instead is an honest tolerance at the edge of its wind window: because every model reads that direction a few degrees backed of reality, the band edge is drawn with a hatched margin, so an arrow sitting just outside it reads as “might really be on the hill” rather than a hard no. The forecast arrows themselves are not rotated — the observed wind on the same chart is ground truth and needs no correction.
Trust rules travel with the numbers. Some of the study’s findings are not a bias you can subtract but a rule about which way to lean: at Paldiski a high-resolution model calling the wind “too light” should be overridden, while any model saying “at least 4 m/s” can be believed. Those rules now appear next to the recommendation instead of living in a document.
Two things this deliberately does not do. The flyability verdicts are still computed from raw model values — the corrections are shown to you, never fed into a go/no-go gate, because the verdicts’ own accuracy statistics were measured on raw values and changing the input would silently invalidate them. And only three locations (Harku, Kuusiku, Paldiski harbour) have station observations to calibrate against; the other sites inherit which model to prefer but get no numeric correction applied, and say so. Analysis and implementation by Claude Code under pilot direction; method and per-model numbers in docs/wind_forecast_playbook.md.
22 August 2026
Data Which model to trust for wind direction — the ridge question
A follow-up to last week’s three-site wind & gust study, on the same 107-day window and the same anemometer-only truth. Speed and gust are only half of a ridge decision: the wind also has to be pointing the right way. Every ridge site flies only within a narrow direction band (Paldiski 259–310°, and so on), and off-band wind is unflyable at any speed. So the forecast direction was scored the same way — model vs station, hour by hour.
For direction, the model barely matters. This is the exact opposite of speed and gust, where the high-resolution coastal models win. Direction is a large-scale field: the coarse global GFS (~13 km) is as accurate as the 1 km MET-Nordic — every model lands at 11–18° mean error across all three sites. Don’t shop models for direction; take whichever you have.
At short lead, trust the direction. Every model’s error is smaller than the width of a ridge’s wind window, so the forecast reliably tells you whether the wind will be on the hill tomorrow. The real risk is lead time, not model choice — direction skill decays with distance out, not between models.
Paldiski is the hardest to aim. The exposed cape carries a few degrees more scatter than inland, and every model reads the direction a touch backed (~6–9° counter-clockwise) of reality — a forecast sitting just south of the 259° edge may actually be in the flyable band.
The band call is trustworthy both ways. At Paldiski, a forecast that says “on the hill” is wrong ~11–15% of the time, and one that says “wrong direction” is wrong ~15–19% — modest and roughly even. Unlike the mean-wind floor (where a high-res “too light” should be overridden), you can take the direction at face value and let the wind speed be the deciding gate.
South-wind days at Rapla are catchable. A south wind puts Rapla under restricted airspace and limits cross-country distance. Any model flags ~4 of 5 real south days a day ahead; ICON-EU and MET-Nordic give the cleanest flag.
Direction is measured only when there is real wind to have a direction (mean ≥ 3 m/s), using circular statistics. Only Paldiski has ridge observations, so the band numbers there are measured and the other ridge sites are extrapolated. Analysis and this write-up by Claude Code under pilot direction. Full method and per-model numbers in the project repository (docs/wind_forecast_playbook.md).
21 August 2026
Improved Cloud observations redrawn as one altitude × time profile
The cloud tile used to be a stack of separate charts: sunshine, then a bar chart each for low and mid cloud amount, then a scatter of dots for the base heights. Sunshine stays on top, but everything below is now a single altitude × time profile. Each cloud layer's base sits at its real height; a short bar there fills up according to how much of the sky that layer covers, so you read where the cloud is and how much in one place.
Low cloud gets the room. The height axis is square-rooted, so the first couple of kilometres — where a paraglider actually cares — take up about half the chart instead of being crammed against the floor.
One neutral colour, not three. Height already tells the layers apart, so a colour code was redundant and risked reading as a cloud type. The exact base in metres is printed at the right edge, and a tap or drag anywhere on the chart shows the base and coverage of every layer at that minute.
Observations then forecast, one column. The observed cloud (last 6 hours) now sits directly above the cloud & temperature forecast, so the recent past and the outlook line up. Sites whose nearest station has no cloud sensor (e.g. Pakri, for Paldiski) show the forecast alone.
The data is the same 10-minute synoptic feed the page already used; only the drawing changed. Base heights are no longer repeated as text above the chart, since the profile now carries them.
20 August 2026
Improved Wind Overview now shows the last 30 minutes, not just the latest reading
The polar chart at the top of every site page drew one line per station: the most recent reading, with no way to tell a steady 6 m/s from one that had just built from 3. Each station now carries a hatched sector covering the full range of direction and mean speed over the last 30 minutes, a dashed outer band out to the window's peak gust, and the current reading drawn on top.
The radial scale now fits the day. It was fixed at 0–12 m/s, which squeezed a light-wind morning into the inner third of the circle where nothing was legible. The axis now steps to fit the window (4/6/8/12/16/20/24 m/s) and the active maximum is printed under the chart. A single freak gust cannot blow the scale up — if a gust lands past the axis it gets a sparse dash and its value printed instead.
Speed labels on both sides. The line points at the direction the wind comes from, so a westerly reading used to sit on the far side of the circle from the only set of labels. They are now mirrored on the opposite diagonal.
The ridge window moved to a rim band. It used to be a green wedge filling the whole circle, and a station wedge drawn on top of it read as a third colour that meant nothing. It is now a band around the edge (green optimal, yellow acceptable), and no reading can be drawn into it.
New column: change over the window — speed delta plus veered/backed. This is deliberately a different measure from the sector: a station can end where it started after a large excursion, so the two can disagree.
The trail uses observations the page already downloads for the wind history chart, so no extra request and no new data source. The current reading still comes from the same place as the table under the chart, so the two cannot disagree.
One caveat worth knowing: the marine (MSI) stations report every 5 minutes, the Environment Agency stations every 10, so a 30-minute window holds roughly 7 readings for the former and 4 for the latter. The count is printed under the chart as a range rather than a single number.
16 August 2026
Data Which forecast model to trust for wind & gusts — a three-site study
The same models are trustworthy at one site and misleading at the next. A 107-day study (1 May–15 Aug 2026) compared multi-model forecasts against station observations at three sites — coastal Harku, inland Kuusiku, and the seaside Paldiski ridge — using one consistent forecast source at each station's exact coordinates. Truth is the anemometer only (5-minute observations), never reanalysis.
Ground handling (coastal): high-resolution models (HARMONIE-AROME, MET-Nordic) over-forecast gusts at the coast. When any model flags a gust ≥ 8 m/s, HARMONIE-AROME is the most reliable warner; MET-Nordic and ICON-EU cry wolf ~47% of the time (shave ~1.5 m/s off their gust).
Ridge soaring (Paldiski): the exposed point is genuinely windy (observed mean 4.9 vs 3.2 m/s elsewhere), so the models under-forecast its mean wind by ~2 m/s. Add ~2 m/s to AROME mean wind; trust GFS or MET-Nordic; the gust ceiling is about right as-is.
Winch towing (inland) — the advice inverts: gusts are a safety limit, and inland the coarse GFS misses gusts ≥ 8 m/s 24% of the time. Never use GFS for the inland gust ceiling; trust MET-Nordic or ICON-EU and add a ~1 m/s margin.
The clean measure is the “gust increment” — how gusty a model is relative to its own mean wind — which isolates excess gustiness from mean-wind error. Coarse global models under-produce it everywhere; convection-permitting models over-produce it at the coast but are well-calibrated inland.
A second question was added: not just “is it too gusty” but “is there enough wind to fly”. For ground handling (needs ~2 m/s) the wind is present 80% of the time, so the floor rarely blocks. For ridge soaring (needs ~4 m/s), when the direction is right the wind is strong enough 82% of the time — but the high-resolution models under-forecast it: when HARMONIE-AROME says “below 4 m/s” on the ridge it is wrong ~68% of the time (the wind was really ~6). A model saying “enough wind” is reliable; a high-res model saying “too light” on the ridge should be overridden.
Study, analysis, and this write-up by Claude Code under pilot direction. Full method and per-model numbers in the project repository (docs/wind_forecast_playbook.md).
26 July 2026
Improved Code split into four focused repositories
The codebase behind this site and the companion flight-analysis tools has been reorganised from two overlapping repositories into four focused ones. The split removes duplicated IGC parsing, keeps grey-area scrapers private, and makes the reusable analysis code installable as a proper package.
xcflightlab (new, public) — reusable IGC track analysis library: parser, vertical speed, climb/thermal detection, phase segmentation, terrain helpers, sun geometry, and Airtribune data acquisition. Installable via uv add --editable ../xcflightlab.
paragliding-analysis (existing, public) — personal flight analytics. All IGC parsing now delegates to xcflightlab.igc; duplicate code removed.
meteo-matrunich (this repo, renamed from paragliding-weather2) — PHP site, eemeteo package, and deploy pipeline. The SSC v3.0 airmass classification functions were extracted from the top-level script into eemeteo.airmass, making them importable by other tools. The duplicate IGC parser in igc_enrichment.py was replaced by xcflightlab.igc.
No user-visible behaviour changed. The split was planned in seven stages across several months; stages 1–7 are now complete.
Architecture and implementation by Claude Code under pilot direction.
9 June 2026
Data Winch map extended east — now 9 counties
The winch road map now covers nine maakonnad: Rapla, Viljandi, Pärnu (inland), Valga, Võru, plus the newly-added Järva, Jõgeva, Tartu and Põlva. Candidate count grew from 78 to 98 straight, open, ≥ 2 km gravel/dirt roads. New this round: Järva 11, Tartu 15, Jõgeva 10, Põlva 4.
All four new counties are clipped to south of the 58.99°N restricted-airspace parallel by the existing per-county logic. The full national Maa-amet ETAK and 4 m canopy-height data are now held locally, so adding a county is a one-line change and a rerun — no new download.
Every candidate still needs Street-View and on-site checking before any tow. View the map.
9 June 2026
Improved Winch finder: a power line crossing no longer throws away the whole road
A successful winch launch happened at the old Võhma airstrip (Lennuvälja tee) — a dead-straight 3 km gravel road through open fields — yet it was missing from the map. The investigation turned up two separate reasons, now both fixed.
One crossing used to veto the entire segment. A distribution line clips the strip near its north end. The old obstacle check dropped any candidate a power line crossed anywhere along its length — discarding ~2.8 km of perfectly usable runway for one crossing at the tip. The finder now trims instead: it cuts out a 75 m clearance on each side of the crossing and keeps every remaining stretch that is still ≥ 2 km. The same trim applies to roadside transformers, turbines and tanks. Across the 9-county map, 45 of the 98 candidates survive only because of this change. Trimmed candidates carry a “⚠ power line near end” note in their popup — the conductor is flagged, not hidden, so you still keep the tow clear of it.
It sat just outside the mapped area. The airstrip is north of Võhma town, across the line in Järva maakond, which wasn’t among the counties being processed. Järva has been added (see above), bringing the airstrip into scope.
With both fixes, Lennuvälja tee now appears as a 2 858 m candidate. Reported from a real winch session; investigated and implemented by Claude Code. View the map.
A reviewer flagged a candidate at Tamme-Loo-Tamme tee in Rapla — Google Street View clearly shows pole-mounted cables crossing the gravel road, but neither Maa-amet ETAK nor OSM maps the drop cables themselves. Two changes shipped to compensate, plus a research conclusion on the data gap.
Transformer veto. ETAK’s separate point layer E_602_tehnopaigaldis_p records 21,615 permanent utility installations (20,045 transformers, 1,324 tanks, 246 wind turbines). The pipeline now drops any candidate with one of those points within 30 m of the road centerline. A roadside transformer is essentially always the source of transverse drop cables, so the proximity is a reliable proxy for the unmapped overhead drops. The originally-reported road is gone from the output. Four candidates dropped at this stage in the current Rapla run.
Popup labels & Google Maps links. Each candidate’s popup now shows the nearest village name (Maa-amet asustusyksus — e.g. “id 4 — Kuusiku-Nõmme küla”) so the candidate can be referenced across runs even though the integer id reshuffles. Two new links jump to Google Maps at each end of the segment, labelled by cardinal direction (e.g. “NW end · SE end”), so the reviewer can land in Street View at the chosen end without scrolling.
Why we don’t have a better cable layer. Investigated all public Maa-amet WMS/WFS catalogues (kitsendused, eelis, planeeringud, kataster) and the major Estonian DSO/TSO viewers. None of them publishes rural low-voltage drops at the level we’d need. Elektrilevi’s public viewer is medium-voltage only with a 200 kW free-capacity cutoff; Elering covers 110 kV+ transmission already in ETAK; the “servituut” layers carry detailed-plan easements (urban) but not legacy rural feeders. ETAK + OSM + transformer-proximity is as good as automated detection gets. Field / Street-View verification on every shortlisted candidate remains required before any tow operation.
Filters tightened in the same release: Rapla maakond only (Viljandi paused while the algorithm matures), ≥ 2 km minimum, Kõrvalmaantee added to the rural-class allowlist. Current output: 8 candidates. View the map.
6 May 2026
Fix Rapla XC: evening gusts no longer kill a flyable morning
Today (6 May) the Opportunities page flagged Rapla NO-GO because of crosswind gusts — but the gusts were forecast for 18:00–19:00 local, after the practical winch window. The morning (11:00–15:00) was forecast to be calm, runway-aligned, and flyable. The verdict was wrong.
Root cause: the gust gate compared the day’s peak gust against the noon wind direction — two values from different hours. A single late-afternoon gust spike could trigger a NO-GO that didn’t apply to any actual flying hour.
Fix (v5): the wind/gust/crosswind gates now apply hour-by-hour. The day fails only if no contiguous ≥ 2 h flyable window exists. The dashboard shows the window (e.g. “Flyable window: 08–12 UTC, 5h continuous”) and the gust max within that window. If the window misses thermal hours (11–14 UTC), the verdict is capped at POSSIBLE — flyable for ground handling or early launches but not full XC. The flying-window range was also harmonised across all three assessor paths (Python rapla_xc.py, opportunities.php Rapla site, and the morning briefing.php) to 08–15 UTC = 11:00–18:00 EEST winch hours.
Today’s verdict shifted from NO-GO to GOOD. Backtested against historical XC days — high-distance flights at Kuusiku now read GOOD or POSSIBLE; only days with full-window gusts > 9 m/s remain NO-GO (matching the v4 safety threshold, unchanged).
Code: aggregate_rapla() and assess_rapla() in archive/cron/lib/assessors.php; aggregate()/assess() in rapla_xc.py; assess_kuusiku() in archive/cron/briefing.php. Reported by amateur pilot, implemented by Claude Code.
2 May 2026
Data Winch road finder extended to Viljandi maakond
The winch road map now covers Viljandi maakond in addition to Rapla. Candidate count grew from 25 (Rapla south) to 78 (25 Rapla + 53 Viljandi). Each candidate's popup shows which county it belongs to. Same filter pipeline as before; Viljandi is fully south of the 58.99°N restricted-airspace parallel so no airspace clip applies.
The Maa-amet 4 m CHM (Canopy Height Model) is delivered as one file per ~¼ of Estonia per year, so multi-county coverage required mosaicking three years' tiles into a single virtual raster: 2024 (NW, Rapla), 2021 (SW, most of Viljandi), 2023 (SE, Viljandi east strip). Together they cover everything from x=369 000 to 727 000 east, 6 377 000 to 6 619 000 north (EPSG:3301). Adding the next county is just an entry in the TARGET_COUNTIES list plus whatever CHM tiles are still missing.
1 May 2026
New Winch tow road finder — Rapla maakond
A new page at meteo.matrunich.com/winch/ shows candidate paraglider winch-tow road segments in Rapla maakond, south of the 58.99°N parallel (Tallinn restricted airspace marks the north). Each candidate is a continuous rural road stretch ≥ 1 km, mostly straight, with no overhead obstacles crossing it and no forest tunnel on both sides. The map is being shared with winch operators and the pilot community for review — field inspection (cable height, surface condition, gates, access permission) is still the only way to commit to a site.
Current Rapla south output: 25 candidates, lengths 1.0–3.1 km, mostly gravel and dirt. The map shows each as a coloured line by surface (cyan = gravel, magenta = dirt, yellow = asphalt), with a length-filter slider and a wind-sector fan on click. Switch to the Maa-amet aerial layer (top-right) to verify against satellite.
Pipeline filters:
Estonian rural-road class only (no state main/support roads, no urban streets, no light-traffic / pedestrian paths).
No power line, pipeline, or aerialway crossing the segment (ETAK + OSM cross-check).
Forest-tunnel walk in 100 m steps along each candidate — sub-sections where the obstacle stack covers ≥ 50 % of both 30 m roadside strips are trimmed out, and any candidate with no remaining 1 km clean run is dropped.
Per-candidate usable wind sectors (headwind ±30° around either tow direction, crosswind constrained away from any obstacle-on-one-side).
Data: Maa-amet ETAK (roads, forest polygons, tree-row hedgerows, power lines, pipelines, county boundary); Maa-amet 4 m LiDAR Canopy Height Model (catches lone trees and tree-lined streams that polygon data misses); OpenStreetMap via Overpass (overhead-line / pipeline cross-check). Tools: Python with geopandas, shapely, rasterio for the GIS pipeline; Leaflet on Maa-amet topo + aerial tiles for the web map. Implementation by Claude Code under amateur-pilot direction; minimum track length set by a winch operator at 1 km. Restricted-airspace dataset still uses a placeholder pending a current source from Lennuamet.
22 April 2026
Fix Ridge wind direction no longer snapped to 45° sectors
Kaider and Tavo flew Paldiski on the morning of 22 April (09:30–11:30 local), even though the Opportunities page had reported NO-GO for the day with the reason “wrong direction: NW (315°)”. They reported the flights afterwards — which is how the bug was caught. Aitäh!
Every forecast model on Windguru for that morning (HARM-FI 2.5 km, MET Nordic, HARM-DK, Zephyr-HD, HARMONIE) showed 286°–298°, well inside Paldiski’s 259°–310° acceptable window. The forecast itself was fine.
Root cause: the window-level direction aggregate bucketed the four passing morning hours (305°, 293°, 301°, 292°) into one of eight 45° sectors and returned the sector midpoint — here, NW 315°. The direction gate then compared that snapped 315° against Paldiski’s acceptable window and hard-failed. The true circular mean of those hours is 297.7°.
Fix: modal_wind_dir now returns a circular vector mean instead of the sector midpoint. The same snap affected Türisalu, Tabasalu, Toila, and Alajõe too — Alajõe was quietly passing some directions just outside its 135°–225° window because 140° rounded to 135°. Regression tests added for both flavours.
Code: modal_wind_dir in archive/cron/lib/assessors.php. Investigation and fix implemented by Claude Code.
19 April 2026
Fix Morning flyable windows no longer masked by afternoon gusts
Pilots flew Tabasalu on the morning of 18 April, but the Opportunities page reported NO-GO for the whole day. Investigation: the forecast was correct — Vanasadam observed gusts up to 10.6 m/s in the afternoon, which tripped the 9 m/s ridge gust hard gate. But the gate was applied to the day’s maximum gust, so a single gusty afternoon hour killed the calm morning window too.
Fix: the gust gate is now also applied per hour. Gusty hours drop out of the flyable window, so a calm sub-window (09–12 UTC in this case) can still be assessed on its own. Simulated against the observed data, 18 April Tabasalu would now have shown a morning GOOD verdict.
While at it, Toila and Alajõe were extended with the same 9 m/s gust gate — previously they did not track gusts at all. All five ridge sites (Paldiski, Türisalu, Tabasalu, Toila, Alajõe) now apply the same gust rule, both per-hour and per-window.
Code: hour_passes_ridge, hour_passes_toila, hour_passes_alajoe, assess_toila, assess_alajoe, aggregate_coastal. Regression tests added. Changes implemented by Claude Code.
17 April 2026
New Contrails card in the morning briefing
The briefing now includes a contrail forecast for Tallinn-Harku and Kuusiku at 300 and 250 hPa (~9–10 km cruise altitude). Per location the card shows:
Whether contrails will form at all (Schmidt-Appleman threshold, T < −40 °C).
Whether they will persist and spread into cirrus (ice-supersaturation, RHi ≥ 100 %) — relevant because widespread cirrus under the sun weakens thermals.
The peak hour with temperature, RHi, and wind aloft — so a pilot on the field can look up and verify the forecast by eye.
Huge thanks to Mitja Vishnjakov — this one was entirely his idea. It is the kind of sideways thought that makes the whole site better: most of us look down at wind and BLH, Mitja looked up at the sky and asked what the jet trails could tell us. Aitäh, Mitja!
Improved Rapla FP/FN confidence indicator — now live
The historical miss-rate indicator described below is now active on the Opportunities page. The daily calibration script ran for the first time today: 19 ERA5 dates evaluated, 99 (verdict, lead) pairs aggregated. All NO-GO forecasts in the post-v4 window had FN 0% at every lead time.
Buckets for MARGINAL/POSSIBLE/GOOD show “·” (fewer than 10 samples) — will fill in over the coming weeks.
13 April 2026
New Rapla cells now show historical miss rate
Each Rapla cell on the Opportunities page now carries a small FP or FN number showing how the same verdict has performed historically at that lead time:
FP X% (on GOOD / EXCELLENT cells) — share of past forecasts with the same verdict at the same lead time where ERA5 reanalysis turned out to be below GOOD. The risk of committing a drive for a day that did not materialise.
FN X% (on NO-GO / MARGINAL / POSSIBLE cells) — share of past forecasts where ERA5 reanalysis actually met GOOD. The risk of skipping a day that would have been flyable.
A dim “·” means fewer than 10 past samples in that (verdict, lead) bucket — insufficient history.
Computed daily from assessment_log (stored forecasts since the current Rapla rules took effect on 22 March) vs Open-Meteo ERA5 reanalysis. Only “is the day flyable?” is measured — tier shifts within flyable or within non-flyable don’t count.
12 April 2026
Improved Morning briefing: maps and sounding
Three usability improvements to the daily morning briefing page:
Skew-T Log-P diagram — the Tallinn-Harku 00Z sounding now includes the full Skew-T diagram from University of Wyoming, with a legend explaining temperature, dewpoint, dry/moist adiabats, mixing ratio lines, and how to read them for thermal forecasting.
SIGWX fallback link — when the SIGWX SFC–10000ft chart is unavailable, a direct link to lennuilm.ee is shown so you can check manually.
5 April 2026
Improved Dashboard accuracy overhaul
Major dashboard update driven by the first user feedback from Kaia Kala — thank you! The core insight: Pakri ridge-top station shows a systematic −27° to −30° wind direction bias in the ridge-relevant WSW–NW sector, making it misleading for soaring decisions.
Pakri hidden from Wind Overview for Paldiski and Türisalu. Port stations (Põhjasadam, Lõunasadam) are more accurate for ridge wind assessment. Pakri data remains visible in Wind History and Conditions for reference.
Wind direction arrows on the history chart now use the calibrated reference station (Põhjasadam for Paldiski, Vanasadam for Tabasalu/Türisalu).
Sea Thermal Activity card — new tile showing ΔT (water − air temperature). When sea surface is warmer than air, the marine boundary layer becomes unstable, producing sea thermals that can supplement ridge lift. Thresholds: < 0°C stable, 0–2°C neutral, 2–4°C moderate, > 4°C strong. Available for Paldiski, Tabasalu, Türisalu, and Toila.
Square root wind scale on the Forecast tile gives better visual resolution in the flyable 1–5 m/s range while compressing strong winds.
Cloud & Temperature legend added (solid line = cloud cover, dashed = temperature).
Toila-Oru station added to observation collection — was configured but never collected.
Pakri bias documented from 100,681 matched hourly pairs (2013–2024) against Põhjasadam.
2 April 2026
Improved Multi-model BLH verification fixed
The system compares boundary layer height (BLH) forecasts from two models — GFS and MET Norway Nordic — against ERA5 reanalysis to find which predicts thermal ceiling more accurately.
Investigation revealed that the “KNMI” model label was misleading: KNMI HARMONIE does not provide BLH at all. The Open-Meteo seamless wrapper silently substitutes MET Norway Nordic for forecast dates and ERA5 reanalysis for past dates. This made the old comparison circular — ERA5 vs ERA5.
Renamed blh_knmi → blh_metno across the pipeline to reflect the actual data source.
Verification now only uses forecasts with lead ≥1 day, ensuring genuinely independent predictions.
Early results (N=6): MET Norway Nordic MAE 78 m, GFS MAE 183 m. More data needed.
31 March 2026
Improved Ridge forecasts now use the best model for each lead day
A 30-day benchmark of 12 weather models against Estonian station observations revealed that no single model is best at all forecast horizons. Ridge soaring sites (Paldiski, Türisalu, Tabasalu, Toila, Alajõe) now automatically select the most accurate wind model based on how far ahead the forecast is:
D+0–2 — FMI HARMONIE-AROME 2.5 km (wind MAE 1.15–1.30 m/s). Already in use since March 8.
D+3 — DWD ICON 7 km (MAE 1.35 m/s). New — replaces the generic Open-Meteo “best match”.
D+4–5 — ECMWF IFS-HRES 9 km (MAE 1.5–1.7 m/s). New — the most gracefully degrading global model.
D+6+ — no model beats 2.0 m/s MAE. Shown as trend only.
Each assessment now records which model provided the wind data. Falls back gracefully to the default model if the preferred one is unavailable.
31 March 2026
Data Forecast model benchmark published
The Forecast Accuracy Benchmark page now updates weekly with verification statistics for all 12 Windguru models against Estonian weather station observations. Metrics include wind speed MAE, direction MAE, and temperature bias, sorted by accuracy.
A separate lead-time analysis showed that high-resolution models (1–2.5 km) are barely better than global models (13–15 km) at D+0, but diverge sharply by D+3. Wind direction degrades faster than speed — by D+5, direction errors exceed the width of a typical ridge site’s optimal wind window.
22 March 2026
Improved Wind and gust safety gates for Rapla and ridge sites
The assessors now check gusts, not just mean wind. Key changes:
Rapla gust gate — gusts >9 m/s are a hard NO-GO. Gusts >7 m/s with crosswind (>20° off runway 15/33) are also NO-GO; along the runway they produce a warning only.
Rapla wind scoring — mean wind >4.2 m/s now penalises the score (−1). South wind (S/SSW/SSE) also penalises (−1) due to restricted airspace limiting XC distance.
Ridge gust gate — gusts >9 m/s are NO-GO for Paldiski, Türisalu, and Tabasalu.
Ridge sweet spot narrowed — the ideal wind range is now 4.7–6.0 m/s (was 4.7–10.0). Wind above 6 m/s is “strong” and scores lower.
22 March 2026
Improved Forecast accuracy tracking — how far ahead can you trust the verdict?
The system now stores every assessment verdict it produces (with all the weather inputs that went into it) and compares them against ERA5 reanalysis — what the weather actually was. This builds a track record over time showing:
Lead-time reliability — how many days ahead is the Rapla thermal forecast trustworthy? (T-1? T-2? T-3?)
BLH convergence — how the boundary layer height prediction for a given date evolves from T-5 to T-0, and when it settles near the actual value
Multi-model BLH comparison — GFS vs KNMI vs Open-Meteo best_match, checked against ERA5 reanalysis to find which model predicts BLH most reliably for Rapla
New signals — dewpoint spread (T−Td) as a dry-air/thermal quality indicator, station visibility as an aerosol proxy, and previous-day precipitation effect on BLH bias
Parameter bias — which inputs (BLH, temperature, wind, cloud cover) are causing the most verdict errors and by how much
The accuracy pipeline runs locally. Results will feed back into model selection and threshold calibration as data accumulates over the coming weeks.
20 March 2026
New Vatsla ground handling site added
The Opportunities page now includes Vatsla — a ground handling spot that works in NE through SSE winds (45°–170°). Complements the existing sites which favour west and south directions.
20 March 2026
Improved Harku GH renamed to Lennuplats Kollane
The generic “Harku GH” ground handling site is now called Lennuplats Kollane — its actual name. Same location, same any-direction filter.
20 March 2026
Improved Fewer API calls, faster Opportunities page
Ground handling sites that share the same forecast coordinates now reuse a single Open-Meteo response instead of making duplicate API calls. Reduces total requests from 9 to 7 per run, saving 2–4 seconds of runtime.
19 March 2026
Improved Tap cells for details on mobile
The Flying Opportunities table now works on phones. Tapping any cell opens a bottom sheet with the full forecast details — gate reasons, window times, wind, BLH, temperature, soil moisture. Previously this information was only accessible via mouse hover on desktop.
19 March 2026
Fix Opportunities page no longer crashes when Open-Meteo is slow
The Flying Opportunities page failed intermittently when Open-Meteo responses were slow. With a 30-second per-request timeout and a built-in retry, a single sluggish fetch could hold the script for 62 seconds — long enough for the server to kill the process mid-run. The page would silently stop updating.
Fixed by reducing the Open-Meteo fetch timeout to 15 seconds (worst-case retry cycle: 32 s) and adding set_time_limit(0) to prevent the server’s default 30-second execution cap from applying to long-running cron scripts.
17 March 2026
Improved Scenario tests catch logic bugs before deployment
Assessment logic (hourly gates, wind direction windows, verdicts) is now covered by 34 automated scenario tests that run in CI on every commit. This catches inconsistencies like the gust fallback bug — where changing the verdict function without updating the upstream hourly filter caused gusty-but-flyable conditions to be silently rejected.
Pure assessment functions were extracted into a separate library (lib/assessors.php) for testability. The opportunities page shrank from 2200 to 1200 lines.
17 March 2026
Fix Opportunities page survives FMI outages
The Flying Opportunities page crashed twice today when the FMI HARMONIE-AROME API went down. The script makes 24 HTTP requests to FMI (4 ridge sites × 6 days); with the API unresponsive, timeouts accumulated to ~480 seconds and exceeded the server’s execution limit.
Fixed with a circuit breaker: if the first HARMONIE request fails, all remaining FMI requests are skipped. Ridge sites gracefully fall back to Open-Meteo data. Also reduced per-request timeout from 20 s to 8 s.
17 March 2026
New Soil moisture now in forecasts
Rapla airfield director Kristjan Plamus asked pilots to stay away for ~2 weeks because the grass field is too wet after snowmelt. That got us thinking: does ground moisture affect thermals too, not just the runway?
Turns out, yes. Dry ground heats the air more efficiently — wet ground wastes solar energy on evaporation instead (the Bowen ratio effect). Analysis of 114 Rapla flight dates (438 flights, 2014–2025) against ERA5-Land soil moisture data shows that pilots fly 2.6× farther on dry soil days (median 41.7 km vs 15.8 km on wet days). The effect is strongest on cool, marginal days — exactly when you need the extra signal most.
What changed:
Morning Briefing — new “Ground conditions” card shows soil moisture for Kuusiku (flying site) and Tallinn (reference point you can verify outside your window). Color-coded: DRY = good for thermals, WET = thermals weakened.
Flying Opportunities — Rapla thermal cells now show 🟤 (dry soil, +1 bonus point) or 🔵 (wet soil, warning). Hover for the numeric value.
Rapla XC assessor (rapla_xc.py) — +1 score bonus when soil is dry and temperature is below 23°C. This helps marginal spring days score closer to reality.
Thresholds (DRY < 0.22, WET > 0.32 m³/m³) are calibrated on ERA5-Land 0–7 cm layer. Forecast API uses 0–1 cm — values are preliminary. Full analysis on the blog.
17 March 2026
Improved Ridge sites work in gusty light wind
Ridge soaring sites (Paldiski, Türisalu, Tabasalu) no longer show NO-GO when sustained wind is below 4.0 m/s but gusts are strong enough to fly. Previously, mean wind < 4.0 m/s was an automatic NO-GO — now the system checks gusts and shows MARGINAL instead.
Calibrated from Kaider’s Paldiski flight today: mean wind only 2.8 m/s, but gusts 4.9 m/s — enough for 30 minutes of ridge soaring in fog. The old algorithm said NO-GO; Kaider proved it wrong.
14 March 2026
New System status page
A status page now monitors all 11 data sources and shows their freshness. Automated alerts trigger if any source goes stale for more than an hour.
14 March 2026
Improved Dashboard reads from database
The main dashboard now reads observations from the database instead of scraping live XML/HTML on every page load. Response time dropped from ~2 seconds to ~5 ms.
9 March 2026
New Trip Planner with live flight prices
The Trip Planner combines XC weather forecasts with live flight prices from Tallinn for Ager (Catalonia), Bassano (Italy), and other destinations. Auto-discovers new spots from config files.
8 March 2026
Improved Wind direction with HARMONIE-AROME 2.5 km
Ridge sites (Paldiski, Türisalu, Tabasalu) now use the FMI HARMONIE-AROME 2.5 km model for wind direction when available. This high-resolution model outperforms GFS by 50% for direction accuracy near the complex Estonian coastline.
8 March 2026
Fix Wind speed unit bug
Fixed a bug where Open-Meteo wind speed was interpreted as m/s but was actually km/h (the API default). All wind thresholds are now correctly calibrated. This fix affected both the opportunities dashboard and the main dashboard.