v4.15.2-rc9
Pre-releaseMeshMonitor v4.15.2-rc9
⚠️ Pre-release — this is a release candidate. Please test in a non-production environment first and report issues.
Summary
This RC focuses on the Mesh Issues report and key-security correctness. The report page gets a full reorganization — a dashboard-style landing, sortable per-type tables, a by-node view, and bulk actions — plus a new test-reference doc explaining every A1/B2/C3 designator. Node references in findings are now clickable everywhere they appear (headers, member chips, "shared with" lists), open the DM thread on the right source, and a source picker fires when a node exists on multiple sources. B1 Router Cluster is tightened twice: it now requires the members' non-cluster clients to overlap significantly (a well-sited backbone stops flagging as redundant), and edges must be within the configurable distance guard so MQTT can't glue routers 100+ km apart into one finding. On the C1 side, source-blind reads in the key-mismatch path were producing false-positive keyMismatchDetected warnings and leaving old flags stuck forever; both are fixed, and migration 155 cleans up the stale rows. The 2.8-firmware renumber suppressor now also fires on a temporal-handoff signal, catching the MQTT-replay case where a gateway keeps rebroadcasting a node's pre-2.8 identity. Long free-text cells in the report now wrap at 28rem instead of stretching the table into horizontal scroll. Elsewhere: MQTT violations no longer false-positive on private brokers, MeshCore neighbours show a real "last heard" age, map-analysis trails render cleaner and autozoom correctly, measuring distance no longer intercepts map panning, and Indonesian joins the language picker.
Features
- feat(i18n): ship the Indonesian translation and offer it in the picker (#5003)
- feat(mesh-issues): clickable node references with source picker + Details-column wrap + 2.8 renumber MQTT-replay fix (#5002)
- feat(mesh-issues): reorganize the report — dashboard, tables, by-node view, bulk actions (#4964) (#4981)
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 (#3788) (#4999)
- fix: preserve map panning while measuring distance (#4965) (#4998)
- fix(analysis): annotate ok_to_mqtt violations with broker classification (#4982) (#4996)
- fix(meshcore): age stored neighbour "last heard" instead of showing 0s ago (#4978) (#4979)
- fix(mesh-issues): B1 router clusters are mutually-audible cliques with a distance guard (#4976) (#4977)
Docs
- docs: add mesh issues test reference page (#4997)
- docs: note known mqtt-proxy TLS field-name bug (#4995)
Dependencies
- chore(deps): bump maplibre-gl from 6.4.1 to 6.6.0 (#4993)
- chore(deps): bump the codeql-action group with 4 updates (#4992)
- chore(deps-dev): bump @tanstack/react-query-devtools from 5.101.4 to 5.102.8 (#4991)
- chore(deps): bump lucide-react from 1.33.0 to 1.35.0 (#4990)
- chore(deps-dev): bump @typescript-eslint/parser from 8.67.0 to 8.68.0 (#4989)
- chore(deps): bump @rollup/rollup-linux-arm64-musl from 4.62.5 to 4.63.1 (#4988)
- chore(deps): bump otplib from 13.4.1 to 13.5.0 (#4987)
- chore(deps): bump @rollup/rollup-linux-arm-gnueabihf from 4.62.5 to 4.63.0 (#4986)
- chore(deps): bump protobufjs from 8.7.2 to 8.8.0 (#4985)
- chore(deps): bump the production-dependencies group with 2 updates (#4984)
- chore(deps-dev): bump the development-dependencies group with 6 updates (#4983)
Chore
Issues Resolved
- #4994 [BUG] MQTT proxy does not recognize Meshtastic tls_enabled configuration
- #4982 ok_to_mqtt Violations report: false positives for private MQTT brokers
- #4978 [BUG] Meshcore Neighbors bug
- #4976 B1 Router cluster merges far-apart routers via transitive chains
- #4965 [BUG] Measure Distance: map pan intercepted as node selection
Upgrade Notes
- Migration 155 runs automatically on first boot and clears stale
keyMismatchDetectedflags whose fingerprint matches the fixed source-blind read path (lastMeshReceivedKey IS NULL). Genuine current PKI failures will re-set the flag on the next failed DM. - The Mesh Issues report evidence for
C1_key_securitynow includes a structuredsharedWithNodesarray alongside the legacydetailsstring; the UI prefers the structured list and hides the raw string when both are present. Backward-compatible for consumers reading either field.
Full Changelog: v4.15.2-rc8...v4.15.2-rc9
🚀 MeshMonitor v4.15.2-rc9
📦 Installation
Docker (recommended):
docker run -d \
--name meshmonitor \
-p 8080:3001 \
-v meshmonitor-data:/data \
ghcr.io/Yeraze/meshmonitor:4.15.2-rc9🧪 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.