Releases: MeshAddicts/meshinfo
v3.6.1
v3.6.0
What's Changed
- chore(deps): update emscripten/emsdk docker tag to v3.1.74 by @renovate[bot] in #447
- chore(deps): update frontend-deps by @renovate[bot] in #448
- chore(deps): update dependency postcss to v8.5.12 by @renovate[bot] in #449
- build(deps): bump protocol-buffers-schema from 3.6.0 to 3.6.1 in /frontend by @dependabot[bot] in #435
- Map and node panel UX improvements (#437, #444, #445, #434) by @SimmerV in #450
Full Changelog: v3.5.0...v3.6.0
v3.5.0
MeshInfo v3.5.0 — Mobile-first map
The map page is now easier to interact with on phones.
What's new
Bottom-sheet tool panels on mobile
Coverage, LOS, Scan, and the map settings now slide up from the bottom of the screen as native-feeling bottom sheets. Swipe down on the handle or header to dismiss, swipe up to expand to full height. The map stays visible above the sheet so you can see what your tool is analyzing in context. Desktop layouts are unchanged.
Tighter mobile top bar
- The search field now collapses to a single icon and expands only when you tap it — no more truncated placeholders or overlapping pills.
- The tools drawer is compact on mobile (the cyan ring tells you a tool is active).
- The mesh health widget shows just the online count; the expanded stats panel no longer shoves the button out of place when you open it.
Filters in one place
The scattered filter pills at the bottom-left have been consolidated into a Filters section inside the main map settings panel. Everything — last-seen window, link mode, clustering, role, channel — lives in one spot now, on both desktop and mobile.
In their place, a single indicator pill at the bottom-left shows:
- "No filters" (muted) when nothing is applied — click it to jump straight to the Filters section.
- "N filters" (cyan) when any filter is active — click to see each one as a dismissible chip, or use "Reset all" to clear the lot.
The map settings panel also lets you keep multiple sections open at once now (Filters + 3D Terrain + My Node, all expanded simultaneously if you want).
3D terrain on by default
First-time Mapbox sessions now land with 3D terrain already enabled — the RF tools all assume it, and the map looks dramatically better with it on. If you had previously toggled it off, your preference is preserved.
Scan long-press hint
Right-click is a desktop gesture. On mobile you now see "Long-press a class to toggle its map visibility" in the Scan results panel — the underlying behavior already worked on mobile, just the instruction was misleading.
Nice-to-haves
- iOS pull-to-refresh is disabled map-wide, so dragging a sheet no longer accidentally reloads the page.
- Filter dropdowns inside the settings panel no longer dismiss the panel when you pick an option.
Upgrade notes
No breaking changes. Pull the latest image:
docker pull ghcr.io/meshaddicts/meshinfo-spa:latest
docker pull ghcr.io/meshaddicts/meshinfo:latest
Known limitation
On some mobile browsers, swipe-up-to-expand snaps the sheet height rather than animating it smoothly (swipe-down-to-dismiss and collapse-from-expanded are fine). Functionally identical, just a visual rough edge. Tracked for a follow-up release.
See also
v3.4.1
v3.4.1
Deployment fixes for the toolbox in v3.4.0. No frontend behavior changes — if you're running from source or were lucky with your Docker cache, 3.4.0 may have worked fine for you. If you pulled ghcr.io/meshaddicts/meshinfo-spa:latest from CI and the Coverage tool showed "Coverage model unavailable — the ITM WebAssembly module failed to load," this release is for you.
What was broken
Two independent issues broke Coverage in the published prod image:
Dockerfile.spanever compiled the WebAssembly module. The build ranyarn build, butyarn build:wasmis a separate Docker-in-Docker step that CI didn't invoke — so the placeholderitm.jsshipped to production.- Even with a real WASM, Vite wasn't copying it into the dist. The worker's dynamic import carries
@vite-ignore, so Vite leaves the URL literal — the file must exist at the exact served URL/generated/itm/itm.js.
Fixes
- Multi-stage Docker build —
Dockerfile.spa+Dockerfile.spa.devnow have a dedicatedwasm-buildstage usingemscripten/emsdk:3.1.65that compiles NTIA ITM v1.4. Artifacts copied intosrc/generated/itm/(for tsc) andpublic/generated/itm/(Vite serves verbatim to dist). linux/amd64pin on the WASM stage — emsdk only publishes amd64; arm64 CI runners emulate via QEMU for this stage only. The final runtime image is still fully native arm64..dockerignore— excludes hostfrontend/node_modulesand WASM vendor/build dirs so local Docker builds don't clobber the container's fresh install.- Caddy SPA routing —
Caddyfile.frontendnow returns real 404s for missing static assets instead of falling through toindex.html. The old behavior let CDNs (Cloudflare, etc.) cachetext/htmlresponses at asset URLs for hours, which was how this bug surfaced asNS_ERROR_CORRUPTED_CONTENTin browsers even after the fix was deployed.
v3.4.0 — RF Toolbox
A major upgrade to the Map page. This release adds a full terrain-aware RF toolbox for predicting and analyzing mesh link performance, 3D terrain rendering, and a wave of map UX polish. No breaking changes — everything existing still works exactly as before.
✨ New RF Toolbox
Three new tools live behind the new Tools pill in the top-left of the map:
🎯 Coverage
Paint where a node can realistically reach. Click a node (or anywhere on the map for a "virtual" location), pick hardware, antenna, and modem preset, and get a live, terrain-aware reachability raster.
- Powered by the NTIA Longley-Rice (ITM) propagation model, compiled to WebAssembly and validated against the published reference cases
- Asymmetric RX profile — model a different radio / antenna / height on the receive side (e.g. a basestation reaching a handheld)
- Detail tiers: Standard → High → Ultra → Survey (up to 2048² paint pixels)
- Iso-margin contours overlay at 0 / +10 / +20 dB
- Visibility rays — per-azimuth sightlines that stop at real horizon obstructions
- Export to GeoJSON or KML (open in SPLAT!, Google Earth, or QGIS)
- Draggable pin — reposition without re-selecting
- Environment selector for urban / suburban / rural clutter compensation
- Reliability presets (Median / Typical / Conservative) controlling ITM time/location/situation percentages
📐 Line-of-Sight (LOS)
Analyze the geometric link between two nodes.
- Interactive elevation profile with Fresnel zone overlay
- 3D LOS tube rendered on the map with obstruction pylons where the path clips terrain
- Longley-Rice path-loss number alongside the geometric analysis
- Asymmetric endpoints — per-side hardware, antenna, and height
📡 Scan
"Best neighbors" ranking: who can my node actually reach within 200 km?
- ITM-backed per-candidate path-loss
- Class filters (Clear / Fresnel / Diffracted / Blocked) with right-click to toggle each class on the map
- Draggable origin pin — drop anywhere, scan recomputes instantly
- "Return to overview" pinned at top of the results list to snap the map back after flying to a target
- Independent link-budget config (own hardware / antenna / preset / environment)
⏸ Traceroute
Traceroute ships parked behind a "Coming soon" label while we polish the UX. All the code is in the branch; watch for a follow-up release.
🌍 3D Terrain (Mapbox)
Drapes the map over real elevation with an exaggeration slider. Required for the new RF tools. Toggle on via Map Settings → 3D Terrain (or click a greyed tool — it jumps you straight there).
🍩 Donut Cluster Markers
When nodes cluster at low zoom, the cluster bubble now shows the online/offline ratio as a proportional ring — green segment for online, gray for offline. Terrain-aware positioning keeps donuts anchored to real ground elevation on 3D terrain. Click to zoom in; co-located nodes auto-spiderfy.
🗺 Map UX polish
- Search bar with node autocomplete (hit
/to focus), URL state sync, and keyboard shortcuts - Role-based node colors + filter pills for role and channel on the quick-controls bar
- Mesh health widget in the corner
- Telemetry sparklines in the node details panel
- Link hover — hovering a neighbor row in the details panel highlights that link on the map
- Curved arcs for mutual links; dash patterns distinguish heard / heard-by / mutual
- Fixed-size Map Settings panel with collapsible sections (Appearance / 3D Terrain / My Node / Export)
- Export as PNG button to snapshot the current view
- Better donut cluster visibility — bigger markers, count-weighted text, spiderfy leg shadows for visibility on light imagery
- Click anywhere outside a tool panel (including on the map) to close open popovers without exiting the tool
🎯 Accuracy improvements
- Tilezen DEM replaces Mapbox's
terrain-rgbas the primary elevation source — ≈10 m native resolution (USGS 3DEP in the US, SRTM globally) vs the previous ~30 m, with cleaner bare-earth in forested regions - Zoom-invariant pin elevation —
queryTerrainElevationis now called with{ exaggerated: false }everywhere, so the elevation pill and coverage origin always read true MSL metres regardless of the exaggeration slider - Chipset-aware RX sensitivity — SX1276-based boards (Heltec LoRa32 v2 etc.) now correctly get a +2 dB sensitivity penalty vs SX1262
- Scan now applies clutter loss and honours the user-configured link budget (previously used hardcoded defaults)
📖 Legend
Updated to explain the new visuals:
- Cluster donut ring = online ratio
- Selected node highlight
- Clearer directional labels for link types
🚀 Performance
- Parallel ITM compute across a Web Worker pool (~5.8× on 8 cores), with per-slice progress indicator and user Cancel
- Donut cluster rebuilds debounced (120 ms) on map pan
- Coverage raster uploads via Blob URL instead of data URL (skips ~100–200 ms base64 encoding at Survey resolution)
- Coverage tool-close path reclaims the GPU texture
- Cursor-elevation readout pauses during marker drag so the origin pin tracks the cursor without stutter
🧹 Under the hood
- NTIA ITM v1.4 vendored and compiled to WebAssembly (
frontend/wasm/itm/) - New propagation / DEM / viewshed modules (
itm.ts,terrainRgb.ts,terrainDEM.ts,viewshed.ts,coverageRaster.ts,coverageContours.ts,coverageRays.ts,losTubeLayer.ts,scanAnalysis.ts,spiderfy.ts) - 12,400+ lines of new frontend code; ~1,700 lines of comment cleanup across 40 existing files
- Full TypeScript strict-null compliance
🔮 Coming next
- Traceroute re-enablement with UX polish
- OpenStreetMap provider upgrade to MapLibre GL for full tool parity on the free-tier map
No breaking changes. Safe drop-in upgrade from v3.3.x.
v3.4.0
v3.4.0 — RF Toolbox
A major upgrade to the Map page. This release adds a full terrain-aware RF toolbox for predicting and analyzing mesh link performance, 3D terrain rendering, and a wave of map UX polish. No breaking changes — everything existing still works exactly as before.
✨ New RF Toolbox
Three new tools live behind the new Tools pill in the top-left of the map:
🎯 Coverage
Paint where a node can realistically reach. Click a node (or anywhere on the map for a "virtual" location), pick hardware, antenna, and modem preset, and get a live, terrain-aware reachability raster.
- Powered by the NTIA Longley-Rice (ITM) propagation model, compiled to WebAssembly and validated against the published reference cases
- Asymmetric RX profile — model a different radio / antenna / height on the receive side (e.g. a basestation reaching a handheld)
- Detail tiers: Standard → High → Ultra → Survey (up to 2048² paint pixels)
- Iso-margin contours overlay at 0 / +10 / +20 dB
- Visibility rays — per-azimuth sightlines that stop at real horizon obstructions
- Export to GeoJSON or KML (open in SPLAT!, Google Earth, or QGIS)
- Draggable pin — reposition without re-selecting
- Environment selector for urban / suburban / rural clutter compensation
- Reliability presets (Median / Typical / Conservative) controlling ITM time/location/situation percentages
📐 Line-of-Sight (LOS)
Analyze the geometric link between two nodes.
- Interactive elevation profile with Fresnel zone overlay
- 3D LOS tube rendered on the map with obstruction pylons where the path clips terrain
- Longley-Rice path-loss number alongside the geometric analysis
- Asymmetric endpoints — per-side hardware, antenna, and height
📡 Scan
"Best neighbors" ranking: who can my node actually reach within 200 km?
- ITM-backed per-candidate path-loss
- Class filters (Clear / Fresnel / Diffracted / Blocked) with right-click to toggle each class on the map
- Draggable origin pin — drop anywhere, scan recomputes instantly
- "Return to overview" pinned at top of the results list to snap the map back after flying to a target
- Independent link-budget config (own hardware / antenna / preset / environment)
⏸ Traceroute
Traceroute ships parked behind a "Coming soon" label while we polish the UX. All the code is in the branch; watch for a follow-up release.
🌍 3D Terrain (Mapbox)
Drapes the map over real elevation with an exaggeration slider. Required for the new RF tools. Toggle on via Map Settings → 3D Terrain (or click a greyed tool — it jumps you straight there).
🍩 Donut Cluster Markers
When nodes cluster at low zoom, the cluster bubble now shows the online/offline ratio as a proportional ring — green segment for online, gray for offline. Terrain-aware positioning keeps donuts anchored to real ground elevation on 3D terrain. Click to zoom in; co-located nodes auto-spiderfy.
🗺 Map UX polish
- Search bar with node autocomplete (hit
/to focus), URL state sync, and keyboard shortcuts - Role-based node colors + filter pills for role and channel on the quick-controls bar
- Mesh health widget in the corner
- Telemetry sparklines in the node details panel
- Link hover — hovering a neighbor row in the details panel highlights that link on the map
- Curved arcs for mutual links; dash patterns distinguish heard / heard-by / mutual
- Fixed-size Map Settings panel with collapsible sections (Appearance / 3D Terrain / My Node / Export)
- Export as PNG button to snapshot the current view
- Better donut cluster visibility — bigger markers, count-weighted text, spiderfy leg shadows for visibility on light imagery
- Click anywhere outside a tool panel (including on the map) to close open popovers without exiting the tool
🎯 Accuracy improvements
- Tilezen DEM replaces Mapbox's
terrain-rgbas the primary elevation source — ≈10 m native resolution (USGS 3DEP in the US, SRTM globally) vs the previous ~30 m, with cleaner bare-earth in forested regions - Zoom-invariant pin elevation —
queryTerrainElevationis now called with{ exaggerated: false }everywhere, so the elevation pill and coverage origin always read true MSL metres regardless of the exaggeration slider - Chipset-aware RX sensitivity — SX1276-based boards (Heltec LoRa32 v2 etc.) now correctly get a +2 dB sensitivity penalty vs SX1262
- Scan now applies clutter loss and honours the user-configured link budget (previously used hardcoded defaults)
📖 Legend
Updated to explain the new visuals:
- Cluster donut ring = online ratio
- Selected node highlight
- Clearer directional labels for link types
🚀 Performance
- Parallel ITM compute across a Web Worker pool (~5.8× on 8 cores), with per-slice progress indicator and user Cancel
- Donut cluster rebuilds debounced (120 ms) on map pan
- Coverage raster uploads via Blob URL instead of data URL (skips ~100–200 ms base64 encoding at Survey resolution)
- Coverage tool-close path reclaims the GPU texture
- Cursor-elevation readout pauses during marker drag so the origin pin tracks the cursor without stutter
🧹 Under the hood
- NTIA ITM v1.4 vendored and compiled to WebAssembly (
frontend/wasm/itm/) - New propagation / DEM / viewshed modules (
itm.ts,terrainRgb.ts,terrainDEM.ts,viewshed.ts,coverageRaster.ts,coverageContours.ts,coverageRays.ts,losTubeLayer.ts,scanAnalysis.ts,spiderfy.ts) - 12,400+ lines of new frontend code; ~1,700 lines of comment cleanup across 40 existing files
- Full TypeScript strict-null compliance
🔮 Coming next
- Traceroute re-enablement with UX polish
- OpenStreetMap provider upgrade to MapLibre GL for full tool parity on the free-tier map
No breaking changes. Safe drop-in upgrade from v3.3.x.
v3.3.6
What's Changed
- fix: hardware display and online filter deep link by @SimmerV in #414
- feat: track node channel and add modem preset filtering by @SimmerV in #417
- feat: add /lookupuser Discord command for reverse node lookup by @SimmerV in #418
- chore(deps): update frontend-deps by @renovate[bot] in #415
- chore(deps): update dependency vite to v8.0.5 [security] by @renovate[bot] in #426
- fix: nodes list UX, chat auto-poll, topnodes channel scoping, and timestamp fixes by @SimmerV in #424
Full Changelog: v3.3.5...v3.3.6
v3.3.5
What's Changed
- fix: truncate gateway lists at line boundaries to prevent broken markdown links by @SimmerV in #387
- build(deps): bump brace-expansion from 2.0.2 to 2.0.3 in /frontend by @dependabot[bot] in #388
- build(deps): bump minimatch from 9.0.5 to 9.0.9 in /frontend by @dependabot[bot] in #389
- build(deps-dev): bump vite from 7.3.1 to 8.0.2 in /frontend by @dependabot[bot] in #376
- fix: use Vite env, add mosquitto.conf.sample, update README by @SimmerV in #390
- build(deps-dev): bump typescript from 5.9.3 to 6.0.2 in /frontend by @dependabot[bot] in #375
- fix: calculate hops_away from protobuf for correct gateway hop grouping in Discord bot by @SimmerV in #391
- fix: improve gateway display layout, add metrics, and fix log level filtering for Discord integration by @SimmerV in #392
- chore: Configure Renovate by @renovate[bot] in #395
- chore: enable Renovate automerge for minor and patch updates by @SimmerV in #397
- chore: add node-version group and enable Renovate self-merge by @SimmerV in #405
- chore(deps): update dependency python to v3.14.3 by @renovate[bot] in #400
- chore(deps): update frontend-deps by @renovate[bot] in #398
- chore: add automergeSchedule to allow merging outside weekend window by @SimmerV in #406
- chore: scope node-version automerge to minor/patch updates only - RenovateBot by @SimmerV in #408
- chore(deps): update node-version by @renovate[bot] in #407
- chore(deps): update dependency @vitejs/plugin-react to v6 by @renovate[bot] in #402
- Commit title: chore: align .nvmrc and .tool-versions to node 25.8.2 by @SimmerV in #409
- chore(deps): update node-version to v25.9.0 by @renovate[bot] in #411
- feat: Meshinfo Discord bot: gateway detail button, full-size position maps, and topnodes leaderboard fixes by @SimmerV in #412
New Contributors
Full Changelog: v3.3.4...v3.3.5