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.