MeshMonitor

MeshMonitor · Releases

from GitHub · updated 2026-07-20

20 releases

  1. v4.13.1 # 5 hours ago · 2026-07-20 16:45 UTC

    MeshMonitor v4.13.1

    Building on 4.13's unified map core, this release adds a suite of Link Quality tools for the RF-minded, an early preview of several Meshtastic 2.8 features, and a broad round of map, MQTT, and messaging fixes.

    Highlights: a Terrain Link Profile tool (elevation cross-section, Fresnel zone, and link-budget verdict) on Map Analysis; a per-node signal-trend / link-attenuation badge; Noise Floor on the Node Detail card; and position accuracy + location source surfaced in node popups. The Map Analysis toolbar is now icon-based with Show RF / UDP / MQTT transport toggles, and obscured markers offset intelligently by cell occupancy. On the 2.8 front (an early preview — 2.8 is not officially released yet, so this is built against the firmware development branch and is subject to change), MeshMonitor now decodes the XEdDSA signing shield, MeshBeacon packets, and the MEDIUM_TURBO preset. Also notable: telemetry requests now auto-recover from an upstream firmware NeighborInfo-hijack, a new noindex/robots.txt privacy toggle, and a gateway-aware MQTT Packet Monitor.

    See the release blog post for the narrative walkthrough.

    Link Quality & Terrain Link Profile

    • Terrain Link Profile tool: elevation cross-section + Fresnel zone + link-budget verdict, auto-frequency by region, DEM-void handling, map-mirrored graph cursor (#4143, #4147, #4151, #4170, #4156)
    • Derived signal-trend / link-attenuation badge per node (#4204)
    • Noise Floor on the Node Detail quick-stats card (#4201)
    • Position accuracy + location source in node popups, map & chat (#4188)
    • Latitude/longitude/elevation shown as text in Node Info / Node Details (#4134)

    Map Analysis

    • Icon-based toolbar with labels in tooltips (#4171)
    • Show RF / UDP / MQTT transport toggles (#4135)
    • Occupancy-scaled, distance-capped obscured-node precision offset (#4164, #4168, #4181)
    • "Discard invalid positions" setting, honored on ingest and render (#4158, #4182)
    • Per-theme (light/dark) tileset preferences (#4118)
    • Keep router short-name visible in Official pin style (#4184)
    • Honor Default Map Center on Unified/Dashboard maps (#4128)
    • Fixes: spiderfy opens the correct node (#4203), SNR overlay pins to merged marker (#4169), no route/heatmap render for marker-less or deleted nodes (#4167, #4175)

    Meshtastic 2.8 — Early Preview

    ⚠️ Meshtastic 2.8 is not officially released. This support is built against the firmware development branch and is subject to change as 2.8 evolves.

    • Pin 2.8-preview protobufs (develop@ba16bfc) with a 2.7 TrafficManagement compat shim (#4205)
    • XEdDSA packet-signing shield in the Packet Monitor (#4209)
    • MeshBeacon (MESH_BEACON_APP) decode + firmware-verified preset channel names (#4207)
    • MEDIUM_TURBO modem preset + 2.8 opt-in FAQ (#4200)

    MQTT

    • Gateway-aware MQTT Packet Monitor — per-gateway reception capture + UI (#4127, #4138)
    • Geo-ignore epic: fail-open geo filter, per-source ignore list, retroactive purge/sweep, observability (#4123, #4131, #4132, #4136)
    • Route directed MQTT messages to the DM view, not their channel (#4161)
    • Guard MQTT POSITION ingestion against Null Island fixes (#4150)

    Messages, Nodes & Automation

    • Auto-retry telemetry requests hijacked by the firmware NeighborInfo behavior (#4214)
    • Stop unsynced-clock nodes rendering chat at ~1970 (#4208)
    • MeshCore own-node messages show name, not public key (#4197)
    • Short name shown alongside long name on message senders (#4196)
    • "Message anyway" override for unmessageable nodes (#4187), and clearer hidden-composer messaging (#4140)
    • Remote-admin (non-local) reboot target for the device-reboot automation (#4186)
    • Compose draft scoped per-conversation (#4185)
    • Reliably un-hide nodes from the map across sources (#4141)
    • Traceroute no longer sends on a DISABLED channel slot (#4180)
    • Reject precision-obscured Null Island fixes on ingest (#4149)

  2. v4.13.1-rc4 # Pre-release 1 day ago · 2026-07-19 13:15 UTC

    MeshMonitor v4.13.1-rc4

    ⚠️ Pre-release (release candidate). This build is for testing ahead of the v4.13.1 stable release. Not recommended for production deployments.

    This fourth release candidate continues the Meshtastic 2.8 readiness work and lands a mix of node-detail and map improvements on top of rc3. It adds a noIndexEnabled privacy toggle so a publicly-exposed dashboard can serve X-Robots-Tag: noindex, nofollow headers plus a disallow-all /robots.txt (belt-and-suspenders for Cloudflare-tunnel setups that strip custom headers). On the 2.8 front, it decodes MESH_BEACON_APP with firmware-verified preset channel names, pins the 2.8-preview protobufs with a 2.7 TrafficManagement compat shim, adds an XEdDSA signature shield in the Packet Monitor, and ships the MEDIUM_TURBO preset with 2.8 opt-in docs. Node detail gains a derived signal-trend / link-attenuation badge and a Noise Floor quick-stat. Two bug fixes round it out: chat from unsynced-clock nodes no longer renders at ~1970, and cluster spiderfy no longer opens the popup for a nearby unrelated node.

    Features

    • Privacy: noIndexEnabled toggle serving X-Robots-Tag: noindex, nofollow + disallow-all /robots.txt (#4212, closes #4202)
    • 2.8 / Packet Monitor: XEdDSA signature shield for firmware 2.8 packets (#4209)
    • 2.8 / MeshBeacon: decode MESH_BEACON_APP + firmware-verified preset channel names (#4207)
    • 2.8 / Protobufs: pin 2.8-preview develop@ba16bfc with 2.7 TrafficManagement compat shim (#4205)
    • Nodes: derived signal-trend / link-attenuation badge per node (#4204, closes #4110)
    • Nodes: show Noise Floor on the Node Detail quick-stats card (#4201, closes #4109)
    • 2.8: MEDIUM_TURBO preset, MESH_BEACON_APP portnum, traffic-management & 2.8 opt-in docs (#4200)

    Bug Fixes

    • Messages: stop unsynced-RTC nodes rendering chat at ~1970 (rxTime now clamped to receipt time) (#4208, closes #4206)
    • Map: spiderfy no longer selects a nearby unrelated node instead of fanning the cluster (#4203, closes #4199)

    Issues Resolved

    • #4202 — [FEAT] Robots.txt / X-Robots-Tag toggle to discourage crawlers/bots
    • #4206 — [BUG] Chat from unsynced-clock nodes renders at ~1970
    • #4199 — [BUG] Spiderfy click opens popup for wrong nearby node
    • #4109 — [FEAT] Show Noise Floor on Node Detail quick-stats card
    • #4110 — [FEAT] Derived signal-trend / link-attenuation indicator per node
    • #4074 — Modem preset tables missing MEDIUM_TURBO (enum 16)
    • #3999 — [2.8 tracking] Position & telemetry broadcast now opt-in by default
    • #3547 — Docs: Traffic Management module documentation

    Full changelog: https://github.com/Yeraze/meshmonitor/compare/v4.13.1-rc3...v4.13.1-rc4

    🚀 MeshMonitor v4.13.1-rc4

    📦 Installation

    Docker (recommended):

    docker run -d \
      --name meshmonitor \
      -p 8080:3001 \
      -v meshmonitor-data:/data \
      ghcr.io/Yeraze/meshmonitor:4.13.1-rc4
    

    🧪 Testing

    ✅ All tests passed ✅ TypeScript checks passed ✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7

    📋 Changes

    See commit history for detailed changes.

  3. v4.13.1-rc3 # Pre-release 2 days ago · 2026-07-18 19:43 UTC

    MeshMonitor v4.13.1-rc3

    ⚠️ Pre-release (release candidate). Rolls up 13 PRs merged since rc2 — position-quality & Map Analysis refinements plus a cluster of messaging correctness fixes. Please test and report issues before the stable 4.13.1.

    Highlights

    This RC sharpens position quality and node identity. Node popups now show position accuracy and GPS location source; the "Discard invalid positions" toggle is honored on the render side (not just ingest); and the obscured-node precision offset is occupancy-scaled and distance-capped. On the messaging side it fixes several real correctness bugs: compose drafts no longer leak across conversations (a message meant for one node could be sent to another), MeshCore own-node messages show the node's name instead of a raw public key, and message senders now display their short name alongside the long name. Rounding it out: automations can now target a remote node for admin reboot, unmessageable nodes get a "Message anyway" override, traceroute no longer fails with NO_CHANNEL on a disabled channel slot, and the v1 default source alias scopes correctly.

    Features

    • #4188 — Position accuracy + location source in node popups (chat & map), migration 124
    • #4187 — "Message anyway" override for unmessageable-node DM banner
    • #4186 — Automation: remote-admin reboot target for the device-reboot action
    • #4196 — Show short name alongside long name on message senders (Unified Messages)
    • #4182 — Honor the "Discard invalid positions" toggle on the render side
    • #4181 — Occupancy-log-scaled, distance-capped precision offset for obscured nodes

    Bug Fixes

    • #4197 — MeshCore: own node's messages show the name, not a public key
    • #4191 — v1 default source alias deep-scopes by the resolved id (mergeParams re-derivation)
    • #4185 — Scope the compose draft per-conversation (prevents wrong-recipient sends)
    • #4184 — Keep router short-name visible in the Official pin style
    • #4180 — Traceroute no longer sends on a DISABLED channel slot (NO_CHANNEL)
    • #4175 — Drop heatmap/coverage density for deleted nodes

    Docs

    • #4179 — Meshview Link Responder added to the User Scripts Gallery

    Full changelog: https://github.com/Yeraze/meshmonitor/compare/v4.13.1-rc2...v4.13.1-rc3

    🚀 MeshMonitor v4.13.1-rc3

    📦 Installation

    Docker (recommended):

    docker run -d \
      --name meshmonitor \
      -p 8080:3001 \
      -v meshmonitor-data:/data \
      ghcr.io/Yeraze/meshmonitor:4.13.1-rc3
    

    🧪 Testing

    ✅ All tests passed ✅ TypeScript checks passed ✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7

    📋 Changes

    See commit history for detailed changes.

  4. v4.13.1-rc2 # Pre-release 3 days ago · 2026-07-17 20:04 UTC

    MeshMonitor v4.13.1-rc2

    ⚠️ Pre-release (release candidate). For testing ahead of the 4.13.1 final. No :latest Docker tags are published for RC builds.

    This RC is a Map Analysis release: it lands the full Terrain Link Profile tool and a wave of map-accuracy improvements on top of v4.13.1-rc1. Plan a link between two points and MeshMonitor now profiles the terrain between them, draws the Fresnel zone, computes a link budget, and colors a clear/marginal/obstructed verdict — with per-source auto-frequency and RX-sensitivity defaults. As you scrub the elevation graph, a marker now tracks the matching spot on the map so you can see exactly where a given point on the profile sits. Obscured-GPS (reduced precision_bits) markers are now decluttered intelligently — a node alone in its accuracy cell stays centered, and only nodes that actually share a cell are spread — applied consistently across the Dashboard, Nodes, and Map Analysis maps from one shared implementation. Position quality also got a hard look: Null Island (0,0) fixes are now rejected on ingest across Meshtastic, MeshCore, and MQTT (including the precision-obscured (0,0) fixes that used to slip through as ~0.013°), with a new Discard invalid positions Map setting to control it. The Map Analysis toolbar was tidied into icons (labels move to tooltips) to cut clutter, MQTT-sourced direct messages now render in the DM view instead of as broadcasts, and several map layers stopped drawing artifacts for marker-less nodes. Internally, the CI pipeline's Node-24 coverage hang was eliminated so future builds are faster and don't wedge.

    ✨ Features

    • Terrain Link Profile tool — profile terrain, Fresnel clearance, and link budget between two points, with clear/marginal/obstructed verdict coloring, per-source auto-frequency + RX-sensitivity defaults, DEM-void handling, and a settings UI (#4147, #4151)
    • Link Profile graph → map hover marker — moving the cursor over the elevation graph drops a marker on the map at the corresponding geographic point along the link (#4170)
    • Smarter obscured-node decluttering — the within-cell offset for low-precision_bits markers now only spreads nodes that actually share an accuracy cell; a lone node stays at its reported center (#4164, closes #4155)
    • Discard invalid positions — a new global Map setting to control whether Null Island / invalid GPS fixes are discarded on ingest (default on = current behavior) (#4158)
    • Icon toolbar for Map Analysis — action and layer buttons are now icons with the text as tooltip/aria-label, decluttering the top bar (#4171)

    🐛 Bug Fixes

    • Reject precision-obscured Null Island fixes on Meshtastic ingest — a true-(0,0) node on a reduced-precision channel arrives re-centered as ~(0.013°, 0.013°) and used to slip past the filter (#4149, #4150, #3763)
    • Route MQTT-sourced direct messages to the DM view instead of rendering them as channel/broadcast messages (#4161, closes #4152)
    • Stop drawing route segments & heatmap density for marker-less (position-stripped) nodes (#4167, closes #4162 / #4163)
    • Pin the SNR overlay dots to the merged marker position for multi-source nodes (#4169, closes #4166)

    ♻️ Refactoring

    • Consolidate the obscured-GPS within-cell offset into one shared occupancy-gated implementation used by every map surface — no more per-map "snowflake" behavior (#4168)

    🔧 CI / DevOps

    • Remove the unused coverage/Codecov runner that hung @vitest/coverage-v8 for 30+ min on Node 24, repeatedly blocking merges — CI is now faster and hang-free (#4172)

    📝 Docs

    • Link Profile documentation accuracy pass — multi-source auto-frequency, REST API reference, anchor fixes (#4156)

    Issues Resolved

    #4111 (Terrain Link Profile epic — Phases 2 & 3) · #3763 (Null Island filtering) · #4152 (MQTT directed-message rendering) · #4155 (lone-node offset) · #4162 · #4163 · #4166

    Upgrade Notes

    No breaking changes and no manual migration …

  5. v4.13.1-rc1 # Pre-release 4 days ago · 2026-07-16 17:43 UTC

    MeshMonitor v4.13.1-rc1

    ⚠️ Pre-release / Release Candidate. This build is for testing. It ships no :latest Docker tags. Please report any issues before the final 4.13.1 release.

    Summary

    This release resolves the long-running #4115 investigation where specific nodes produced zero data over MQTT: the geo filter is rearchitected from a fail-closed membership gate (which permanently blackholed GPS-less nodes and froze on encrypted feeds) to a fail-open, per-source ignore-list model with retroactive purge, automatic reappearance when a node comes back in-bounds, and a start/config-change sweep — shipped across four phases (#4123, #4131, #4132, #4136). A new MQTT Packet Monitor lands (per-gateway reception capture backend #4127 plus a gateway-aware UI #4138). Map and node UX improvements include lat/lon/elevation shown as text in Node Info/Details (#4134), Show RF/UDP/MQTT transport toggles in Map Analysis (#4135), per-theme light/dark map tilesets (#4118), and a backend elevation service for upcoming terrain link profiles (#4143). Two reported bugs are fixed: nodes can now be reliably un-hidden from the map across sources (#4141), and the Conversation page explains why the DM composer is hidden for unmessageable nodes (#4140). Also fixed: a Default Map Center regression on the Unified/Dashboard map (#4128), MeshCore-only installs whose global schedulers never started (#4146), and a stale-config Docker armv7 build (#4122). Finally, two latent cross-platform bugs surfaced during release validation were fixed: a directory case-collision that broke the macOS/Windows desktop build (#4144), and a MySQL 8 collation mismatch that aborted a migration on MySQL deployments (#4145).

    Features

    • MQTT geo-ignore rearchitecture (fixes #4115): fail-open ingestion with a per-source ignore list, retroactive purge, and auto-reappearance — #4123 (data layer), #4131 (fail-open gating), #4132 (retroactive sweep), #4136 (observability + docs)
    • MQTT Packet Monitor: per-gateway packet reception capture — #4127 (backend), #4138 (gateway-aware UI)
    • Show latitude/longitude/elevation as text in Node Info & Node Details — #4134
    • Map Analysis: Show RF / UDP / MQTT transport toggles — #4135
    • Per-theme (light/dark) map tileset preferences, including custom tiles — #4118
    • Backend elevation service for terrain link profiles (Phase 1) — #4143

    Bug Fixes

    • Reliably un-hide nodes from the map across sources; consolidate orphaned rows from removed sources — #4141
    • Explain the hidden DM composer for unmessageable nodes — #4140
    • Honor the Default Map Center setting on the Unified/Dashboard map — #4128
    • Keep global schedulers alive on MeshCore-only installs — #4146
    • Migration 122: fix illegal collation mix on MySQL 8 — #4145
    • Consolidate Mqtt/ into MQTT/ to fix the desktop-build case-collision on macOS/Windows — #4144
    • Drop deleted watchdog scripts from the armv7 Dockerfile — #4122

    Chore

    • Bump version to 4.13.1-rc1 — #4142

    Issues Resolved

    #4115, #4137, #4139, #4130, #4129, #4125, #4124, #4096, #4020

    Full changelog: https://github.com/Yeraze/meshmonitor/compare/v4.13.0...v4.13.1-rc1

    🚀 MeshMonitor v4.13.1-rc1

    📦 Installation

    Docker (recommended):

    docker run -d \
      --name meshmonitor \
      -p 8080:3001 \
      -v meshmonitor-data:/data \
      ghcr.io/Yeraze/meshmonitor:4.13.1-rc1
    

    🧪 Testing

    ✅ All tests passed ✅ TypeScript checks passed ✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7

    📋 Changes

    See commit history for detailed changes.

  6. v4.13.0 # 5 days ago · 2026-07-15 18:35 UTC

    MeshMonitor v4.13.0

    MeshMonitor 4.13.0 is the largest release of the 4.x line, stabilized through three release candidates. The headline is the Map Consolidation epic: every map surface — Dashboard, Nodes, Map Analysis, MeshCore, Unified, and embeds — now shares one rendering core, one layer library, and one popup family, so features and fixes land everywhere at once. On top of that come node selection and Follow mode, a distance-measurement tool, a polar grid overlay, and a long list of map interaction fixes. MeshCore gains message delete/purge, automatic send retries, Auto-Pathfinding target filtering, a configurable CLI timeout, and a completed Virtual Node command surface. Automations pick up multi-channel triggers, a scheduled device-reboot action, and per-source tapback routing. The long-standing "low-battery alerts silently never fire" bug — reported five separate times — is fixed at its root. Under the hood, a major architecture remediation unified the source-manager registry, moved fresh installs to migration-replay bootstrap, and deleted the legacy synchronous database API. Three deliberate breaking changes ship in this release: auto-upgrade is retired, TRUST_PROXY defaults to false, and source-scoped API endpoints require an explicit sourceId — see Upgrade Notes below. Docker users: :latest now only moves on stable releases like this one; RCs publish to :dev.

    📖 Release announcement · Full changelog

    Features

    Maps

    • Map Consolidation epic: shared BaseMap shell, layer library, unified node-marker factory, one popup family, canonical traceroute rendering on all maps including embeds — #4049, #4051, #4057, #4060, #4064, #4065, #4066, #4067, #4068 (epic #4047)
    • Node selection, emphasis & Follow mode with auto-zoom on Map Analysis — #4010, #4012 (#3788)
    • Node-to-node line-of-sight distance measurement tool on all maps — #4013 (#3636)
    • Polar grid overlay (Map Analysis, Unified, MeshCore) — #3983, #4071 (#3971)
    • Pan/zoom/spiderfy interaction polish: zoom clamp, scaled animations, zoom-gated spiderfy — #4072 (#4046)

    MeshCore

    • Delete/purge messages: per-message, per-conversation, purge-all — #3984 (#3981)
    • Automatic DM retry via same-path + flood cadence; opt-in auto-retry for automated channel sends — #3980, #3988 (#3977, #3979)
    • Auto-Pathfinding target filtering: allowlist, name regex, last-heard, hops, signal — #4039 (#4024)
    • Configurable remote/local CLI reply timeout — #4033 (#4027), honored in VN relay via #4107
    • Virtual Node: relay status requests & neighbour queries — #3991, #3993 (#3904)
    • Collapsible node list for mobile map access — #4079

    Automation

    • Multi-channel message trigger OR-list — #3982 (#3974)
    • Scheduled device-reboot action — #4002 (#3995)
    • "Send via sources" selector on the tapback action — #3997 (#3996)

    Other

    • UDP Broadcast network setting (enabled_protocols) exposed — #4113 (#4112)
    • Update-available notifications with per-deployment upgrade instructions (replaces auto-upgrade) — #4108

    Bug Fixes

    • Low-battery/inactive-node alerts lost to split per-source notification preferences — #4035 (#3417, #3462, #3671, #3884, #4020); leftover UNIQUE(user_id) autoindex dropped — #4045 (#4044)
    • Map: popup/spiderfy decoupling + obscured-marker declutter on all maps — #4022, #4028 (#4015, #4016)
    • Map: click no longer snaps view back or freezes interaction; wheel zoom, zoom-to-node, chunk-reload self-heal — #4071, #4080, #4082, #4098
    • Map: Null Island / out-of-range positions filtered from markers and line endpoints — #4077, #4078, #4099, #4101, #4103
    • Map: ROUTER_LATE renders as repeater tower — #4076 (#4075); tileset switch no longer remounts/flickers the raster layer — #4097
    • Dashboard map: neighbor lines honor the configured map endpoint — #4055 (#4042), thanks @temalo
    • MeshCore: automation DM triggers populate …
  7. v4.13.0-rc3 # Pre-release 7 days ago · 2026-07-13 18:11 UTC

    MeshMonitor v4.13.0-rc3

    ⚠️ Pre-release (Release Candidate). This build is for testing the 4.13.0 map-consolidation and MeshCore work ahead of the stable release. Not recommended for production; back up your database before upgrading.

    This release candidate builds on rc2 with a focused round of map interaction fixes and a MeshCore Virtual Node correctness fix. The map work resolves several regressions from the map-consolidation epic: click-to-pan now targets the actual node marker instead of the raw center, user gestures (zoom/pan) correctly cancel node-centering instead of snapping back and freezing, and raster tile layers no longer remount and flicker when the tileset changes. Null Island (0,0) coordinates are now filtered from both markers and line endpoints, and out-of-range/invalid node positions are detected and trimmed. Pan/zoom/spiderfy behavior was polished with a zoom clamp, scaled animations, and zoom-gated spiderfy. ROUTER_LATE nodes again render as repeater-tower icons on the NodesTab and Dashboard maps. On MeshCore, the Virtual Node login now relays the admin flag and firmware level, and the mobile node list is collapsible so the map is reachable without selecting a node. This candidate also folds in a large batch of dependency updates and a translations refresh.

    Features

    • Map: pan/zoom/spiderfy interaction polish — zoom clamp, scaled animations, zoom-gated spiderfy, re-spiderfy on zoom (#4072, resolves #4046)
    • MeshCore: collapsible node list — reach the map on mobile without selecting a node (#4079)

    Bug Fixes

    Map

    • Click pans to the node marker, not the raw center, for obscured nodes (#4082)
    • User gesture cancels node-centering — zoom no longer snaps back (#4098)
    • Fixed map snapping back to node on click and freezing interaction (#4080)
    • Stopped raster tile layer remounting on tileset change (abort/flicker) (#4097)
    • Detect and trim out-of-range (invalid) node positions (#4099)
    • Widen Null Island radius + skip it in the unified merge (#4077)
    • Null-island filter for line endpoints — routes + neighbors no longer run to 0,0 (#4078)
    • ROUTER_LATE renders as a repeater-tower icon on NodesTab + Dashboard maps (#4076, resolves #4075)
    • Integrate resolveMapEndpoint into DashboardMap neighbor lines (#4055, resolves #4042)
    • Post-epic fixes: wheel zoom, zoom-to-node, chunk-reload self-heal; MeshCore polar grid + map loading states (#4071)

    MeshCore

    • Relay admin flag + firmware level in Virtual Node login (#4095, resolves #4094)

    Translations

    • Translations update from Hosted Weblate (#4006)

    Dependencies

    • Bump the production-dependencies group with 9 updates (#4084)
    • Bump the development-dependencies group with 3 updates — @types/node, eslint, vitest (#4083)
    • Bump protobufjs 8.6.6 → 8.7.0 (#4090)
    • Bump helmet 8.2.0 → 8.3.0 (#4092)
    • Bump lucide-react 1.22.0 → 1.24.0 (#4085)
    • Bump re2 1.25.0 → 1.26.0 (#4088)
    • Bump @typescript-eslint/eslint-plugin 8.62.1 → 8.63.0 (#4089)
    • Bump @typescript-eslint/parser 8.62.1 → 8.63.0 (#4087)

    Issues Resolved

    • #4094 — MeshCore: Virtual Node functionality still does not work correctly
    • #4093 — MeshCore: Channels no longer marked unread
    • #4075 — ROUTER_LATE renders as generic pin (not repeater tower icon) on NodesTab and Dashboard maps
    • #4046 — Map UI: improve pan/zoom-to-center behavior and its interaction with marker spiderfy
    • #4042 — Dashboard Unified map: neighbor-info lines don't follow merged node marker position

    Full changelog: https://github.com/Yeraze/meshmonitor/compare/v4.13.0-rc2...v4.13.0-rc3

    🚀 MeshMonitor v4.13.0-rc3

    📦 Installation

    Docker (recommended):

    docker run -d \
      --name meshmonitor \
      -p 8080:3001 \
      -v meshmonitor-data:/data \
      ghcr.io/Yeraze/meshmonitor:4.13.0-rc3
    

    🧪 Testing

    ✅ All tests passed ✅ TypeScript checks passed ✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7

    📋 Changes

    See commit history for detailed changes.

  8. v4.13.0-rc2 # Pre-release 9 days ago · 2026-07-12 04:36 UTC

    MeshMonitor v4.13.0-rc2

    ⚠️ Pre-release — release candidate for testing; not recommended for production deployments. Docker images are not tagged :latest.

    Summary

    This release candidate lands the Map Consolidation epic (#4047): MeshMonitor's ten independent Leaflet map implementations are now one shared BaseMap shell, one composable layer library, one popup family, and one marker-icon factory. Traceroutes render identically on every surface — one canonical 4-band SNR color scale (previously three different scales), unified MQTT dashing and coloring, and the Dashboard finally renders return legs. Node markers, popups, neighbor links, and accuracy regions are likewise single-sourced, so future fixes apply to every map at once, and public embed maps now show the same canonical traceroute visuals as the app. The epic also surfaced and fixed several latent bugs, including a hidden-node position leak in the public embed traceroutes endpoint and Dashboard coloring segments with unscaled SNR values. On top of the epic, this RC brings map interaction polish (#4046): center-on-node never zooms out and its target zoom is user-configurable, pan/zoom animations scale with distance, clicking a marker at low zoom now zooms in instead of exploding a giant spiderfy fan, and open fans survive zoom changes. Live testing fixes include restored wheel/double-click zoom, correct zoom-to-node for one-way traceroutes, loading indicators on initial map data fetch, a polar grid for MeshCore maps, and a self-healing reload when a stale cached page requests rotated asset chunks after an upgrade.

    Map Consolidation Epic (#4047)

    • #4068 — Epic integration: one shell, one layer library, one popup family (phases below)
      • #4049 Phase 1 — shared BaseMap shell; pickers and editors migrated
      • #4051 Phase 2 — Map Analysis legend/polar-grid/trails reconciliation
      • #4057 Phase 3 — unified traceroute rendering across all app maps
      • #4060 Phase 4 — unified node-marker factory + shared NodeMarkersLayer
      • #4064 Phase 5 — one popup family with composable source-tech sections
      • #4065 Phase 6 — public embeds adopt canonical traceroute rendering (includes a hidden-node position leak fix 🔒)
      • #4066 / #4067 Phase 7 — shared neighbor-links/accuracy/waypoints layers; all maps on BaseMap

    Features

    • #4072 — Map interaction polish: zoom clamp with configurable target (default 17), distance-scaled animations, zoom-gated spiderfy with zoom-in-first clicks, re-spiderfy after zoom (#4046)
    • #4071 — MeshCore map polar grid; map loading indicators during initial fetch

    Bug Fixes

    • #4071 — Wheel/double-click zoom restored on all maps; zoom-to-node no longer hijacked by route-fit on one-way traceroutes; one-time reload on stale-chunk load failures after upgrades
    • #4055 — Dashboard neighbor-info lines follow the merged node marker position (#4042) — thanks @temalo!
    • #4045 — Notifications: drop inline autoindex UNIQUE(user_id) missed by migration 079 (#4044)

    Issues Resolved

    • #4047 — Consolidate 10 independent Leaflet maps into a shared BaseMap shell + composable layer library
    • #4046 — Map UI: improve pan/zoom-to-center behavior and its interaction with marker spiderfy
    • #4042 — Dashboard Unified map: neighbor-info lines don't follow merged node marker position
    • #4044 — Can't configure Apprise Notifications for a second source

    Upgrade Notes

    • Map visuals converge to one canonical look: the per-source Nodes map moves from a 3-band to the 4-band SNR color scale, no-data segments render dashed gray, the Dashboard gains traceroute return legs, the traceroute widget's legs use the theme color, and embeds show SNR-colored traceroutes instead of uniform mauve.
    • New per-user setting: Settings → Map → center-on-node target zoom (default 17).

    Full Changelog: https://github.com/Yeraze/meshmonitor/compare/v4.13.0-rc1...v4.13.0-rc2

    🚀 MeshMonitor v4.13.0-rc2

    📦 Installation

    Docker (recommended):

    docker run
    …
    
  9. v4.13.0-rc1 # Pre-release 9 days ago · 2026-07-11 13:09 UTC

    What's Changed

  10. v4.12.5 # 14 days ago · 2026-07-06 21:37 UTC

    MeshMonitor v4.12.5

    This release completes the MeshCore Virtual Node command surface: a companion app (meshcore-flutter) connected to a MeshMonitor Virtual Node can now do nearly everything it could against a physically-attached node. Building on 4.12.4's config forwarding, the app can now send self-adverts, log in to remote nodes, trace paths, and request LPP telemetry — each relayed to the real node with the correct Sent→async-push handshake and correlated the way the app expects — and the node's raw RX feed is bridged to apps as a LogRxData push so channel-finder and packet-inspection tools work through the VN. All of this was validated end-to-end against live hardware. On the LoRa side, the modem-preset picker now filters presets that would be illegal for the selected region and warns when picking a licensed amateur-radio region, with RegionCode values 33–37 added. A batch of MeshCore fixes lands too: clock sync now sets the repeater to the real current time, repeater SNR is scaled correctly (quarter-dB /4), a saved static position no longer clobbers live GNSS fixes, and initial auto-connect retries with backoff. Rounding it out: per-node free-text notes, conversation content search, an automation MeshCore scope condition, a guard against a bad saved regex bricking automations, plus dependency and translation updates.

    Features

    • MeshCore Virtual Node — app can send adverts, log in, trace paths, and request telemetry (#3904): SendSelfAdvert (#3959); SendLoginLoginSuccess, SendTracePathTraceData, SendTelemetryReqTelemetryResponse (#3961). Hardware-validated.
    • MeshCore Virtual Node — raw RX feed bridged to apps as a LogRxData(0x88) push (#3964, closes #3963).
    • LoRa region legality — filter modem presets by region legality (#3936) and warn on licensed amateur-radio regions (#3930) (#3924).
    • Nodes — per-node free-text notes field (#3932, closes #3921).
    • Messages — search conversations by content, extended to MeshCore DMs (#3931, #3935, closes #3922).
    • MeshCore packet-log export — decode unencrypted packet data (#3939, closes #3937).
    • Automation — MeshCore scope condition + self-origin guard (#3920, closes #3914).

    Bug Fixes

    • MeshCore: clock sync now sets the repeater to the real current time (#3957, closes #3954).
    • MeshCore: repeater SNR was reported 4× too high — now scaled by /4 (#3956, closes #3955).
    • MeshCore: static contact position no longer clobbers live GNSS telemetry fixes (#3909).
    • MeshCore: initial auto-connect now retries with backoff (#3919).
    • Automation: a stored bad filterNameRegex can no longer brick automations (#3938, closes #3934).
    • Automation: send/request actions can now reach MeshCore sources (#3917, closes #3915).
    • Config: add RegionCode values 33–37 + fix ITU2_2M label (#3928, closes #3927).
    • Map: show direct-heard SNR in the node hover tooltip (#3929, closes #3925).
    • Dashboard map: collapse toggle for the Features panel (#3913, closes #3912).
    • Hardware: rename hwModel 128 to MESH_TRACKER_X1 (#3958, closes #3952).
    • PirateWeatherADV example script: "read operation timed out" under Timed Events — timeouts bumped, 30s kill-timeout docs corrected (#3942).

    Dependencies

    • Bumped the production-dependencies group (8 updates) plus @types/node, globals, @typescript-eslint/parser, puppeteer, and tsx (#3945, #3946, #3948, #3949, #3950, #3951).

    Translations

    • Updated from Hosted Weblate (#3601). Thanks to the translators. 🌍

    Issues Resolved

    #3904, #3963, #3954, #3955, #3952, #3934, #3927, #3924, #3925, #3922, #3921, #3937, #3915, #3914, #3912

    Full Changelog: https://github.com/Yeraze/meshmonitor/compare/v4.12.4...v4.12.5

    🚀 MeshMonitor v4.12.5

    📦 Installation

    Docker (recommended):

    docker run -d \
      --name meshmonitor \
      -p 8080:3001 \
      -v meshmonitor-data:/data \
      ghcr.io/Yeraze/meshmonitor:4.12.5
    

    🧪 Testing

    ✅ All tests pa …

  11. v4.12.4 # 17 days ago · 2026-07-03 23:57 UTC

    Added

    • MeshCore Virtual Node: configure the physical node from a companion app — Config/admin commands sent from a companion app connected to a MeshCore Virtual Node are now forwarded to the real node (gated on the source's Allow admin commands setting), instead of being silently dropped with an unhandled frame: code=142. Covers node rename, radio params, TX power, advertised position, channel setup, and the "other params" bundle (telemetry-visibility modes, advert location policy, manual-add-contacts). When the flag is off, the app now receives an explicit rejection rather than a hang. Also adds the previously-missing Allow admin commands checkbox to the MeshCore Edit Source dialog (it was absent and hardcoded off, so the setting could never be enabled from the web UI). (#3904, #3905, #3906, #3907, #3910)
    • Map: fade node markers by age instead of a hard cutoff — On both the Dashboard map and Map Analysis, node markers now fade smoothly toward transparent as they age instead of popping in/out at the max-age threshold (Dashboard) or ignoring the time slider entirely (Map Analysis). Favorites stay fully opaque. (#3886, #3903)
    • MeshCore: node-type filter on the Node Details contact list — A compact "Filter by node type" dropdown next to the search/sort controls lets users with many repeaters/sensors narrow the list to just their companions (or any node type). (#3890, #3897)
    • MeshCore: explicit "Unscoped" button when composing a channel message — The channel "Send scope" control gains a discoverable one-click Unscoped option to send a channel message with no region scope. (#3888, #3898)
    • MeshCore: unread red-dot indicators on Channels + Node Details — The MeshCore sub-toolbar now shows the unread red-dot on its Channels and Node Details icons (matching Meshtastic), and gains unread tracking for direct messages, which it previously lacked entirely. (#3891, #3895)
    • Automation: consolidated token reference block + MeshCore Auto-Responder token parity — Each source's expansion tokens are consolidated into a single grouped reference block near the top of the Automation page (instead of drifting per-field legends), and MeshCore Auto-Responder can now expand reply-context tokens like {HOPS}/{ROUTE} that it previously couldn't. (#3892, #3894)

    Fixed

    • MeshCore: local companion node showed blank batterygetAllNodes() pushed the live in-memory get_self_info node (which has no battery field) over the DB-persisted row instead of merging onto it, so the Node Info panel and dashboard saw the companion's own batteryMv/uptimeSecs as blank even though the telemetry poller was persisting them. The persisted row is now merged as a base, and the poller stamps isLocalNode: true so the flag reflects reality. Adds low-battery diagnostics. (#3884, #3896)
    • MeshCore: "Notify on Low Battery" never fired for Apprise-only / companion setups — Closes two concrete gaps found by tracing the low-battery scan-and-deliver pipeline end-to-end, including making companion battery persistence observable and covering the Apprise-only delivery path. (#3884, #3899)
    • Auto-delete-by-distance was not truly per-source — Only meshtastic_tcp sources ran a per-source scheduler; mqtt_broker, mqtt_bridge, and meshcore fell through to a global singleton that scanned nodes across all sources with the global threshold/home coordinate. Auto-delete-by-distance is now genuinely per-source for every source type. (#3901, #3902)
    • MeshCore Auto-Acknowledge: unresolvable trigger scope replied with the channel default instead of unscoped — When a triggering message's scope couldn't be recovered at all (raw OTA bytes not correlated), "trigger" Reply Scope mode fell back to the channel default, so a genuinely-unscoped message from a peer repeater got a scoped reply back that the peer wouldn't forward. An unresolvable scope is now treated the same as a confirmed-unscoped trigger (reply unscoped); the same fix …
  12. v4.12.3 # 19 days ago · 2026-07-01 18:03 UTC

    MeshMonitor v4.12.3

    MeshMonitor 4.12.3 adds two new capabilities: a reusable Pause action for the Automation Engine (build custom delayed sequences like "message trigger → pause → send message"), plus a dedicated configurable pre-send delay on Auto-Acknowledge for both Meshtastic and MeshCore. It also brings the Meshtastic Position History map feature to MeshCore — per-node movement trails with a configurable retention window. On the reliability side, this release closes out a batch of MeshCore fixes: deleted contacts no longer get resurrected by the next sync, the saved-regions/default-scope view no longer spams background requests and throws a spurious error banner, GPS position from a telemetry poll now updates Contact Details, and the Virtual Node bridge now correctly forwards delivery ACKs and real hop counts to a connected companion. The MeshCore "Direct Messages" tab and its permission are renamed to "Node Details" to reflect that they also gate node-detail info, not just DMs. Traceroute's "last traced" age can no longer go negative when a node's device clock is ahead of real time — an ingest-time clamp plus a migration repair existing rows. A sticky section-nav bug that scrolled configuration-page navigation behind the fixed header is fixed, and duplicate WARN-level log spam from security/telemetry checks on large meshes has been quieted.

    Features

    • Automation Engine "Pause" action + configurable Auto-Ack pre-send delay — #3879, closes #3876
    • MeshCore node position-history movement trails on the map — #3877, closes #3852
    • MeshCore auto-acknowledge {SCOPE} token — #3866, closes #3865

    Bug Fixes

    • MeshCore: deleted contact resurrected on the next sync — #3882, closes #3878
    • MeshCore: intermittent "Failed to load saved regions" banner — #3881, closes #3880
    • MeshCore Virtual Node: DM ack + inbound hop count bridging — #3875, closes #3869, #3871
    • Sticky section-nav scrolled behind the fixed header — #3873, closes #3872
    • MeshCore: "Direct Messages" tab/permission renamed to "Node Details" — #3870, closes #3867
    • Duplicate WARN log spam from security/telemetry checks — #3864, closes #3863
    • MeshCore: GPS position from a telemetry poll now persists to Contact Details — #3862, closes #3861
    • Traceroute "last traced" could show a negative age — #3860, closes #2768

    Testing

    • Happy-path tests for channel reorder + MeshCore delete — #3857 (thanks @temalo!)

    Documentation

    • release: 4.12.3 — version bump + docs catch-up — #3883

    Issues Resolved

    #2768, #3852, #3861, #3863, #3865, #3867, #3869, #3871, #3872, #3876, #3880, #3697

    Full Changelog

    https://github.com/Yeraze/meshmonitor/compare/v4.12.2...v4.12.3

    🚀 MeshMonitor v4.12.3

    📦 Installation

    Docker (recommended):

    docker run -d \
      --name meshmonitor \
      -p 8080:3001 \
      -v meshmonitor-data:/data \
      ghcr.io/Yeraze/meshmonitor:4.12.3
    

    🧪 Testing

    ✅ All tests passed ✅ TypeScript checks passed ✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7

    📋 Changes

    See commit history for detailed changes.

  13. v4.12.2 # 21 days ago · 2026-06-29 20:19 UTC

    MeshMonitor v4.12.2

    A focused follow-up to 4.12.1 that rounds out the MeshCore scope/region work and fixes a subtle, long-standing correlation bug. The headline fix: on a busy mesh, a received MeshCore message could lose its scope/region badge (and {ROUTE}/{SNR} tokens) because the raw OTA bytes carrying that data were handed between firmware events through a single-slot buffer that a second in-flight packet could clobber — the buffer is now a small FIFO matched by hop count, so concurrent packets no longer evict each other. This release also adds scope/region control to MeshCore automations (including "respond on the trigger's scope"), a unified "Request from a node" automation action (telemetry/position/traceroute/node-info/neighbors/advert across Meshtastic and MeshCore), a live per-rule trace ("view logs") for the Automation Engine, a Reply button on MeshCore channel messages, and a scope badge on sent MeshCore messages. Several smaller MeshCore reliability fixes are included (discovered-node names, remote-status cross-talk, virtual-node handshake, saved-region resolution), the bundled Meshtastic protobufs move to v2.7.26 with hardware models 132–140, and the feature documentation is brought current. SQLite remains the default; PostgreSQL and MySQL are unchanged.

    Features

    • MeshCore scope/region control for automations — target a region on send, or respond on the trigger message's scope, in both the Automations tab and the Automation Engine (#3834)
    • "Request from a node" Automation Engine action — telemetry / position / traceroute / node info / neighbors / advert, for Meshtastic and MeshCore (#3838)
    • Automation Engine live trace ("view logs") — per-rule, real-time evaluation trace (#3836)
    • MeshCore Reply button on channel messages — prefills the @[Sender]: mention and replies on the originating scope (#3855)
    • MeshCore scope/region on sent messages — outgoing messages show the scope badge they were sent on (#3818)
    • Restore focus to the message input after send (MeshCore) (#3827)
    • Hardware models 132–140 — bundled protobufs bumped to v2.7.26 (#3849)

    Bug Fixes

    • MeshCore received-message scope/region (and {ROUTE}/{SNR}) blank on busy meshes — single-slot LogRxData buffer replaced with a hop-count-matched FIFO so concurrent text packets no longer clobber each other (#3859)
    • MeshCore re-discovered node showed "Unknown" until reload — name backfilled from the persisted node row; channel view opens at the bottom; no empty scope badge on unscoped messages (#3858)
    • MeshCore discovered repeater names populate without admin login — via ANON_REQ OWNER (#3825)
    • MeshCore remote-status response cross-talk — requests serialized (#3821)
    • MeshCore virtual-node DeviceInfo handshake — pinned to companion protocol v1 (#3828)
    • MeshCore saved regions missing from scope resolution (#3830)
    • Messages: request actions restored for unmessageable nodes (#3832)
    • Messages: softened the "not in device DB" warning when the key is known (#3856)
    • Remote Node Status: "Errors" relabeled to "Error Events" (#3824)
    • Settings: auto-acknowledge save no longer sticks on an RE2-incompatible regex (#3819)
    • MeshCore channel entry scroll to first unread / bottom (#3817)
    • heardBy relay info persists in the memory pool after a channel echo (#3816)
    • MeshCore message metadata readability on bright screens (#3812)

    Dependencies

    • vite 8.1.0 (#3848), lucide-react 1.22.0 (#3847), @typescript-eslint/eslint-plugin 8.62.0 (#3846), @types/node 26.0.1 (#3845), puppeteer 25.2.1 (#3844), aedes 1.1.0 (#3843), recharts 3.9.0 (#3842), production-dependencies group ×6 (#3841), eslint 10.6.0 (#3840), actions/cache v6 (#3839), @rollup/rollup-linux-arm-gnueabihf 4.62.2 (#3632)

    Upgrade Notes

    No breaking changes — upgrade in place. Received-message scope is resolved and stored at receive time, so the fix applies to messages received after upgrading (already-stored …

  14. v4.12.1 # 24 days ago · 2026-06-27 01:42 UTC

    MeshMonitor v4.12.1

    A hotfix for a startup-breaking regression in 4.12.0.

    🐛 Fixed

    • Startup crash when upgrading to 4.12.0 (#3804, #3805) — On installs with MQTT channel permissions, migration 103 could fail with UNIQUE constraint failed: channel_database_permissions.user_id, channel_database_permissions.channel_database_id and crash the app on every start, leaving it unbootable. When consolidating duplicate MQTT channels, the migration now removes conflicting permission rows before reassigning them to the keeper channel (SQLite, PostgreSQL, and MySQL — the latter via a derived-table subselect). A regression test covers the collision case.

    Anyone who hit the crash on 4.12.0 can upgrade straight to 4.12.1. (If you previously hand-patched the compiled migration as a workaround, that's fine — the migration is idempotent.)

    Thanks to @BeerMan81 for the detailed report and root-cause analysis.

    Full changelog: https://github.com/Yeraze/meshmonitor/compare/v4.12.0...v4.12.1

    🚀 MeshMonitor v4.12.1

    📦 Installation

    Docker (recommended):

    docker run -d \
      --name meshmonitor \
      -p 8080:3001 \
      -v meshmonitor-data:/data \
      ghcr.io/Yeraze/meshmonitor:4.12.1
    

    🧪 Testing

    ✅ All tests passed ✅ TypeScript checks passed ✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7

    📋 Changes

    See commit history for detailed changes.

  15. v4.12.0 # 24 days ago · 2026-06-26 23:38 UTC

    MeshMonitor v4.12.0

    A large feature release headlined by two new capabilities: a node/builder-based Automation Engine ("when this happens, do that" — triggers → conditions → actions, with variables, {{ }} token substitution, geofence/schedule/system triggers, an "Apprise notify"/"Run a script" action set, and an in-app dry-run tester), and MeshCore Regions/Scopes (per-channel and per-source scope tagging, a Discover Regions sweep, per-message scope overrides, a saved-regions catalog, and received-message scope display). It also lands a deep round of multi-source correctness work — channel/backup/permission queries are now consistently scoped by sourceId (closing a cross-source permission leak), the unified message feed no longer drops messages, and MQTT channels are identified by name and key. Position history was substantially fixed: every fix now renders with full backward pagination, hover/click tooltips with hop count and direct-heard SNR work, and ground_speed is correctly treated as km/h (it was being inflated ~3.6×). MeshCore gains channel unread indicators, a "heard repeaters" badge, per-message hop/route lines, a live byte-accurate character counter, on-demand telemetry polling, and a manual Define-Path editor with 1/2/3-byte hash widths. Other highlights: customizable login branding via env vars, Null-Island position filtering, richer Map-Analysis node popups, git-native LXC templates with in-place updates, and a hardened PostgreSQL channel_database rebuild path. The documentation site was brought current with all of the above, including a new Automation Engine page. This release supersedes the 4.12.0-rc1/rc2 pre-releases.

    ✨ Features

    Automation Engine (#3653) — #3721, #3726, #3727, #3739, #3746 — visual builder, schedule (cron)/geofence/system triggers, multi-source/unified-channel send, "Run a script" + JSON result variables, and in-builder {{ }} token validation.

    MeshCore Regions / Scopes (#3667) — #3704 (per-message scope override), #3762 (received-message scope display, Phase 2), #3765 (0-hop region discovery), #3783 (saved-regions catalog + pickers).

    MeshCore UI — #3707 (channel "heard repeaters" badge), #3716 (channel unread indicators), #3750 (hop count + relay route under received messages), #3790 (byte-accurate character counter + readability).

    Other — #3781 (custom login title/logo via env vars), #3764 (filter out Null Island 0,0 positions), #3692 (rich multi-source Map-Analysis node popups), #3779 (compact {ROUTE} auto-ack variable), #3768 (git-native LXC templates with bundled in-place updater).

    🐛 Bug Fixes

    Position history & maps — #3795 (render every fix + paginate full history), #3800 (ground_speed is km/h, not m/s — fixes ~3.6× speed inflation), #3801 (Analysis-Map cross-source neighbor links: union not intersection), #3687 (spiderfy + auto-collapse), #3784 (neighbor-link dedup + MQTT transport class), #3694 (position-packet channel from decryption context).

    Multi-source / MQTT — #3736, #3738 (messages no longer vanish from the unified feed), #3717 (channel queries scoped by sourceId), #3714 (manual backup scoped to source), #3757 (local-node lookup scoped to source), #3713/#3708/#3754 (MQTT channels identified by name and key), #3748 (batch per-source reads — fixes source-toggle 429s).

    MeshCore — #3794 (heartbeat/auto-reconnect + drop detection + reconnect-after-disconnect), #3706 (stop virtual node server on transport teardown), #3702 (Discover Regions timeout), #3722/#3728 (serialize binary-response/raw-frame ack handling), #3737/#3715 ({ROUTE}/{SNR} resolve on routed messages), #3733 (room-server author pubkey), #3760/#3766 (no DM UI for repeaters / unmessagable nodes), #3785 (preserve node name on empty advert), #3761/#3778 (CLI focus + metadata readability).

    Notifications / auto-favorite — #3799 (new-node notification fires for direct Meshtastic nodes), #3786 (never auto-favorite CLIENT/CLIENT_MUTE on CLIENT_ …

  16. v4.12.0-rc2 # Pre-release 25 days ago · 2026-06-26 02:20 UTC

    MeshMonitor v4.12.0-rc2

    ⚠️ Pre-release / release candidate. Built for testing the 4.12.0 line — not recommended for production. Please report issues.

    Summary

    This second 4.12.0 release candidate rolls up a large body of multi-source, MeshCore, and Automation work on top of rc1. MeshCore region discovery now actually works end-to-end: it queries only nearby (0-hop) repeaters and routes the request directly so repeaters answer it, and received messages now show the scope/region, hop count, and relay route they arrived on. The Automation Engine gains a "Run a script" action with JSON result variables, cron-scheduled triggers, a geofence map editor, multi-source/unified-channel sends, and {{ }} token highlighting/validation. A cluster of multi-source correctness and security fixes landed — cross-source permission and channel-scoping leaks closed, the "messages vanish after ~1 minute" dedup regression fixed, node identity hidden from unauthenticated users, and manual backups scoped to the selected source. MQTT channel handling was consolidated to identify channels by name + key (no more duplicate raw-slot entries), and a PostgreSQL channel_database tombstone-exhaustion migration failure was fixed. Traceroutes now route over the correct default-keyed channel, and the Map/Map-Analysis views got richer multi-source popups plus a spiderfy auto-collapse fix. Also includes the unmessagable-node DM-UI fix and a dashboard rate-limit (429) fix when toggling sources.

    Features

    • MeshCore: query only 0-hop repeaters for region discovery + route the query direct (#3765, #3743)
    • MeshCore: show the scope/region a received message was sent with (#3762) and hop count + relay route below received messages (#3750) — #3742
    • MeshCore: per-message scope/region override (#3704, #3701)
    • MeshCore: unread message indicator on the Channels view (#3716, #3703)
    • MeshCore: channel "heard repeaters" via self-echo correlation (#3707, #3700)
    • Automations: "Run a script" action + JSON result variables (#3746, #3653)
    • Automations: fire trigger.schedule on a cron schedule (#3726)
    • Automations: geofence map editor, multi-source/unified-channel send, builder/test-panel UX (#3721)
    • Automations: highlight {{ }} tokens + flag typos in builder text fields (#3727)
    • Map: filter out Null Island (0,0) positions (#3764, #3763)
    • Map Analysis: rich multi-source node popups matching the Unified map (#3692)

    Bug Fixes

    • Messaging: no DM UI for MeshCore repeaters & Meshtastic unmessagable nodes (#3760, #3766, #3755)
    • Unified feed: append-only message feed so windowing can't evict a seen message (#3738) and prevent messages vanishing in multi-source feed (#3736) — #3719, #3720
    • Security: scope channel-permission node filter by sourceId (#3749, #3745); scope dashboard local-node injection lookup to the source (#3757)
    • Channels: scope channel queries, mark-read & message migration by sourceId (#3717, #3712)
    • Auth: hide node identity from unauthenticated users in header and poll API (#3730, #3729)
    • MQTT: consolidate channels by name (#3708, #3709); identify channels by name AND key (#3713); attribute same-key channels by packet hash (#3754)
    • Migration: rebuild channel_database on PostgreSQL tombstone exhaustion (#3753, #3751)
    • Traceroute: route over the default-keyed channel + channel dropdowns (#3723); always send on Primary (#3699) — #3696
    • MeshCore: keep CLI command-line focus after send (#3761, #3752); resolve room-server author full public key (#3733); {ROUTE}/{SNR} resolve on routed channel messages (#3737, #3715, #3710); unified radio-op lock (#3728, #3725); serialize 0x8C binary-response consumers (#3722); Discover Regions Sent-payload fix (#3702); stop virtual node server on teardown (#3706); honor packet-monitor Max count (#3693, #3690)
    • **Meshtastic: resolve position-packet channel from decr …
  17. v4.11.6 # 26 days ago · 2026-06-24 19:35 UTC

    MeshMonitor 4.11.6

    Maintenance release on the 4.11.x line. Includes all fixes and features merged since 4.11.5 except the Automation Engine (#3653), which ships in 4.12.

    MeshCore

    • Region/scope support — phase 1: per-channel scope (#3667)
    • Scope all originated flood traffic — phase 2 (#3667)
    • Region discovery from nearby repeaters — phase 3 (#3667)
    • Per-message scope/region override (#3701)
    • Channel "heard repeaters" via self-echo correlation (#3700)
    • Show unread message indicator on the Channels view (#3703)
    • Manual telemetry poll buttons (#3674)
    • 2/3-byte path hash support in the Define Path editor (#3670)
    • Last Heard shows the date when a node was heard before today (#3656)
    • Fix: honor Temperature Unit on the DM telemetry graph (#3659)
    • Fix: reduce set_out_path timeout and improve the error message (#3664)
    • Fix: low-battery and inactive-node notifications never fired (#3672)
    • Fix: clarify LPP telemetry WARN and stop pubkey/nodeNum log spam (#3680)
    • Fix: honor the packet-monitor Max-count setting in the live list (#3690)
    • Fix: Discover Regions always timed out due to a missing Sent payload (#3682)
    • Fix: stop the virtual node server during transport teardown (#3705)
    • Fix: correlate LogRxData path by hop count so {ROUTE} resolves on routed messages (#3710)

    MQTT

    • Fix: consolidate channels by name instead of splitting by slot/hash (#3708)
    • Fix: identify channels by name and key, and enumerate them on the Channels tab (#3712 follow-up)

    Map

    • Fix: make spiderfy work and stop auto-collapse on Map Analysis & Unified maps (#3685)
    • Rich multi-source node popups matching the Unified map (#3692)

    Meshtastic / general

    • Fix: always send traceroutes on channel 0 (Primary) (#3696)
    • Fix: resolve position-packet channel from decryption context, not the raw hash (#3682)
    • Fix: persist & surface local node isUnmessagable/isLicensed (#3684)
    • Fix: scope manual device backup to the selected source (#3711)
    • Fix: scope channel queries, mark-read & message migration by sourceId (#3712)

    Notes

    • Database migrations 098–102 on this line correspond to the 100–104 migrations on the 4.12 (main) line; upgrading 4.11.6 → 4.12 re-runs them idempotently and applies the Automation Engine migrations fresh — no data loss or manual steps.

    🚀 MeshMonitor v4.11.6

    📦 Installation

    Docker (recommended):

    docker run -d \
      --name meshmonitor \
      -p 8080:3001 \
      -v meshmonitor-data:/data \
      ghcr.io/Yeraze/meshmonitor:4.11.6
    

    🧪 Testing

    ✅ All tests passed ✅ TypeScript checks passed ✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7

    📋 Changes

    See commit history for detailed changes.

  18. v4.12.0-rc1 # Pre-release 27 days ago · 2026-06-24 02:46 UTC

    MeshMonitor v4.12.0-rc1

    ⚠️ Pre-release (Release Candidate). Not tagged latest; intended for testing. Please report issues before the stable v4.12.0.

    Summary

    This release brings major map improvements and a wave of MeshCore enhancements. Overlapping markers now spiderfy consistently across every map — the per-source Nodes map, Map Analysis, the Unified map, and the dedicated MeshCore source map — and the fan no longer collapses on data refresh or node selection. Map Analysis node popups now match the Unified map's rich card and list every source that reported a node, and a node stays visible if any of its sources is enabled. On the MeshCore side: 2/3-byte forwarding-path hashes in the Define Path editor, manual on-demand telemetry polling, region/scope support (phases 1–3), and richer Last-Heard handling. The Automation Engine landed its Phase 1a foundation with a more capable Test panel. Bug fixes include position packets on private secondary channels now resolving to the correct channel (instead of a raw hash), the MeshCore Packet Monitor honoring its Max-count setting, the local node's Unmessageable flag being persisted and surfaced, low-battery/inactive-node notifications firing for MeshCore, and DM telemetry graphs honoring the temperature-unit setting.

    Features

    • Map Analysis: rich multi-source node popups matching the Unified map, with a "Seen by N sources" list (#3692, resolves #3689)
    • MeshCore: 2/3-byte path hash support in the Define Path editor (#3686, resolves #3670)
    • MeshCore: manual telemetry poll buttons (Status / Environment) (#3681, resolves #3674)
    • MeshCore: region/scope support — phase 1 (#3669), phase 2 flood-traffic scoping (#3673), phase 3 region discovery from nearby repeaters (#3679) (resolves #3667)
    • Automation Engine — Phase 1a foundation (#3668) with richer Test-panel dry-run inputs/output (#3675) (resolves #3653)
    • MeshCore: Last Heard shows the date when a node was last heard before today (#3663, resolves #3656)

    Bug Fixes

    • Spiderfy works + no auto-collapse on the Map Analysis, Unified, and MeshCore source maps; markers register reliably and stay fanned through refreshes and selection (#3687, resolves #3685; follow-up to #3612/#3615)
    • Position packets on private secondary channels now resolve to the correct channel slot instead of a raw hash (e.g. "channel 39") (#3694, resolves #3682)
    • MeshCore Packet Monitor honors the configured Max-count setting instead of hard-capping at ~200 (#3693, resolves #3690)
    • Local node Unmessageable flag is now persisted and surfaced in the Config tab (#3688, resolves #3684/#3683)
    • MeshCore low-battery & inactive-node notifications now fire (#3672, resolves #3671)
    • DM telemetry graph honors the user's Temperature Unit setting (#3662, resolves #3659)
    • MeshCore Define-Path: shorter set_out_path timeout and clearer error (#3665, resolves #3664)
    • MeshCore logging: LPP telemetry WARN is labelled, and out-of-range nodeNum log-spam from pubkey lookups is gone (#3680, resolves #3676/#3677)

    Tests / CI / Chore

    • Guard migrations against source-dependent crashes (#3661, resolves #3657)
    • Default the bug-investigator agent to Opus + grounding contract (#3666)
    • gitignore Python __pycache__ (#3678)
    • Version bump to 4.12.0-rc1 (#3695)

    Issues Resolved

    #3653, #3656, #3657, #3659, #3664, #3667, #3670, #3671, #3674, #3676, #3677, #3680, #3682, #3683, #3684, #3685, #3689, #3690

    Full changelog: https://github.com/Yeraze/meshmonitor/compare/v4.11.5...v4.12.0-rc1

    🚀 MeshMonitor v4.12.0-rc1

    📦 Installation

    Docker (recommended):

    docker run -d \
      --name meshmonitor \
      -p 8080:3001 \
      -v meshmonitor-data:/data \
      ghcr.io/Yeraze/meshmonitor:4.12.0-rc1
    

    🧪 Testing

    ✅ All tests passed ✅ TypeScript checks passed ✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7

    📋 Changes

    See commit history for detailed changes.

  19. v4.11.5 # 28 days ago · 2026-06-22 21:19 UTC

    🚑 Hotfix release — supersedes v4.11.4 (retracted)

    v4.11.4 was pulled because migration 033 crashed startup on PostgreSQL and on fresh installs with column "sourceId" does not exist (#3657). v4.11.5 fixes that and carries everything that was in v4.11.4.

    If you ran v4.11.4, update to v4.11.5. The boot crash is resolved.

    🔴 Hotfix (#3657)

    • Migration 033's channel_database backfill is now guarded on the legacy sourceId column existing (it's global-by-design — migration 021 no longer adds it and 063 drops it). Fixes the PostgreSQL / fresh-install boot crash introduced in v4.11.4.

    Also included (from the retracted v4.11.4)

    Critical

    • PostgreSQL boot-loop fix (tables can have at most 1600 columns) (#3639)

    Features

    • MeshCore role icons in the map + DM node lists (#3647)
    • MeshCore favorites pinned to the top of the DM list (#3620)
    • Marker spiderfying for overlapping nodes on Map Analysis + Unified maps (#3612)
    • Channel "overshadow" warning for same-key/different-name Channel Database entries (#3644)
    • Traceroute packetId for cross-source correlation (#3623)

    Fixes

    • Node disconnects / TX failures since 4.11.x (#3637)
    • Custom-LoRa-config primary channel mislabeled "LongFast" (#3644)
    • TCP reconnect shows the real per-source address (#3611)
    • Fictitious traceroute segments removed; incoming traceroutes visible (#3622)
    • MeshCore hashtag #channel secrets over plain HTTP-via-IP + at save time (#3606, #3607)
    • MeshCore Last Heard preserved across reconnect (#3645)
    • MeshCore new nodes populate fully when heard live (#3646)
    • Unified-map neighbor lines follow the merged marker (#3642)
    • Adaptive node-type filter per source protocol (#3610)
    • Saner single-anchor position-estimate uncertainty (#3616)

    🚀 MeshMonitor v4.11.5

    📦 Installation

    Docker (recommended):

    docker run -d \
      --name meshmonitor \
      -p 8080:3001 \
      -v meshmonitor-data:/data \
      ghcr.io/Yeraze/meshmonitor:4.11.5
    

    🧪 Testing

    ✅ All tests passed ✅ TypeScript checks passed ✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7

    📋 Changes

    See commit history for detailed changes.

  20. v4.11.3 # 29 days ago · 2026-06-21 18:25 UTC

    MeshMonitor v4.11.3

    This release adds a Dead Drop / Mailbox auto-responder — asynchronous "mesh voicemail" where a node can leave a message for another node that need not be online, retrieved later with inbox commands — contributed by new contributor @TheWISPRer. It also brings MeshCore node favoriting (pin any MeshCore node to the top of the list, stored server-side), FEM LNA Mode LoRa configuration surfaced on both the Device Configuration and Remote Admin panels for amplified hardware, and the MeshCore CLI bundled into the Docker image alongside the Meshtastic CLI. On the fixes side, a PostgreSQL/MySQL crash in the MeshCore neighbor query is resolved by widening the neighbor_info timestamp columns to BIGINT (they overflowed signed int32 with millisecond-epoch values), and a proto3 boolean-elision bug that silently re-enabled uplinkEnabled/downlinkEnabled after a container restart is fixed. Position history now captures and displays SNR for directly-heard (0-hop) nodes, the intermittently-blank MeshCore auto-ack {SNR}/{ROUTE} tokens are corrected, mesh-request endpoints return a meaningful 503 (not a generic 500) when the node is disconnected, and the macOS x64 desktop build no longer ships an arm64 re2.node that crashed on Intel Macs. Upgrades are automatic — three idempotent migrations (094–096) run on boot.

    Features

    • Dead Drop / Mailbox auto-responder — async "mesh voicemail" (#3538, @TheWISPRer) — a fifth auto-responder type. DM msg <name> <text> to leave a message; retrieve with inbox, inbox play [name], inbox delete <id>, inbox clear. Per-source, configured entirely through the Auto Responder UI, messages marked played only on delivery-success, expired rows purged by the maintenance sweep.
    • MeshCore node favoriting — pin to top of list (#3595) — favorite any MeshCore node (Companion, Repeater, Room Server, …); stored server-side only (firmware has no native favorite concept), consistent with Meshtastic favorites.
    • FEM LNA Mode LoRa configuration (#3600) — surfaces Config.LoRaConfig.fem_lna_mode (Disabled / Enabled / Not Present, firmware ≥ v2.7.20) on both the Device Configuration and Remote Admin LoRa panels.
    • MeshCore CLI bundled in the Docker image (#3591) — ships meshcore-cli / meshcli alongside the Meshtastic Python CLI for a complete in-container toolkit.

    Bug Fixes

    • MeshCore neighbor query crashed on PostgreSQL/MySQL (#3602) — meshcore_neighbor_info.timestamp / .createdAt were 32-bit INTEGER/INT but store millisecond-epoch values that overflow int32; widened to BIGINT (migration 096).
    • downlinkEnabled/uplinkEnabled: false reverted to true after restart (#3598) — proto3 elides boolean false, and a ?? true fallback re-inflated user-disabled channel flags on device reconnect; both now default to false.
    • Position history dropped SNR for directly-heard (0-hop) nodes (#3593) — SNR is now captured per-fix and shown in the tooltip; the same 0 dB-drop guard was fixed on the central snr_local telemetry path.
    • MeshCore auto-ack {SNR} / {ROUTE} tokens intermittently blank (#3592) — buffered SNR/route data is now correlated to the matching packet (freshness + pathLen, consumed once) instead of leaking across messages.
    • macOS x64 (Intel) desktop crashed on launch (#3604) — the x64 DMG shipped an arm64 re2.node (ERR_DLOPEN_FAILED); the build now rebuilds re2 from source as x86_64 and backfills the missing CI arch flags.
    • Mesh-request endpoints return 503 (not 500) when disconnected (#3597) — /api/traceroute, /api/position/request, /api/nodeinfo/request, /api/neighborinfo/request, /api/telemetry/request now return a meaningful 503 with the v1-API error shape.

    Internationalization

    • Translations update from Hosted Weblate (#3579, @weblate)

    Issues Resolved

    • #3587 — Add MeshCore CLI Python application to Docker image
    • #3588 — MeshCore node favoriting (pi