Skip to content

v4.15.2

Latest

Choose a tag to compare

@Yeraze Yeraze released this 01 Sep 13:20
· 1 commit to main since this release
c1cf477

MeshMonitor v4.15.2

MeshMonitor 4.15.2 lands the Mesh Issues Analysis report — a scheduled, passive health scan of the mesh that turns telemetry, RF adjacency, and per-node flags into a triaged list of findings you can act on. This release also finishes the unified map controls sidebar across every map surface, expands the Automation Engine with five new device-health triggers plus a one-click template, adds a portnum filter and content search to the Packet Monitor, and gives the MeshCore side per-source path-hash defaults, an autopoll-neighbours scheduler, and a separate infrastructure age timeout. Backup Restore is now a one-click button. The header cycles the connection badge through status, battery, and airtime. Nodes render in their Meshtastic-app color scheme. Site Planner explains when its coverage circle stops matching terrain. B1 Router Cluster is tightened twice, first with a configurable distance guard so MQTT can't glue routers 100 km apart into one finding, and again with a client-overlap requirement so a well-sited backbone stops flagging as redundant. Key-security detection gains proper per-source scoping, and migration 155 clears the false-positive keyMismatchDetected rows that the old bug left behind. Indonesian joins the language picker.

Features

Mesh Issues Analysis (new report)

  • Mesh Issues report — Phase 1 foundation + Tier A rules (#4966)
  • Tier B RF-graph rules — Phase 2 (#4967)
  • Coverage preface, dismiss UI, Tier C, settings — Phase 3 (#4968)
  • Post-epic follow-ups — A5 cadence, pagination, auto-close setting (#4972)
  • Map on Router Cluster findings (#4975)
  • Report reorganization — dashboard, tables, by-node view, bulk actions (#4981)
  • Clickable node references with source picker (#5002)

Unified map controls sidebar

  • Phase 1 (DashboardMap) (#4914)
  • Phase 2 NodesTab map controls (#4919)
  • MapAnalysis floating panels into the unified sidebar (#4920)
  • MeshCore map floating panels into the unified sidebar (#4921)

Automation device-health triggers

  • Node lifecycle triggers — heartbeat-lost & recovery (#4873)
  • nodeRebooted trigger — uptime-reset detection (#4874)
  • nodePowerChanged trigger — external power lost/restored (#4876)
  • Noise floor as a telemetry alert field (#4877)
  • batteryTrend trigger — declining-battery / solar proxy (#4878)
  • Device Health template — quick-create node health alerts (#4881)
  • MeshCore parity for device-health triggers (#4887)

Packet Monitor

  • Full portnum filter + free-text content search (#4961)
  • Stop capturing control on all packet monitors (#4960)

Scripts

  • Installed Scripts inventory in global settings (#4956)

MeshCore

  • Per-source Default Path Hash Size setting (#4951)
  • Autopoll Neighbours — per-node retrieval scheduler (#4884)
  • Telemetry time window selector in node details (#4970)
  • Separate age timeout for infrastructure nodes (#4901)
  • Send truly-unscoped floods, not the node default region (#4937)

Maps

  • Zoom to Fit on the Unified/Dashboard map (#4902)
  • Support a Carto basemap API key (#4936)
  • Per-node colors (Meshtastic app algorithm) for pins + node lists (#4924)

Nodes

  • "Show all" (0 = never) option to Maximum Age of Active Nodes (#4949)

Header

  • Cycle the connection badge through status, battery, airtime (#4927)
  • Move Disconnect/Reconnect into the System Status popup (#4912)

Backup

  • Restore button on Device Backup Management (#4933)

Firmware

  • Add a Nightly channel for develop (2.8.x) builds (#4950)

i18n

  • Ship the Indonesian translation and offer it in the picker (#5003)
  • Translations update from Hosted Weblate (#4903)

Site Planner

  • Grouped toolbar controls into labeled dropdown menus (#4886)

Messages

  • Show seconds in the reception Heard column (#4870)

Bug Fixes

  • fix(key-security): scope keyMismatch reads by source, clear stale flags (#5001)
  • fix(mesh-issues): B1 requires client-overlap evidence, not just mutual audibility (#5000)
  • fix(map-analysis): improve trail rendering and autozoom (#4999)
  • fix: preserve map panning while measuring distance (#4998)
  • fix(analysis): annotate ok_to_mqtt violations with broker classification (#4996)
  • fix(meshcore): age stored neighbour "last heard" instead of showing 0s ago (#4979)
  • fix(mesh-issues): B1 router clusters are mutually-audible cliques with a distance guard (#4977)
  • fix(telemetry): send sourceId on purge so MeshCore purges succeed (#4973)
  • fix(scripts): add Scripts to the settings section nav (#4962)
  • fix(beacons): Beacon Offers Panel hit wrong URL, showed nothing (#4952)
  • fix(site-planner): surface why coverage is a circle in the panel (#4940)
  • fix(header): hide MeshMonitor logo/wordmark on per-source pages (#4939)
  • fix(settings): move Carto API key field to the Map section (#4938)
  • fix(backup): surface restore reboot notice from the actual flag (#4935)
  • fix(nodes): keep node text legible on per-node colored rows (#4928)
  • fix(meshcore): release serial fd on failed connect so USB replug reconnects (#4923)
  • fix(automation): treat a self-targeted deviceReboot as a local reboot (#4915)
  • fix(map-analysis): theme the workspace via semantic tokens, not hardcoded dark (#4913)
  • fix(meshcore): verify set_out_path by device read-back, not the tag-less ack (#4906)
  • fix(meshcore): correlate LogRxData by identity, not hop count (#4905)
  • fix(#4860): damp ESRI satellite's synthetic water-blue (#4875)
  • fix(3d-map): stop role glyphs collapsing to plain discs on zoom (#4865)
  • fix(site-planner): call /api/rf/coverage, not /rf/coverage (#4862)
  • fix(#4849): don't attribute relayed packets' RSSI/SNR to the source node (#4857)
  • fix(#4851): persist ACK metadata for confirmed DMs in Delivery Details (#4855)
  • fix(#4860): white halo on satellite-map node labels (#4872)
  • fix(channels): show the unread bell in the mobile channel dropdown (#4867)

Refactor / Performance

  • refactor(messages): unify sent/received message-detail popups (#4856)
  • perf(map): polish 3D controls and node memoization (#4925)
  • perf/robustness(gnss): DOP grid yielding, TLE resync, panel time anchor (#4904)

Docs

  • docs: audit and update for 4.15.2 release (#5005)
  • docs: add mesh issues test reference page (#4997)
  • docs: note known mqtt-proxy TLS field-name bug (#4995)

Chore

  • chore: bump version to 4.15.2 (#5006)

Issues Resolved

  • #4994 MQTT proxy does not recognize Meshtastic tls_enabled configuration
  • #4982 ok_to_mqtt Violations report: false positives for private MQTT brokers
  • #4978 Meshcore Neighbors bug
  • #4976 B1 Router cluster merges far-apart routers via transitive chains
  • #4965 Measure Distance: map pan intercepted as node selection
  • #4964 Mesh Issues Analysis epic
  • #4958 Packet Monitor portnum filter + content search
  • #4957 Stop capturing control on packet monitors
  • #4947 "Show all" option for Maximum Age of Active Nodes
  • #4946 Beacon Offers Panel URL bug
  • #4945 Per-source Default Path Hash Size
  • #4942 Installed Scripts inventory
  • #4934 Carto basemap API key
  • #4932 MeshCore truly-unscoped floods
  • #4926 Backup / Restore button
  • #4924 Per-node colors for pins + node lists
  • #4922 MeshCore serial fd release on failed connect
  • #4917 Cycle the header connection badge
  • #4911 Theme the MapAnalysis workspace
  • #4909 Unified map controls sidebar epic
  • #4908 Move Disconnect/Reconnect into System Status
  • #4899 Separate MeshCore infrastructure age timeout
  • #4898 Zoom to Fit map control
  • #4888 MeshCore scope-override + conversation toolbar row
  • #4883 MeshCore LogRxData correlation
  • #4880 Meshtastic app color algorithm for nodes
  • #4871 Group MapAnalysis toolbar controls into menus
  • #4869 Show seconds in reception Heard column
  • #4863 3D map role glyphs on zoom
  • #4860 Satellite map node label styling
  • #4851 ACK metadata for confirmed DMs
  • #4849 Relayed packet RSSI/SNR attribution
  • #4847 Self-targeted deviceReboot handling
  • #4727 Site Planner coverage circle terrain reasons
  • #4660 Mobile channel dropdown unread bell
  • #4631 MeshCore set_out_path device read-back
  • #4618 MeshCore Autopoll Neighbours
  • #4558 Automation device health epic

Upgrade Notes

Migration 155 runs automatically on first boot. It clears stale keyMismatchDetected flags whose fingerprint matches the PKI-error path (lastMeshReceivedKey IS NULL). Genuine current PKI failures re-set the flag on the next failed DM. No user action required.

B1 Router Cluster now requires evidence of client overlap. Two or more router-role nodes that hear each other but each serve a distinct set of local clients will stop flagging as a cluster. Backbones on tall towers stop appearing in this report. Set routerClusterMaxLinkKm in Mesh Issues settings if the default 30 km distance guard is too tight or too loose for your topology.

C1 Key security detail evidence is now structured. The existing details string is preserved for backward compatibility, but a new sharedWithNodes array of {nodeNum, name} refs is added on duplicateKeyDetected findings. The UI renders the structured list and hides the raw string when both are present.

Full Changelog: v4.15.1...v4.15.2

🚀 MeshMonitor v4.15.2

📦 Installation

Docker (recommended):

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

🧪 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.