github Yeraze/meshmonitor v4.16.2-rc4

pre-release4 hours ago

MeshMonitor v4.16.2-rc4

⚠️ Pre-release. This is a release candidate for testing. Back up your database before upgrading.

Summary

rc4 adds likely-aircraft detection: nodes flying well above the terrain are flagged, badged on the map, kept out of Auto-Favorite, optionally aged out, and can draw flight trails. MQTT sources now store position history, so Position History and trails work for nodes heard only over MQTT. Nodes gain a per-source First Heard time, and the Nodes tab gains a quick age filter that never changes the saved setting. MeshCore channels can be sorted in MeshMonitor and, new in this release, reordered on the companion itself, with history and settings following each channel. MQTT and MeshCore sources no longer borrow the primary Meshtastic radio for sends, config writes or status, which also closes a hole that exposed the primary node's private key on MQTT broker sources. Several MeshCore timing bugs are fixed: Last Heard no longer advances for powered-off nodes, drifted clocks no longer break sorting, and new-node notifications fire again. A max node age of 0 now means "all nodes" everywhere, and the local node number is read correctly on every source. This release adds migrations 175–179.

Added

  • Likely-aircraft detection. A node flying more than a set height above the terrain beneath it (default 500 m; 5000 m above sea level when there is no terrain data) is flagged as a likely aircraft. Mountaintop repeaters stay fixed. Per source, in Settings → Node Display. Migrations 175–178. (#5364, #5365, #5386, #5391, #5396)
    • The map shows a plane badge and popup line, with a Show / Mark / Hide control in both Map Features panels.
    • Auto-Favorite skips likely aircraft by default, and a new automation trigger fires when a node becomes one.
    • Optional age-out ignores (or, opt-in, deletes) aircraft not heard for N hours, and lifts the ignore when a live position arrives. A node that stays put is reclassified as fixed.
    • Flight trails, off by default, draw each aircraft's recent path with a 1 h–7 day lookback.
    • MQTT sources now store position history, so Position History and trails work for nodes heard only over MQTT.
  • First Heard for Meshtastic and MeshCore nodes, per source: set once from the first believable reception and never overwritten. Shown in node details, map popups and the node export. Migration 179 fills it for existing nodes from the earlier of createdAt and Last Heard. (#5390, #5395)
  • Nodes tab quick age filter (Setting / 24h / 3d / 7d / 30d / All) in the Nodes header. It changes the view only, never the saved setting, and applies to the Nodes list and its map for Meshtastic and MeshCore. (#5387, #5394)
  • MeshCore channel order: a sort dropdown on the Channels page (device order, name, last message, custom), with drag-and-drop for the custom order. Stored per browser. (#5385, #5392)
  • Reorder MeshCore channel slots on the companion from Channels settings. Each slot write is read back, a failure restores the original layout, and message history, unread markers, scope, per-channel permissions and MeshCore auto-ack / announce / responder / timer settings follow each channel. Connected Virtual Node apps are disconnected so they re-read the list. Automations that name a raw channel number are listed for review, not rewritten. (#5379, #5397)
  • Unified Messages hop counts: each source tag shows how many hops that source heard the message at (? when unknown). (#5366, #5393)
  • Transmit target window (Settings → Node Display, default 24 h, 1–720): when the node window is 0 ("all"), auto-traceroute, the remote-admin scanner and remote LocalStats pick targets from nodes heard within this window instead of none. (#5376, #5384)
  • Virtual Node PKI import opt-in (allowPkiImport, off by default) for the MeshCore ImportPrivateKey command, and a Virtual Node card on the MeshCore Node Info view showing its status, admin and PKI settings. (#5350, #5372, #5380, #5381)

Changed

  • The three node-age controls say what they do: the sidebar pill is informational, "Node list & map window (hours)" sets the default, and the map's age filter can only narrow it. The Nodes header shows the active window. (#5344, #5373)
  • MQTT and MeshCore sources no longer borrow the primary Meshtastic radio. Sends, mesh requests, channel pushes, device config, remote admin and connect/disconnect from those sources are refused (SOURCE_NOT_MESHTASTIC), and status routes report the source's own state. Send controls on MQTT sources are disabled with an explanation. A disconnected TCP source returns SOURCE_NOT_CONNECTED. (#5367, #5371, #5375, #5383)
  • Virtual Node companion commands: remove, rename, favourite, reset path, import contact and reboot are now handled (admin-gated), along with share/export contact and stats. Private-key import and raw data are refused unless opted in. (#5350, #5372)

Fixed

  • Security: an MQTT broker source's Info and Device Config tabs showed, and could write to, the primary TCP node, including its private key. (#5367, #5371)
  • Max node age 0 hid every non-favourite node in the per-source Nodes tab and removed all neighbour links from the map. It now means "all nodes". (#5338, #5352, #5378)
  • MeshCore
    • A powered-off node's Last Heard kept advancing: contact syncs, path resets and failed DMs stamped it with "now". (#5341, #5343)
    • Nodes with a drifted clock (year 2000 or 2087) broke Last Heard sorting and pinned messages to the wrong place in the channel. Implausible times now fall back to receipt time, and stored bad values heal. (#5339, #5342)
    • New-node notifications never fired for companions in auto-add mode, because the first advert has no name. (#5340, #5370)
  • Local node number was read from a key the manager never writes, so /api/config, spam detection, telemetry security badges and distance auto-delete missed the local node on every source except the default. (#5377, #5382)
  • Mesh Issues C2 "Broadcasting too often" flagged MeshMonitor's own directly connected nodes because of their phone-only telemetry. (#5388, #5389)
  • MQTT text messages were stored without hop data. (#5393)
  • Global Settings lost its Sorting section. (#5368, #5369)
  • watch-release.sh could report a stale run as the release result. (#5362)

Pull Requests

Features: #5386, #5391, #5396 (likely-aircraft), #5395 (First Heard), #5394 (Nodes quick age filter), #5392 (MeshCore channel sort), #5397 (on-device channel reorder), #5393 (Unified hop counts), #5373 (node-age control labels)

Bug fixes: #5352, #5378 (max node age 0), #5343, #5342, #5370 (MeshCore), #5371, #5383 (MQTT sources), #5372, #5381 (Virtual Node), #5382 (local node number), #5384 (TX target window), #5389 (Mesh Issues C2), #5369 (Sorting section)

CI/DevOps: #5362 (watch-release.sh), #5398 (version bump)

Issues Resolved

#5338, #5339, #5340, #5341, #5344, #5350, #5364, #5365, #5366, #5367, #5368, #5375, #5376, #5377, #5379, #5380, #5385, #5387, #5388, #5390

Thanks

Thanks to @temalo for the max-node-age fix (#5352).

Upgrade Notes

  • Migrations 175–179 run on first start (all additive; nullable columns and a new preferences column).
  • MQTT and MeshCore sources now refuse Meshtastic send/config/connection requests with SOURCE_NOT_MESHTASTIC instead of acting on the primary radio. API clients that relied on that fallback must target the Meshtastic source directly.

Full Changelog: v4.16.2-rc3...v4.16.2-rc4

🚀 MeshMonitor v4.16.2-rc4

📦 Installation

Docker (recommended):

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

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

Don't miss a new meshmonitor release

NewReleases is sending notifications on new releases.