Skip to content

v4.16.0-rc3

Pre-release
Pre-release

Choose a tag to compare

@Yeraze Yeraze released this 04 Sep 21:56
ea6154a

MeshMonitor v4.16.0-rc3

Pre-release. This is a release candidate for 4.16.0. It is not tagged latest and does not publish :latest Docker tags. Run it on a mesh you can afford to have misbehave, and please report anything odd.

This RC is dominated by two threads. The first is adapting to Meshtastic 2.8, whose behavioral changes break assumptions MeshMonitor had baked in: node numbers are now derived from a node's public key rather than its MAC, so an upgrading node reappears as a stranger with its history orphaned; position and telemetry broadcast became opt-in, so previously chatty nodes go quiet; and Range Test was removed from every 2.8 build. MeshMonitor now detects key-verified identity changes and offers an operator-initiated history merge with a dry-run preview and an undo journal, explains a silent 2.8 node instead of leaving you to guess, and disables Range Test with a notice rather than failing quietly. The second thread is mobile landscape, where five separate reports turned out to share one root cause: mobile CSS gated on max-width alone silently switches off when a phone rotates, because a landscape phone is wider than the 768px breakpoint. That single mistake was hiding the Sources drawer's close control, misrendering the bottom nav, leaving the map frozen at the wrong size until reload, and stranding the map sidebar as a cramped floating panel.

Also here: MeshBeacon transmit configuration is corrected twice over — once for a stale module-config cache that made saves appear to revert, and once for firmware field removals that made them genuinely impossible — the MeshCore MQTT ingest epic advances through four phases, and a firmware-sourced audit corrects a batch of config help text that had been quietly lying about firmware limits.

Features

  • Detect Meshtastic 2.8 node-number identity changes (#5044) — pairs an old node to its new number by CRC-32 of the public key, the firmware's own rule, so a rename does not break the match
  • Operator-initiated identity merge with dry run and undo (#5048)
  • Warn when a node goes silent on Meshtastic 2.8+ (#5042)
  • MeshCore MQTT ingest source, Phase 1 (#5043)
  • MeshCore MQTT ingest — packet monitor, Phase 2 (#5046)
  • Grouped packet monitor for MQTT ingest sources, Phase 2b (#5049)
  • MeshCore node discovery from adverts on MQTT ingest, Phase 3 (#5050)
  • MeshCore channel messages from an MQTT region feed, Phase 4 (#5063)

Bug Fixes

  • Warn instead of silently failing on Range Test for firmware 2.8+ (#5041)
  • Unbury the Sources drawer close control and the header chrome (#5058)
  • Re-flow the map on landscape rotation and back (#5057)
  • Give MapSidebar a real landscape treatment (#5067)
  • Refresh the MeshBeacon module-config cache after a save (#5061)
  • Drop the removed MeshBeacon broadcast_on_* fields, target the channel table (#5064)
  • Clarify position broadcast interval limits (#5059) — thanks @temalo
  • Correct stale firmware claims in config help text (#5066)

Testing / Infrastructure

  • Isolate PG/MySQL fixtures per suite instead of serializing them (#5047) — eight suites shared fixture table names in one test database and raced under parallel Vitest; each suite now gets its own throwaway database

Issues Resolved

  • #5031 Hide or warn on Range Test for Meshtastic 2.8+ nodes
  • #5032 Handle node ID change on Meshtastic 2.8 upgrade
  • #5033 Warn when node goes silent on 2.8+ due to opt-in position/telemetry change
  • #5045 MeshBeacon single-transmit Region/Preset revert to UNSET after save
  • #5051 Animated connection badge overflows/clips Sources button
  • #5052 Map zoom control renders above Sources sidebar
  • #5053 Mobile landscape: cannot close Sources menu
  • #5054 Map and bottom nav break on landscape rotation
  • #5055 Position Broadcast Interval help text states inaccurate 32s firmware minimum
  • #5056 Help-text audit: stale/misleading firmware claims
  • #5060 MapSidebar full-screen sheet never applies in landscape
  • #5062 MeshBeacon broadcast_on_* fields removed from firmware

Upgrade Notes

Submodule bump. protobufs/ moved to v2.8.0-15 (#5064). A git pull updates the recorded commit but not your checkout — run git submodule update --init --recursive or you will build against the pre-removal protos.

MeshBeacon transmit settings moved. The single Transmit Region / Transmit Modem Preset / transmit-channel fields are gone, because firmware removed them on 2026-08-28 and consolidated transmit destinations onto broadcast_targets. Set destinations in the Broadcast Targets list instead; the per-target channel is now a slot picker over channels that already exist on the node. No stored data is affected — this config is read live from the device, and the removed fields never shipped in a tagged firmware release.

Node history after a 2.8 upgrade. A node upgrading to 2.8 gets a new node number and appears as a new node with its history under the old one. MeshMonitor flags likely pairs; merging is explicit, operator-initiated, and previewed before anything is written.

Known limitation. "Post-removal firmware ignores the old MeshBeacon fields" is inferred from the reserved protobuf tags and nanopb's unknown-field skip, not observed on hardware — the available 2.8 test node is a develop build from the window where those fields still existed.

Full Changelog: v4.16.0-rc2...v4.16.0-rc3

🚀 MeshMonitor v4.16.0-rc3

📦 Installation

Docker (recommended):

docker run -d \
  --name meshmonitor \
  -p 8080:3001 \
  -v meshmonitor-data:/data \
  ghcr.io/Yeraze/meshmonitor:4.16.0-rc3

🧪 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.