MeshMonitor v4.6.4
Summary: This release lands the MeshCore path-management series — MeshMonitor can now persist, display, reset, share, live-update, and (optionally) manually edit the forwarding paths between contacts. Alongside it ships major stability work for Passive Mode on large Meshtastic TCP networks (manual resync, startup-grace fast reconnect, per-source staleness override, createdAt-based chat ordering), per-transport visibility toggles on the dashboard map and packet monitor (RF/UDP/MQTT), and a critical bug fix where MQTT-ingested publicKey values were stored as hex while every other path used base64 — silently triggering false-positive "key mismatch" warnings every time a MQTT-seen node later sent NodeInfo over the radio (migration 069 backfills existing hex rows). Also includes new v1 API node-action endpoints, multi-response HTTP auto-responder triggers, per-message source attribution (source_ip/source_path columns), and a Safari/iOS keyboard fix.
Features
MeshCore Path Management (full series)
- #3123 —
feat(meshcore): persist + reset per-contact forwarding path (slices 1+2). Addsout_path/path_lencolumns (migration 068), surfaces Hops Away + Path bytes on the contact detail panel, and ships a Reset Path action wrappingCMD_RESET_PATH. - #3124 —
feat(meshcore): add Share Contact action. Broadcasts a contact's saved advert as a zero-hop frame viaCMD_SHARE_CONTACT. - #3127 —
feat(meshcore): live path updates via debouncedPathUpdatedpush. Coalesces flurries from chatty contacts into a single device refresh per 1.5 s window. - #3130 —
feat(meshcore): manual path editor, feature-flagged. Adds themeshcoreAdvancedPathEditsetting + an Edit Path… modal for advanced users who want to force a specific hop chain (gated server-side too).
Passive Mode Stability (#3122)
- #3125 —
fix(stability): per-source Passive Mode + createdAt chat ordering. - #3126 —
feat(stability): manual Resync action for Passive Mode sources. - #3128 —
feat(stability): startup-grace fast reconnect for Passive Mode. - #3129 —
feat(stability): per-source resync staleness override for Passive Mode.
Visibility Toggles
- #3116 —
feat(packet-monitor): add transport-mechanism filter (UDP/LoRa/MQTT/API). - #3117 —
feat(map): per-transport visibility toggles (Show RF / UDP / MQTT). - #3118 —
feat(dashboard-map): add Show RF/UDP/MQTT + traceroute + accuracy toggles.
API & Automations
- #2585 —
feat: add v1 API node action endpoints. Thanks to @tanrax for the contribution. - #2881 —
feat: support multiple responses for HTTP auto-responder triggers. Thanks to @chaykin. - #3114 —
feat(messages): addsource_ip+source_pathcolumns for per-message attribution. Thanks to @rancur.
Bug Fixes
- #3133 —
fix(mqtt): store ingestedpublicKeyas base64 (not hex). The MQTT NodeInfo ingest path was encodingpublicKeyas hex while the direct serial/TCP path and the device's security-config handshake both used base64. The mismatch silently broke the key-mismatch detector, firing false-positive🔐 Key mismatch detectedwarnings on every NodeInfo arrival for any MQTT-seen node. Migration 069 backfills existing hex-encoded rows (lowercase 32-byte hex matching^[0-9a-f]{64}$) to base64; idempotent across SQLite / PostgreSQL / MySQL. - #3121 —
fix(ios): keep text inputs above Safari keyboard accessory bar. Closes #2994. - #3120 —
fix(telemetry): suppress duplicate-packet WARN spam in MQTT ingest. Closes #3119.
Documentation
- #3115 —
docs: add deployment comparison table to Getting Started. - #3131 —
docs: reframe top-level pages as multi-protocol (Meshtastic, MeshCore, MQTT). - #3132 — Release housekeeping for 4.6.4 + a new MeshCore Routing & Paths section in
docs/ARCHITECTURE_LESSONS.mddocumenting the load-bearing distinction between Meshtastic traceroute traces and MeshCore sender-supplied forwarding instructions, plus the four user actions (Reset / Share / Set Out-Path / Trace), the0xFF/-1sentinel gotcha, and the push-debounce design.
Migrations
- 068 —
meshcore_nodes_out_path: addsout_path TEXT+path_len INTEGERtomeshcore_nodesso the per-contact MeshCore route survives restarts. - 069 —
normalize_node_public_keys_to_base64: one-time backfill converting any hex-encodednodes.publicKeyvalues to base64 to match the canonical encoding used everywhere else. Idempotent.
Issues Resolved
Closes #2994, #3112, #3119, #3122.
Upgrade Notes
Two new migrations run automatically on startup. Migration 069 is the user-visible one: if you've been receiving MeshMonitor's 🔐 Key mismatch detected warnings for nodes whose keys hadn't actually changed (typically nodes you saw via MQTT before they sent direct NodeInfo), those warnings will stop after the migration converts the legacy hex-stored rows. No action required.
Full changelog: v4.6.3...v4.6.4
🚀 MeshMonitor v4.6.4
📦 Installation
Docker (recommended):
docker run -d \
--name meshmonitor \
-p 8080:3001 \
-v meshmonitor-data:/data \
ghcr.io/Yeraze/meshmonitor:4.6.4🧪 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.