github Yeraze/meshmonitor v4.17.0

3 hours ago

MeshMonitor v4.17.0

Summary

v4.17.0 is the full release after nine release candidates: 64 features and 64 fixes since v4.16.2. MeshMonitor now works out when several of your sources heard the same packet, and uses that for "heard here" map edges, merged rows and an All Channels view in Unified Messages, and one notification per packet. MeshCore gains Trace SNR history with full charts, a Mentions notification, a server-side channel database, and Repeater sources that fill Nodes, Packet Monitor and channel Messages. Scheduled automations can carry a start, an end and a time zone, with a five-minute minimum interval. Reliable PKI, Avoid PKI, "Proven receipt" and a Protection Level picker extend key handling. The Docker image is hardened: every process runs as node, development packages no longer ship, and the image is a third smaller. Per-source permissions are now checked on every route, and system backup download is admin only. Migrations 183 to 202 run on first start.

Read more: release post · security post · CHANGELOG

Upgrade Notes

  • Back up first. Migrations 183 to 202 run on first start.
  • Docker. The first start fixes the ownership of /data once. A root start with cap_drop: [ALL] now fails: set user: "1000:1000" as well. With user:, serial devices need group_add. RUN_AS_ROOT=true restores the old process users for troubleshooting.
  • Non-admin users may lose access. A user needs the grant on the source a request acts on. Grant it on that source under Users. For a public map with route lines, grant traceroute:read to the anonymous account.
  • Backups now hold channel keys and password hashes. Only an admin can download one.
  • Notifications. A source you never saved settings for notifies for direct messages only, with Apprise off until you add URLs. New-node and traceroute alerts default to off.
  • Automations. A scheduled rule faster than every 5 minutes keeps running but must be slowed before it can be saved again (scheduled MeshCore path traces are exempt). A send whose text renders empty is skipped.
  • Auto-Acknowledge on a channel answers 5 to 30 seconds late, and not at all once two other nodes have answered.
  • API clients. An unknown sourceId returns 404; differing sourceId values in query and body return 400. fromNodeNum in every traceroute response is the requester. A non-admin WebSocket client must join a source.
  • Number fields. Blank no longer means 0; type 0 where 0 means off.
  • MeshCore repeater capture (Packet Monitor, adverts, Trace SNR) needs a firmware build with MESH_PACKET_LOGGING.
  • Scheduled traces, aircraft position requests and Reliable PKI transmit, and all are off until you turn them on.

