MeshMonitor v4.5.2 — MeshCore Channel Support
A focused follow-up to v4.5.1 — MeshCore TCP Support that closes the last big gap in the MeshCore subsystem: end-to-end channel management from the MeshMonitor UI. Connect a MeshCore Companion and MeshMonitor now reads the device's channel list on connect, displays each channel as its own tab in the MeshCore page with the sent/received messages segregated correctly, and exposes a per-source Configuration UI to add, rename, regenerate the AES-128 secret of, or delete channels — every write goes to the device first and the local mirror is reconciled afterwards. The new send path is channel-idx aware so a message typed in any tab actually reaches that channel instead of falling back to slot 0. Several rough edges from initial real-hardware testing are also smoothed over: the firmware's MAX_CHANNELS placeholders (typically 40 on Companion builds) are filtered out so you only see configured slots, stale empty rows from earlier syncs are auto-cleaned, the DM-view sidebar excludes the channel pseudo-pubkeys and the local node, and the route layer now talks to the correct MeshCore manager registry instead of silently falling back to the Meshtastic singleton. On the Meshtastic side, a long-standing map issue is fixed: per-node position-accuracy boxes now reflect each sending node's own precision_bits instead of the local node's channel setting. The release also flips the changelog links to open in a new tab so a context-switch doesn't blow away the page.
✨ Features
- #3034 — MeshCore channel CRUD + connect-time sync (phase 1/3).
MeshCoreManagerexposeslistChannels/setChannel/deleteChanneland mirrors the device's channel list into the sharedchannelstable on every connect. AES-128 secrets are stored base64-encoded in the existingpskcolumn;cleanupInvalidChannelsis source-type-aware so MeshCore's higher channel indices survive cleanup. - #3038 — Display device channels in MeshCoreChannelsView (phase 2/3). The hardcoded single "Public" entry is replaced by one tab per device-reported channel. Per-channel filter handles both received and locally-sent messages; the manager's
sendMessageand the/api/meshcore/messages/sendroute both grew an optionalchannelIdxso non-channel-0 sends actually go to the right channel. - #3039 — Channel create / edit / delete UI (phase 3/3). New
MeshCoreChannelsConfigSectionmounted insideMeshCoreConfigurationView. Add channel (auto-assigns the lowest free idx, seeds a 16-byte random secret viacrypto.getRandomValues), edit, regenerate-secret, and delete. Secret displayed as hex with masked-by-default show/copy toggles. BackendPUT/DELETE /api/channels/:idroutes are source-type-aware — MeshCore drops the 0-7 cap, widens name to 31 bytes, and routes the write through the manager.
🐛 Bug Fixes
- #3033 — Per-node position precision boxes. Map accuracy boxes now use each sending node's own
precision_bitsinstead of the local MeshMonitor node's channel setting. Removed the local-channel fallback in both the Position and NodeInfo handlers, plus the "smart upgrade/downgrade" logic that was holding onto a stored higher precision for up to 12 hours and refusing legitimate downgrades. Closes #3030. - #3040 — MeshCore channels post-deploy polish. Filters out empty slots so the firmware's MAX_CHANNELS (typically 40 on Companion builds) doesn't leak placeholder rows into the UI; the next sync after upgrade auto-cleans existing leaked rows from the DB. Fixes the route layer to pull the MeshCore manager from the correct
meshcoreManagerRegistryinstead of the Meshtastic fallback (was producingmcManager.setChannel is not a function). DM-view sidebar now filters out thechannel-Nsynthetic pubkeys and the locally-connected node.
🪟 UX
- #3037 — Changelog links open in a new tab so clicking through doesn't unload the page. Closes #3035.
⬆️ Upgrade Notes
- No migrations. The MeshCore channels feature reuses the existing
channelstable — Meshtastic-only columns (role,uplinkEnabled,downlinkEnabled,positionPrecision) stay null for MeshCore rows. - Existing MeshCore installs: after upgrade, the next connect-time sync will run the new reconcile pass and automatically remove the 38-or-so empty placeholder rows that older builds wrote to the
channelstable. No manual cleanup needed. - Position accuracy boxes will start reflecting each remote node's actual
precision_bits. If you had previously seen all boxes mirror your local node's setting, that was the old smart upgrade/downgrade behavior holding stale precision; the new packets will repopulate within minutes. - API change (additive):
PUT/DELETE /api/channels/:idaccept higher channel IDs (>7) when the target source is MeshCore. The Meshtastic 0-7 cap is unchanged.
Issues Resolved
Full Changelog
🚀 MeshMonitor v4.5.2
📦 Installation
Docker (recommended):
docker run -d \
--name meshmonitor \
-p 8080:3001 \
-v meshmonitor-data:/data \
ghcr.io/Yeraze/meshmonitor:4.5.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.