Releases: jpettitt/weather-radar-card
Release list
v3.8.0-beta2
Beta pre-release. Fixes forecast-heavy configs loading their farthest-future frame before "now". Continues the 3.8.0 beta line — drop-in upgrade from 3.8.0-beta1, no config changes required.
Fixed
- Radar init no longer loads the farthest-future forecast frame before "now" on forecast-heavy configs. For a config like
past_minutes: 0, forecast_minutes: 60, "now" was index 0 and loaded dead last, so the card showed an hour-ahead forecast frame first and took a full sequential pass through every forecast frame before showing current conditions. The load order now always starts at "now" and fans forward through any forecast frames, then backward through any past frames — unchanged for today's common past-only configs. (#246)
Full Changelog: v3.8.0-beta1...v3.8.0-beta2
v3.8.0-beta1
Beta pre-release. Drop-in upgrade from 3.7.3 — no config changes required.
What's new
- Themeable progress bar colors — override the timeline's background, active-segment, and "now" marker colors via YAML to match your dashboard theme. (#233)
progress_bar_background_color: '#222222' progress_bar_active_color: '#4fc3f7' progress_bar_now_color: '#ff9800'
- Timestamps follow Home Assistant's Time format setting — the radar timeline and NWS alert times now defer to your HA profile's 12h/24h preference (Settings → General) instead of guessing from the browser. (#239)
Changed
- Wildfire popup area now matches your HA unit system — hectares for metric, acres for imperial, instead of always showing NIFC's raw acres. The discovery date now follows your HA locale too.
Internal
- CI: bumped
actions/upload-artifactto v7 (Node 24) to clear a GitHub Actions deprecation warning.
Full Changelog: v3.7.3...v3.8.0-beta1
v3.7.3
Stable release. Graduates the 3.7.3 line (
start_paused,preload_while_hidden, DWD server-error handling, marker config-escaping hardening) to stable. Drop-in upgrade from 3.7.2 — no config changes required. The entries below are what changed since3.7.2.
Added
start_pausedoption — start the card paused on the latest radar frame instead of auto-playing the animation loop. The card still refreshes periodically so the displayed frame stays current; tap play to see the full animation. Configurable via YAML or the visual editor's Animation section. Contributed by @knobunc.
start_paused: truepreload_while_hiddenoption — keep fetching fresh radar and hazard-overlay data (wildfires, NWS alerts, wind) on their normal cadence while the card is hidden, instead of the default full pause. Fixes the "popup card reloads from scratch every time it opens" experience (e.g. inside a Bubble Card pop-up): the card resumes playback instantly from already-warm data instead of a multi-second reload. Animation and canvas rendering stay paused while hidden either way — only the underlying data stays fresh. Opt-in, since it means real network/bandwidth use while the card isn't visible.
preload_while_hidden: trueFixed
show_playbackno longer offers a dead playback toolbar for single-frame configs. A card configured withpast_minutes: 0and no forecast shows one static (auto-refreshing) frame — the animation loop never starts, so play/pause/skip had no effect ifshow_playbackwas on. The editor now hides theshow_playbacktoggle in that case, and the toolbar stays off even for hand-written YAML.- A source's own server errors (502/503/504) no longer show as "Rate limited." 5xx responses now get their own "Radar server error — retrying" banner and a longer, capped exponential backoff (up to ~30s between attempts) better suited to a transient outage, instead of being mislabeled and handled with self-throttling pacing.
- Both the rate-limit and server-error banners now clear themselves as soon as a tile loads successfully again, instead of the rate-limit banner sitting there indefinitely or waiting on a fixed 10-second timer.
- Marker
color/iconconfig values are now HTML-escaped before rendering — hardening closing the one gap found in a security audit of external-data rendering (NWS alerts, wildfires, lightning were already consistently escaped).
Full Changelog: v3.7.2...v3.7.3
v3.7.3-beta3
Beta pre-release. New opt-in
preload_while_hiddenoption, plus a marker config-escaping hardening fix. Continues the 3.7.3 beta line — drop-in upgrade from 3.7.3-beta2, no config changes required.
Added
preload_while_hiddenoption — keep fetching fresh radar and hazard-overlay data (wildfires, NWS alerts, wind) on their normal cadence while the card is hidden, instead of the default full pause. Fixes the "popup card reloads from scratch every time it opens" experience (e.g. inside a Bubble Card pop-up): the card resumes playback instantly from already-warm data instead of a multi-second reload. Animation and canvas rendering stay paused while hidden either way — only the underlying data stays fresh. Opt-in, since it means real network/bandwidth use while the card isn't visible.
preload_while_hidden: trueFixed
- Marker
color/iconconfig values are now HTML-escaped before rendering. A security audit of external-data rendering (NWS alerts, wildfires, lightning — all already consistently escaped) turned up one gap:markers:config'scolorandiconfields were interpolated unescaped into the marker's inline SVG/<ha-icon>HTML. Not externally reachable — it's the dashboard owner's own YAML — but a crafted value in a copy-pasted config could break out of the attribute. Closed with the sameescapeHtml()helper already used everywhere else.
Full Changelog: v3.7.3-beta2...v3.7.3-beta3
v3.7.3-beta2
Beta pre-release. DWD server-error handling fix. Continues the 3.7.3 beta line — drop-in upgrade from 3.7.3-beta1, no config changes required.
Fixed
- A source's own server errors (502/503/504) no longer show as "Rate limited." A tile fetch that failed with a generic non-OK status wasn't tagged with its HTTP status code, so it fell into the same handling as a rate-limit response — wrong banner, wrong retry pacing for a server that's up but struggling rather than one we're self-throttling against. 5xx responses now get their own "Radar server error — retrying" banner and a longer, capped exponential backoff (up to ~30s between attempts) better suited to a transient outage. (#223)
- Both the rate-limit and server-error banners now clear themselves as soon as a tile loads successfully again, instead of the rate-limit banner sitting there indefinitely (it previously had no hide path at all) or waiting on a fixed 10-second timer. Recovering also cancels the rate-limit path's fallback full-reinit, so a freshly-recovered loop isn't torn down and rebuilt for no reason. If both conditions are detected at once, each still shows its own banner, but a confirmed server error suppresses the disruptive fallback reinit, since the per-tile backoff is already handling recovery.
Full Changelog: v3.7.3-beta1...v3.7.3-beta2
v3.7.3-beta1
Beta pre-release. New opt-in
start_pausedoption, plus a small editor/toolbar fix for single-frame configs. Drop-in upgrade from 3.7.2 — no config changes required.
What's new
start_pausedoption — start the card paused on the latest radar frame instead of auto-playing the animation loop. The card still refreshes periodically so the displayed frame stays current; tap play (ordouble_tap_action: toggle_play) to see the full animation. Configurable via YAML or the visual editor's Animation section. Contributed by @knobunc.
start_paused: trueFixed
show_playbackno longer offers a dead playback toolbar for single-frame configs. A card configured withpast_minutes: 0and no forecast shows one static (auto-refreshing) frame — the animation loop never starts, so play/pause/skip had no effect ifshow_playbackwas on. The editor now hides theshow_playbacktoggle in that case, and the toolbar stays off even for hand-written YAML.
Internal
start_pausededitor strings translated into all 10 non-English locales (were English-only in the initial cut).
Full Changelog: v3.7.2...v3.7.3-beta1
v3.7.2
Stable release. Graduates the 3.7.2 line to stable. Drop-in upgrade from 3.7.1 — no config changes.
✨ Changed — hazard popups no longer leave the map shifted
Closing a lightning/wildfire/NWS-alert popup now restores the map view.
Popups near the map edge still auto-pan the view to stay fully visible — Leaflet has no way to reposition a popup within the viewport instead. Previously that pan stuck around after you closed the popup, leaving the map off-center from where you had it. The view now returns to where it was once the popup closes. Switching directly between several popups only restores once, at the end, rather than snapping back and re-panning for each one.
🐛 Fix — sections-grid sizing
A card in a fixed-height grid cell now fills the cell instead of overflowing it.
When the card was placed in a sections-view grid cell with a fixed row count (rows ≠ auto), the configured height: (or the 400 px default) was still applied as a min-height. A card taller than the cell overflowed it, and the grid resize handle appeared to do nothing.
The fix: in a fixed-row cell the grid now owns the height — the card fills the cell and ignores both height: and square_map (the editor already greys those out under that constraint, and now disables the height box too). height: / square_map are unchanged in masonry/panel views and in auto-row cells.
The rule, in short:
grid_options.rows |
Height source | height: |
|---|---|---|
auto / absent (or masonry/panel view) |
height: config (or 400 px) |
used |
| a number | the grid cell (rows × row-height) | ignored — resize with the cell handle |
🐛 Fix — console banner showed the wrong version
The console signon banner was stuck reporting version 3.7.0 for four releases (3.7.0-beta2 through 3.7.2-beta1) — a hardcoded literal that never tracked package.json. It's now sourced from package.json at build time, the same way the build timestamp already was, so it can't drift again.
Full Changelog: v3.7.1...v3.7.2
v3.7.2-beta1
Beta pre-release. A targeted layout fix for cards in a fixed-height sections-grid cell. Drop-in upgrade from 3.7.1 — no config changes.
🐛 Fix — sections-grid sizing
A card in a fixed-height grid cell now fills the cell instead of overflowing it.
When the card was placed in a sections-view grid cell with a fixed row count (rows ≠ auto), the configured height: (or the 400 px default) was still applied as a min-height. A card taller than the cell overflowed it, and the grid resize handle appeared to do nothing.
The fix: in a fixed-row cell the grid now owns the height — the card fills the cell and ignores both height: and square_map (the editor already greys those out under that constraint, and now disables the height box too). height: / square_map are unchanged in masonry/panel views and in auto-row cells.
The rule, in short:
grid_options.rows |
Height source | height: |
|---|---|---|
auto / absent (or masonry/panel view) |
height: config (or 400 px) |
used |
| a number | the grid cell (rows × row-height) | ignored — resize with the cell handle |
Full Changelog: v3.7.1...v3.7.2-beta1
v3.7.1
Stable release. Graduates the 3.7.1-beta1 bug fix to stable — unchanged since the beta. Drop-in upgrade from 3.7.0; no config or behaviour changes.
🐛 Fix — if you use NWS watches & warnings, install this
The zone-shape cache was filling localStorage and could break your whole dashboard — not just this card.
The NWS-alerts layer cached zone-boundary polygons in localStorage, whose ~5 MB quota is shared across all of Home Assistant's frontend and every custom card on your dashboard. The full set of US alert zones is ~8,400 zones / ~170 MB of raw GeoJSON (a single marine zone can be ~120 KB), so a heavy watches-and-warnings user filled that quota.
Once the shared quota was full, localStorage writes from other cards and Home Assistant's own frontend also started throwing QuotaExceededError — so one overfull radar card could make unrelated cards across the dashboard misbehave. If you've seen random card breakage alongside heavy NWS alert use, this was very likely the cause.
The fix: the zone cache now lives in IndexedDB (quota is a share of free disk — hundreds of MB+ — the same store HA uses for its icon cache). Geometry is quantised to ~11 m and gzip-compressed (~4× smaller, stored as binary), bounded by a 30-day TTL and an entry-count cap. On first run the card automatically purges the old localStorage zone entries, immediately reclaiming the shared space they occupied.
No config changes. Zones persist reliably again, and the card is no longer a bad neighbour to the rest of your dashboard. Validated on a live full-US map: ~1,800 cached zones in IndexedDB, zero localStorage growth.
Full Changelog: v3.7.0...v3.7.1
v3.7.1-beta1
Beta pre-release. A targeted bug fix for the NWS watches-and-warnings overlay. Drop-in upgrade from 3.7.0 — no config or behaviour changes.
🐛 Fix — if you use NWS watches & warnings, install this
The zone-shape cache was filling localStorage and could break your whole dashboard — not just this card.
The NWS-alerts layer cached zone-boundary polygons in localStorage, whose ~5 MB quota is shared across all of Home Assistant's frontend and every custom card on your dashboard. The full set of US alert zones is ~8,400 zones / ~170 MB of raw GeoJSON (a single marine zone can be ~120 KB), so a heavy watches-and-warnings user filled that quota.
Once the shared quota was full, localStorage writes from other cards and Home Assistant's own frontend also started throwing QuotaExceededError — so one overfull radar card could make unrelated cards across the dashboard misbehave. If you've seen random card breakage alongside heavy NWS alert use, this was very likely the cause.
The fix: the zone cache now lives in IndexedDB (quota is a share of free disk — hundreds of MB+ — the same store HA uses for its icon cache). Geometry is quantised to ~11 m and gzip-compressed (~4× smaller, stored as binary), bounded by a 30-day TTL and an entry-count cap. On first run the card automatically purges the old localStorage zone entries, immediately reclaiming the shared space they occupied.
No config changes. Zones persist reliably again, and the card is no longer a bad neighbour to the rest of your dashboard. Validated on a live full-US map: ~1,800 cached zones in IndexedDB, zero localStorage growth.
Full Changelog: v3.7.0...v3.7.1-beta1