MeshMonitor v4.7.2
A maintenance release focused on Channel Database robustness, message-ordering correctness, and request-input validation. The MQTT default-channel bootstrap no longer crashes on pre-v3.7 SQLite installs that still carry the legacy CHECK (psk_length IN (16, 32)) constraint, and a long-requested Import from URL flow lets admins paste a Meshtastic channel URL and save its channels as virtual decryption-key rows in one step. Messages from nodes with bad RTCs (year 1970 or 2065) now sort by server-side receipt time instead of the radio's claimed timestamp, so channel and DM lists stay in the order MeshMonitor actually saw the traffic. A long-standing crash where a 64-char public key pasted as a destination overflowed the PG bigint column is fixed: routes now treat 64-hex inputs as a publicKey lookup, malformed inputs return HTTP 400, and the underlying repository guard catches the entire class of bug regardless of the entry point. A new MQTT bridge direction mode ("publish only" / "subscribe only" / "bidirectional") silences the permission-denied spam on public servers like mqtt.meshtastic.org.
Features
- #3191 Import channels from a Meshtastic URL — paste
https://meshtastic.org/e/#…, MeshMonitor decodes the embeddedChannelSetand lets you select which channels to save as virtual rows (with editable names and PSK preview). - #3189 MQTT bridge direction-mode dropdown —
publish_onlyfor public servers that reject SUBSCRIBE,subscribe_onlyfor read-only monitoring,bidirectional(default) preserves existing behavior.
Bug Fixes
- #3185 Channel Database — drop legacy
psk_length IN (16, 32)CHECK constraint that blocked the MQTT default-channel bootstrap on databases created before the v3.7 baseline. Adds migration 071 that detects and rebuilds the table on affected SQLite installs (no-op for fresh / PG / MySQL). Fixes #3184. - #3188 Nodes — reject out-of-range
nodeNumand resolvepublicKeydestinations. Six routes (DM / traceroute / position / NodeInfo / NeighborInfo / telemetry) now route 8-hex strings toparseInt, 64-hex strings to a publicKey lookup, and everything else to HTTP 400. Defense-in-depth guard inNodesRepository.getNode/getNodesByNumscatches the bug at the DB boundary too. Fixes #3186. - #3190 Messages — sort by server-side ingest time (
receivedAt), not the radio's reportedtimestamp. Channel + DM lists and per-node "last message" aggregations are now stable under bad-clock senders. Display is unchanged — the bubble still shows the radio's claimed time so misconfigured nodes remain visible. Fixes #3187.
Dependencies
- #3180 Bump
pgfrom 8.20.0 to 8.21.0. - #3179 Bump
helmetfrom 8.1.0 to 8.2.0. - #3181 Bump
protobufjsfrom 8.3.0 to 8.4.2. - #3182 Bump production-dependencies group across 1 directory with 9 updates.
- #3176 Bump development-dependencies group with 3 updates.
Issues Resolved
- #3184 MQTT channel_database bootstrap fails with CHECK constraint when primary channel uses AQ==
- #3186 nodeNum overflow causes DrizzleQueryError: invalid input syntax for type bigint
- #3187 Nodes with bad time stay at the bottom of channels tab
Upgrade notes
- Pre-v3.7 SQLite installs will pick up migration 071 on first boot. It rebuilds the
channel_databasetable to drop the legacy CHECK constraint. Rows + ids + theidx_channel_database_enabledindex are preserved. Fresh installs and PG/MySQL installs are a no-op. - API behavior change: routes that take a
destinationfield (DM / traceroute / position / NodeInfo / NeighborInfo / telemetry requests) now return HTTP 400 for inputs that aren't an 8-hex nodeId or a 64-hex publicKey. Clients passing already-parsed numericdestinationvalues are unaffected. - No schema changes for messages —
receivedAtis computed from the existingmessages.createdAtcolumn, exposed as a new field on the wire.
Full changelog: v4.7.1...v4.7.2
🚀 MeshMonitor v4.7.2
📦 Installation
Docker (recommended):
docker run -d \
--name meshmonitor \
-p 8080:3001 \
-v meshmonitor-data:/data \
ghcr.io/Yeraze/meshmonitor:4.7.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.