Hosted at https://qgis.ltapzmap.com/changelog/LTAPzMap.html.
This file is the source of truth — publish.sh reads it and uploads an HTML version next to the plugin repo on every publish.
Five new layers from the community map are now downloadable: Power plants (EIA generating stations), Industrial sites (substations, landfills, quarries, strip mines, military), Zoos (~800 US animal parks — noise-sensitive), UAS Facility Map + DROTAMs (FAA LAANC drone-ceiling grid), and Historical flights (famous balloon flights 1783–today with launch/landing pins and tracks). These come from dedicated server tables via a new /api/v1/features POI dispatch; signed-in plugins auto-discover them, and they're in the picker's fallback list too. UAS Facility Map requires a start point/radius (the nationwide grid is too big to pull unbounded).
Tile-skip check is now O(1) per tile. 1.2.39 was doing one sqlite SELECT per tile during the pre-check (8 000 tiles × ~1 ms = ~8 s of frozen UI). Now one bulk SELECT loads every present (z, x, y) into a Python set; in-Python lookups drop the pre-check to ~50 ms, so the dialog jumps straight past the cached portion instead of crawling through it.
Re-Load skips tiles you already downloaded. The MBTiles writer now exposes a has(z, x, y) check; download_tiles() filters out tiles already in the local file before issuing any HTTP requests. Re-loading the same area to refresh features = zero tile fetches if the offline basemap is already complete (was: 8 000 wasted server round-trips). Progress bar jumps past the cached portion in a single update so the dialog doesn't spin on 8 000 already-have ticks.
All plugin-generated files now land in the project's own directory. Previously the vector GeoJSON went into <project_dir>/.ltapzmap-cache/ (hidden dot-folder) — now they sit next to the .qgz itself alongside the offline-tile .mbtiles files. Zipping the project folder for sharing or archiving captures everything in one go. Clear All still sweeps both the new location and the legacy .ltapzmap-cache/ from older versions.
Even unsaved projects survive reboot now. 1.2.36 only fixed the case where the project was already saved before Load. If you loaded into a fresh project and saved *after*, the layer sources were still tempdir paths that Windows wiped on reboot. The unsaved-project fallback now writes to <QGIS profile>/cache/ltapzmap/ (per-user persistent cache) instead of the system tempdir, so layers resolve correctly whether you save before or after Load.
To recover an already-broken project: in the "Handle Unavailable Layers" dialog → Remove Unavailable Layers → re-Load → save. New files land in a reboot-safe location.
Layers survive reboot when the project is saved. GeoJSON files used to land in AppData/Local/Temp/, which Windows wipes on reboot / Disk Cleanup — re-opening a saved .qgz then showed every layer as "Unavailable". They now land in <project_dir>/.ltapzmap-cache/ when the project is saved, same persistence pattern the offline MBTiles already uses. Unsaved projects still fall back to the system tempdir (with the same Windows-purge caveat). Clear All sweeps both locations.
Fix for existing broken projects: in the "Handle Unavailable Layers" dialog, click Remove Unavailable Layers, re-Load, then save the project — the new files go to the persistent cache and the next reopen works.
- Dock is now wrapped in a QScrollArea so users on short or low-resolution displays (Surface tablets etc.) can scroll down to reach the Load / Find / Clear buttons that used to fall below the screen. - About text refreshed and clarified that all festival dates + timestamps the plugin shows are in UTC (no local-time conversion). Festival dropdown rows now display (YYYY-MM-DD → YYYY-MM-DD UTC) so the time zone is explicit.
Repository moved to https://qgis.ltapzmap.com/plugins.xml (was qgis.isitwindy.com). The old URL still works — Caddy serves both names — but the plugin's metadata + landing page now point at the new home. New installs should use the ltapzmap URL.
Tribal lands layer added (BIA AIAN-LAR + Census TIGER + Native-Land.ca ancestral territories — situational-awareness, contact the tribal council before flying). Sourced from the server's on-disk merged GeoJSON via a new subset=tribal_lands branch in /api/v1/features.
Layer auto-discovery: on sign-in the plugin now fetches GET /api/v1/layers and appends any layer the server advertises that isn't in the local hardcoded list. New server-side layers appear in the picker without needing a plugin release.
Caught up with server-side additions: - New Skydive drop zones layer (~225 US OSM drop zones; domain=waypoint, subset=skydives) — active jumping is a real conflict for balloons, so it gets its own toggle. - Three new offline tile sources: MapTiler Streets v2, MapTiler Satellite, MapTiler Hybrid. The server's free-tier quota means they're excluded from festival precache, but each tile still lands in the disk cache on first request — fine for individual pilots. - osm_skydive_dz mapped to a friendly "OSM skydive drop zones" sublayer name.
Plugin description now mentions LTA Go (the live in-flight overlay) and recommends installing both for the full balloon-pilot workflow.
Plugin Manager Changelog tab shows a clickable HTML link to the hosted changelog page (Qt's QTextBrowser honours <a href> tags).
Changelog moved to a hosted page. The plugin's metadata now carries a one-line pointer + URL instead of the full version history; the Plugin Manager's Changelog tab shows the link to this page so QGIS users can read the full history in a browser.
Sign in with email + password instead of pasting an API key. The plugin POSTs credentials to /api/v1/auth/login, the server mints a fresh key, and the plugin stores it; the password is never persisted. Festival dropdown now shows all upcoming festivals (any with end date ≥ today), not just RSVPs.
Full changelog added to plugin metadata; shows in the Changelog tab of the QGIS Plugin Manager.
Festival refresh ↻ defeats every cache layer (server no-store, Qt no-cache headers + AlwaysNetwork, URL cache-bust) so freshly-RSVP'd festivals appear instantly.
Labels visible at every zoom level (removed the 1:250k cutoff that was hiding them at typical pilot-planning zoom); PAL collision detection still skips overlapping labels.
New Find feature in radius (server)… button: search the ltapzmap.com feature DB by name, constrained to the current bbox (festival or radius). Includes features you haven't loaded yet.
Festival picks now download exactly the festival's bbox (was using a circumscribed square ~2× the bbox; corners weren't precached and ran slow). Manual edit of coord/radius reverts to centroid+radius mode.
Max-zoom hint text updated to *"(16 is a good compromise of detail and space)"*.
Dynamic label visibility based on zoom (later revised in 1.2.25).
Festival dropdown: pick an event you've RSVP'd to on ltapzmap.com and auto-populate the start point + radius. API key now required — Settings dialog auto-opens on first launch if no key.
New Find feature in loaded layers… button: live name search across all loaded layers (per-source capped, name-then-description rank), zoom + highlight on pick.
Label font size changes apply to currently-loaded layers immediately (walks Labels + Gridlines subgroups).
Label font size selector in the dock (6–24 pt, persisted across sessions). Gridline labels render 2 pt smaller than feature labels.
Gridlines show their coordinate values as labels (UTM km e.g. "3,700"; lat/lon degrees e.g. "35.0500° N"). Color-matched 7 pt, repeats every 80 mm of screen space.
All loaded groups, subgroups, and layer-symbology legends collapsed by default — no more 30-row layer panel on Load.
"Pilot-drawn" entries inside the Waypoints subgroup now correctly named "Waypoints" (domain-aware empty-source label).
Fix TypeError on QGIS 3.44+ from the LabelPlacement / LabelPredefinedPointPosition enum name collision; uses Qgis.LabelPlacement when available.
Labels moved into a separate "Labels" subgroup with transparent-symbol twin layers — toggle every plugin label on/off with one checkbox.
Gridlines (UTM 1 km + lat/lon graticule) added as a layer option. Client-side generation, no server data needed.
Feature names display as map labels (9 pt bold black with white halo, placement varies by geometry kind; displayAll forces every name through).
New LTA PZ Map groups insert just below the LtaGo! layer instead of at the very top.
Vector-layer dedupe on re-run: re-pulling at the same area updates existing layers in place instead of stacking duplicates. Old tempfiles cleaned up.
Tile-layer dedupe on re-run: re-pulling tiles updates the existing raster layer instead of adding a parallel duplicate.
Clear All now also removes layers added by previous plugin versions / sessions (walks the LTA PZ Map group tree).
Version baseline reset to 1.2.5 (was 0.4.7).
Tile max zoom raised to 20. Batch tile endpoint gracefully returns len=0 for per-tile out-of-range coords instead of 400-ing the whole batch.
Min zoom removed from UI (hardcoded to 1); single Max-zoom spinbox.
Tile max zoom defaults to 16 (was 22) — past that the tile counts explode (~13 k at z=16, ~3.4 M at z=20 for a 50 mi radius).
Bulk tile endpoint: 100 tiles per HTTP request via POST /api/v1/tiles/{source}/batch with a compact binary [u32 LE length][bytes] response. Warm-cache 8 k-tile jobs drop from ~90 s to ~15-20 s.
Insert LTA PZ Map group at the top of the layer tree on first load (was bottom — buried under basemap).
Parallel tile downloads (8 worker threads with persistent HTTPSConnection keep-alive). Server-side per-source upstream concurrency caps (OSM=4, USGS/Esri=8, Google/Bing=12) + one-shot retry with 500 ms backoff on transient upstream errors. New "tile" rate-limit bucket on the server (3,000/min) so parallel fetches don't trip the read budget.
Per-feature colors fix: was using the first feature's color for every layer; now uses QGIS data-defined properties so each feature renders with its own stroke/fill. Supports CSS rgba() in addition to #RGB/#RRGGBB/#RRGGBBAA.
Start-point search by city name, ZIP code, or airport code (FAA LID / ICAO). New /api/v1/search endpoint (refactored from /api/map/search) with bearer auth + simplified result shape.
Offline tiles option: pre-download OSM / USGS topo / Esri imagery / Google satellite + terrain / Bing satellite as a standard MBTiles file alongside your QGIS project. Server-side disk cache (7-day TTL) with per-tile in-flight dedup so a whole event sharing an area only triggers one upstream fetch per tile. 50 mi radius cap.
9-layer picker mirroring the website's LAYER_GROUPS (obstacles, zones, airspace, protected, prisons, powerlines, airports, waypoints, tracks). Per-feature stroke + fill colors from the API.
Initial release.