Features

  • meshcore: full-size Trace SNR charts per link direction (#5767)
  • messages: show the mesh protocol on message borders (#5768)
  • meshcore: store TRACE hop SNRs heard by Repeater sources (#5766)
  • automation: timed events: start, end and time zone on scheduled automations (#5743)
  • metrics: export each node's last position time (#5699)
  • meshcore: Mentions notification when a message names the source's own node (#5741)
  • unified: All Channels view on Unified Messages, with channel tags (#5736)
  • automation: trace MeshCore paths on a schedule, each path on its own interval (#5735)
  • meshcore: capture every TRACE the radio hears and keep per-hop SNR history (#5733)
  • map-analysis: add on-air waypoints from Map Analysis, with a per-source picker (#5732)
  • notifications: one notification when several sources hear the same packet (#5731)
  • pki: Avoid PKI mode — channel-encrypted data requests, DMs untouched (#5724)
  • aircraft: mark a node as not aircraft / aircraft by hand (#5725)
  • mqtt: per-bridge skip raise, text in the raise picker, subscription-scope docs (#5726)
  • aircraft: ask a newly flagged aircraft for its position, opt-in, 2 an hour per source (#5727)
  • map: local map markers, per source, never transmitted (#5717)
  • mqtt: broker preset chooser with the official Meshtastic broker (#5700)
  • pki: Reliable PKI — prime NodeInfo before PKI sends to nodes that stopped answering (#5702)
  • auto-ack: wait 5-30 s and stay quiet when enough nodes have already answered (#5695)
  • traffic-management: read-only replay for position dedup and rate limit, and corrected docs (#5681)
  • firmware: explain hardware that cannot be updated in place of the update UI (#5680)
  • automations: trigger.ageMinutes on MeshCore node triggers (#5679)
  • meshcore: meshcore.ca and RF Lab presets for the Analyzer Observer (#5678)
  • ui: number fields can be cleared; blank is outlined and blocks Save (#5652)
  • chat: sender name opens the node popup with status; status emoji badge on the avatar (#5651)
  • config: TAK team and role module settings (#5641)
  • security: Protection Level picker for packet_signature_policy (#5642)
  • admin: shutdown, DFU and factory reset actions, with audit log (#5638)
  • status: quick-access status message pill with presets (#5639)
  • automation: run-scoped step outputs, the empty-send rule, and two variable-store fixes (#5640)
  • lint: guardrail against hardcoded colours in inline styles and CSS (#5606)
  • notifications: user-configurable message notification format + lighter default (#5605)
  • automations: role, hops and last-heard tokens on MeshCore node triggers (#5603)
  • translation: provider descriptors own config fields; one API key per provider (#5600)
  • unified: merge one MeshCore message heard by several sources into one row (#5590)
  • map: traceroute-confirmed reciprocal links on the cross-source layer (#5586)
  • meshcore: map toggle to hide nodes whose latest advert had no position (#5585)
  • meshcore: decrypt GRP_TXT / GRP_DATA in the Packet Decode modal (#5583)
  • meshcore: split or truncate long Auto-Acknowledge replies (#5584)
  • map: cross-source "heard here" edges and the cross_source_links table (#5575)
  • meshcore: virtual channels in the channel database (#5576)
  • meshcore: repeater RAW ingest — adverts to Nodes, GRP_TXT to gated channel Messages (#5574)
  • cross-source: correlation foundation, packet monitor tags, coverage flags (#5573)
  • forwarding: source-level master switch, sidebar FWD pill, automation action (#5572)
  • dashboard: Live Mesh Activity widget (#5570)
  • meshcore: local telemetry for directly-attached repeaters (#5539)
  • nodes: remote admin shortcut from node details (#5541)
  • automations: node discovered/updated triggers for both protocols + packet tokens (#5540)
  • translation: translation cache + stored translations for every viewer (#5527)
  • meshcore: resend channel messages no repeater echoed (#5525)
  • messages: filtered CSV export + search fixes (#5523)
  • notifications: per-source channel mute fix + MeshCore channel mute (#5522)
  • reports: Traceroute Explorer report card (#5514)
  • meshcore: show auto-add state, push contacts to the radio, explain the mismatch (#5513)
  • meshcore: favorite a node from Node Details (#5510)
  • meshcore: Discover Path countdown and response / no-response feedback (#5509)
  • meshcore: populate a repeater source's Nodes and Packet Monitor from its serial CLI (#5505)
  • meshcore: Message count sort and last-message times in the channel list (#5506)
  • map: give MeshCore Repeaters their own glyph, apart from Meshtastic routers (#5501)
  • meshcore: auto return path for Trace Path (#5490)
  • channels: store and preserve ChannelSettings.use_aead (#5248 Phase 1) (#5492)
  • delivery: show Meshtastic ack proof "Proven receipt" (#5489)
  • automation: broadcast waypoints with a hop limit (#5484)
  • nav: Pin sidebar on MeshCore sources, shared with Meshtastic (#5483)

Bug Fixes

  • status: read the Status Message back from the node after a save (#5769)
  • automation: name Channel Database channels in the channelName token and filter (#5740)
  • meshcore: honest delivery state for own DMs and room posts (#5730)
  • notifications: Emoji Reactions off also mutes protocol tapbacks and keycap reactions (#5721)
  • automations: offer the suggested template and warn when a step sends nothing (#5716)
  • config: module-config saves update the module cache (#5714)
  • config: local MQTT save keeps location consent and map report settings (#5713)
  • map-analysis: phone-width inspector and time slider clear of map controls (#5712)
  • admin: remote MQTT save keeps client proxy and map reporting (#5707)
  • map-analysis: keep tool panels open across layout changes and clear of map controls (#5710)
  • site-planner: clear the old ring on a new origin; keep map controls off the panel (#5706)
  • site-planner: fold the panel after predict so the ring shows on phones (#5698)
  • docker: prune dev deps, run every process as node, bump base images (#5701)
  • settings: put each per-source control on the page its name promises (#5694)
  • meshcore: mark unrelayed channel sends "Sent to radio" (#5693)
  • map: raster fallback when a vector tileset meets a browser with no WebGL2 (#5688)
  • nav: one icon and one label for Device Configuration and Settings on every source type (#5684)
  • meshcore: per-section /snapshot grants, anonymous neighbour reads, and tabs that follow their grant (#5674)
  • permissions: gate every WebSocket event on the recipient's grants, per source (#5665)
  • permissions: scope embeds and the v1 API per source; MeshCore telemetry ids; restart is admin only (#5664)
  • config: send a stored 0 interval as 0, one channel read-back, drop dead desktop Virtual Node checkboxes (#5662)
  • permissions: gate every section of GET /api/poll on the source its data comes from (#5661)
  • permissions: check private positions per source; scope telemetry reads and /api/status; one rule for a source's address (#5660)
  • admin: explain a stored 0, send one request per Owner/Channels Load, drop dead Virtual Node env vars (#5659)
  • permissions: scope optional-sourceId reads to the caller's sources; make install-wide jobs admin only (#5658)
  • permissions: check mesh-request, announce, connection and channel permissions against the target source (#5657)
  • permissions: check nodes, settings and message routes against the target source (#5656)
  • config: check device-config permissions against the target source (#5655)
  • reticulum: dock the phone tab bar under the content, via a shared layout (#5648)
  • admin: per-section Load for Status Message, Traffic Management and MeshBeacon (client and remote) (#5644)
  • security: a local Security save keeps the node's packet signature policy (#5637)
  • sources: mask credentials in source config for non-admin editors (#5635)
  • meshcore: Repeater-source nodes open in Node Details and stay on the map (#5634)
  • traceroute: write the position snapshot on every path; auto-traceroute picker counts either stored form (#5633)
  • backup: back up every table, stream the export, allowlist restore on all backends (#5618)
  • sources: tighten source config redaction for non-admins (#5619)
  • notifications: a source with no saved preferences uses the built-in defaults, never another source's row (#5609)
  • mqtt-bridge: stop retrying a rejected broker login, per client (#5610)
  • traceroute: serve every traceroute row requester-first (#5611)
  • meshcore: Virtual Node sends the packed out_path_len, not a hop count (#5608)
  • meshcore: ingest page header shows region and broker again (#5607)
  • stop ingest login retries, back up Observer keys, purge key rows on source delete (refs #5596) (#5602)
  • notifications: take the page's colours from theme tokens (#5604)
  • build: eager CSS plugin matches its module id on Windows (#5599)
  • meshcore: Virtual Node relays SendBinaryReq STATUS (0x01) and TELEMETRY (0x03) (#5598)
  • translation: refine endpoint URL resolution (#5545)
  • meshcore: trace path waits per the firmware's suggested timeout (#5589)
  • meshcore: repeater serial health probe and auto-reconnect (#5581)
  • packet-monitor: "Hide Own Packets" keeps TX rows, and show a hidden count (#5582)
  • lora: correct modem preset tables, add TINY presets, firmware 2.8 region rules, LongModTurbo recipe (#5571)
  • settings: appearance and UI preferences are global-only (#5569)
  • meshcore: 3-byte Define Path, shared telemetry labels, local-node favorites (#5566)
  • map: CARTO key on report maps, one-world clamp, coverage overlap chooser (#5565)
  • coverage: select the blocking live survey on SURVEY_ALREADY_LIVE (#5562)
  • messages: enforce the 2-character search minimum on the server (#5536)
  • api: v1 message search reads MeshCore history from the database (#5529)
  • db: scope migration information_schema checks to the current database (#5531)
  • notifications: partial preference saves so the Notifications tab can't drop mutes (#5528)
  • map: vector basemaps crash with node clustering (#5521)
  • telemetry: keep the time range selector when the window is empty (#5499)
  • meshcore: show a repeater's TX power, position and preset (#5497)
  • push: scope Web Push subscribe state and unsubscribe to the source (#5495)
  • http: stop browsers resending slow requests (RF re-transmits every 30 s) (#5494)
  • meshtastic: send data requests at the node's configured hop limit (#5488)

Maintenance (docs, CI, refactor, tests)

  • pull test database images from mirror.gcr.io (#5705)
  • stop the onUserConsoleLog teardown flake (#5703)
  • bound the ClamAV install step and add job timeouts (#5673)
  • mqtt: explain missing MQTT traffic; warn on the source card when client proxy has no link (#5663)
  • add-ons: describe Virtual Node sidecars and REST API clients separately (#5653)
  • add-ons: list Mesh Screensaver and Mesh Widget (Zebar) (#5650)
  • take wall-clock and module-load cost out of flaky tests (#5617)
  • coverage: explain why a survey looks sparse, link it from setup guidance (#5601)
  • ci: track JS bundle size budgets (#5538)
  • build: split the main bundle (#5530)
  • pwa: raise the service-worker precache cap to 6 MiB (#5524)
  • Inline translation of messages (#5480)
  • protobufs: bump to master 2542e06, and plan AEAD channels and ack proof (#5486)

Dependencies

  • 16 dependency updates via Dependabot.

Thanks

Thanks to @Crim for inline message translation (#5480, #5545), @Cryptoteep for the All Channels view (#5654), @zaepho for the last-position metric (#5699), DrivenMadz for the container scan behind the Docker hardening (#5692), and everyone who tested the nine release candidates.

Full changelog: v4.16.2...v4.17.0

🚀 MeshMonitor v4.17.0

📦 Installation

Docker (recommended):

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

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