Mid-week follow-up release before Hamvention 2026. Adds the Band Activity heatmap panel, a customizable monospace font, and a one-click clear for PSK Reporter — plus a substantial overhaul of the satellite TLE resolver after a real-world cache-poisoning incident.
Hamvention 2026 is THIS WEEKEND, May 15–17 in Dayton, Ohio! Come visit OpenHamClock at Booth #9518 in the Flea Market area.
✨ New features
- Band Activity heatmap panel (#913) — new dockable panel modeled on DX-Heat's Band Activity matrix. Continent × band grid with gaussian-blurred SVG heatmap blobs over the last 15 / 30 / 60 min of DX-cluster spots. The "Your continent" picker defaults from your callsign via the DXCC table and your override persists to localStorage. Not in the default layout yet — drag it in from the panel picker.
- User-selectable monospace font (#923) — Settings → Display now lets you choose between JetBrains Mono (default), Fira Code (slashed 0), and IBM Plex Mono (slashed 0, wider). One CSS variable drives every monospace surface in the app. Self-hosters: rerun
vendor-download.shonce after this update to fetch the new font files, otherwise the picker falls back to system monospace. - PSK Reporter clear-all button (#933) — trash-can in the PSK panel header wipes TX/RX spots in one click. Useful when changing bands or rigs. Translated into all 16 languages.
- Satellite "VISIBLE" badge — localized (#970, #973, Michael Wheeley) — the green VISIBLE badge in the satellite prediction table now reads from the language table along with the rest of the satellite UI.
🐛 Fixes
- Satellite TLE resolver — major reliability fix — two-commit fix for the issue Alan reported on May 12: ISS, SO-50, AO-91 and a handful of weather geos were stranded in the prod cache for ~7h after a single CelesTrak rate-limit incident. The resolver now uses gentler parallelism (2-wide instead of 5), refuses to overwrite a healthy cache with a materially worse one, deduplicates concurrent refreshes with a shared in-flight Promise, and serves cached data immediately while refreshing in the background. Only the very first cold-boot request blocks on an upstream fetch — no more Cloudflare 524s during the cold-cache window.
- Display Schedule — TV-standby workaround (#901) — scheduled sleep was letting the OS drop HDMI signal, which latched some TVs into standby that wouldn't wake when the schedule ended. New
keepSignalActiveflag (default on) holds the wake lock through the entire sleep window. Opt-out checkbox in Settings → Display Schedule for actual monitors that should power down. - DX Cluster — N1MM UDP spot line direction fix (#961, reported by VK3GA) — N1MM UDP spots were drawing DX→user instead of DX→spotter. An April change had unconditionally filled in your grid square when the spotter's grid was missing. Now restricted to self-spots only.
- What's New — OK button reachable on mobile (#972, Jörg DO1HOZ) — modal height switched to svh units + iOS momentum scrolling enabled so the OK button is always reachable on iOS Safari and Android Chrome.
- Grid square display fix (Jörg DO1HOZ) — pass location object to
latLonToMaidenheadinstead of bare lat/lon — the grid field was rendering blank in certain layouts.
🔧 Refactor & tooling
- Rotator — config cleanup — drops dead
ROTATOR_HOST/ROTATOR_PORTenv vars, validatesROTATOR_PROVIDERagainst the supported set, removes the hardcoded192.168.1.43PSTRotator fallback (warn + disable instead of trying a random LAN IP). - CI translation sort gate (#971, Michael Wheeley) —
check-json-keysworkflow +npm run lang:sort/lang:checkscripts keep allsrc/lang/*.jsonfiles in consistent VSCode-native key order, eliminating merge churn from editor disagreement.
📦 Deployer notes
- Rerun
vendor-download.shonce on each deploy host to fetch the new Fira Code / IBM Plex Mono font assets. - No other manual steps required. WhatsNew modal will surface automatically on first page-load after the update.
Full Changelog: v26.3.2...v26.3.3
Docker image: ghcr.io/accius/openhamclock:26.3.3
docker pull ghcr.io/accius/openhamclock:26.3.3