This release adds 3 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
Affected surfaces
ReleasePort's take
Light signalMeshCore now supports persistent per‑contact forwarding paths with out_path and path_len columns (migration 068) and adds a Share Contact action for zero‑hop broadcasts. UI updates include live path debouncing, manual path editing, Passive Mode enhancements, new packet monitor filters, dashboard map toggles, API node‑action endpoints, multi‑response HTTP auto‑responder support, message source attribution, MQTT publicKey storage fixes, iOS keyboard overlay fix, and duplicate‑packet log suppression.
Why it matters: These feature additions enable finer‑grained path control, improve UI stability (1.5 s debounce), expand Passive Mode reliability on large networks, and clarify documentation—critical for developers configuring MeshCore routing and SREs maintaining system health.
Summary
AI summaryBroad release touches Bug Fixes, MeshCore Path Management, Passive Mode Stability, and Migrations.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Medium |
Adds persist and reset per-contact forwarding path with out_path/path_len columns (migration 068). Adds persist and reset per-contact forwarding path with out_path/path_len columns (migration 068). Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds Share Contact action to broadcast saved advert as zero-hop frame. Adds Share Contact action to broadcast saved advert as zero-hop frame. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Implements live path updates with 1.5 s debounce to coalesce flurries. Implements live path updates with 1.5 s debounce to coalesce flurries. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds feature‑flagged manual path editor modal for advanced users. Adds feature‑flagged manual path editor modal for advanced users. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds per-source Passive Mode and createdAt chat ordering. Adds per-source Passive Mode and createdAt chat ordering. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds manual Resync action for Passive Mode sources. Adds manual Resync action for Passive Mode sources. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds startup‑grace fast reconnect for Passive Mode on large TCP networks. Adds startup‑grace fast reconnect for Passive Mode on large TCP networks. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds per-source resync staleness override for Passive Mode. Adds per-source resync staleness override for Passive Mode. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds transport‑mechanism filter (UDP/LoRa/MQTT/API) to packet monitor UI. Adds transport‑mechanism filter (UDP/LoRa/MQTT/API) to packet monitor UI. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds per‑transport visibility toggles for RF, UDP, and MQTT on dashboard map. Adds per‑transport visibility toggles for RF, UDP, and MQTT on dashboard map. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds Show RF/UDP/MQTT, traceroute, and accuracy toggles to dashboard map. Adds Show RF/UDP/MQTT, traceroute, and accuracy toggles to dashboard map. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds v1 API node‑action endpoints (contributed by @tanrax). Adds v1 API node‑action endpoints (contributed by @tanrax). Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Supports multiple responses for HTTP auto‑responder triggers (contributed by @chaykin). Supports multiple responses for HTTP auto‑responder triggers (contributed by @chaykin). Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds per‑message source attribution columns source_ip and source_path (contributed by @rancur). Adds per‑message source attribution columns source_ip and source_path (contributed by @rancur). Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Adds deployment comparison table to Getting Started documentation. Adds deployment comparison table to Getting Started documentation. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Feature | Medium |
Refactors top‑level pages as multi‑protocol documentation (Meshtastic, MeshCore, MQTT). Refactors top‑level pages as multi‑protocol documentation (Meshtastic, MeshCore, MQTT). Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Feature | Medium |
Adds new MeshCore Routing & Paths section in ARCHITECTURE_LESSONS.md documenting routing distinctions and user actions. Adds new MeshCore Routing & Paths section in ARCHITECTURE_LESSONS.md documenting routing distinctions and user actions. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Bugfix | Medium |
Fixes Safari/iOS keyboard overlay hiding text inputs. Fixes Safari/iOS keyboard overlay hiding text inputs. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Bugfix | Medium |
Fixes MQTT NodeInfo publicKey storage to use base64 instead of hex, backfilling legacy rows (migration 069). Fixes MQTT NodeInfo publicKey storage to use base64 instead of hex, backfilling legacy rows (migration 069). Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Bugfix | Medium |
Suppresses duplicate‑packet WARN spam in MQTT ingest. Suppresses duplicate‑packet WARN spam in MQTT ingest. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Refactor | Medium |
Adds migration 068 to create out_path and path_len columns in meshcore_nodes table. Adds migration 068 to create out_path and path_len columns in meshcore_nodes table. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Refactor | Medium |
Adds migration 069 to backfill publicKey values from hex to base64 across SQLite/PostgreSQL/MySQL (idempotent). Adds migration 069 to backfill publicKey values from hex to base64 across SQLite/PostgreSQL/MySQL (idempotent). Source: llm_adapter@2026-05-22 Confidence: low |
— |
Full changelog
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: https://github.com/Yeraze/meshmonitor/compare/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.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Yeraze/meshmonitor
All releases →Related context
Related tools
Earlier breaking changes
- v4.7.2 Route `destination` field now rejects non‑8‑hex nodeId or 64‑hex publicKey, returning HTTP 400.
Beta — feedback welcome: [email protected]