Skip to content

Releases: Yeraze/meshmonitor

v4.12.1

27 Jun 01:42
27ad4f8

Choose a tag to compare

MeshMonitor v4.12.1

A hotfix for a startup-breaking regression in 4.12.0.

🐛 Fixed

  • Startup crash when upgrading to 4.12.0 (#3804, #3805) — On installs with MQTT channel permissions, migration 103 could fail with UNIQUE constraint failed: channel_database_permissions.user_id, channel_database_permissions.channel_database_id and crash the app on every start, leaving it unbootable. When consolidating duplicate MQTT channels, the migration now removes conflicting permission rows before reassigning them to the keeper channel (SQLite, PostgreSQL, and MySQL — the latter via a derived-table subselect). A regression test covers the collision case.

Anyone who hit the crash on 4.12.0 can upgrade straight to 4.12.1. (If you previously hand-patched the compiled migration as a workaround, that's fine — the migration is idempotent.)

Thanks to @BeerMan81 for the detailed report and root-cause analysis.

Full changelog: v4.12.0...v4.12.1

🚀 MeshMonitor v4.12.1

📦 Installation

Docker (recommended):

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

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

v4.12.0

26 Jun 23:38
d17a535

Choose a tag to compare

MeshMonitor v4.12.0

A large feature release headlined by two new capabilities: a node/builder-based Automation Engine ("when this happens, do that" — triggers → conditions → actions, with variables, {{ }} token substitution, geofence/schedule/system triggers, an "Apprise notify"/"Run a script" action set, and an in-app dry-run tester), and MeshCore Regions/Scopes (per-channel and per-source scope tagging, a Discover Regions sweep, per-message scope overrides, a saved-regions catalog, and received-message scope display). It also lands a deep round of multi-source correctness work — channel/backup/permission queries are now consistently scoped by sourceId (closing a cross-source permission leak), the unified message feed no longer drops messages, and MQTT channels are identified by name and key. Position history was substantially fixed: every fix now renders with full backward pagination, hover/click tooltips with hop count and direct-heard SNR work, and ground_speed is correctly treated as km/h (it was being inflated ~3.6×). MeshCore gains channel unread indicators, a "heard repeaters" badge, per-message hop/route lines, a live byte-accurate character counter, on-demand telemetry polling, and a manual Define-Path editor with 1/2/3-byte hash widths. Other highlights: customizable login branding via env vars, Null-Island position filtering, richer Map-Analysis node popups, git-native LXC templates with in-place updates, and a hardened PostgreSQL channel_database rebuild path. The documentation site was brought current with all of the above, including a new Automation Engine page. This release supersedes the 4.12.0-rc1/rc2 pre-releases.

✨ Features

Automation Engine (#3653) — #3721, #3726, #3727, #3739, #3746 — visual builder, schedule (cron)/geofence/system triggers, multi-source/unified-channel send, "Run a script" + JSON result variables, and in-builder {{ }} token validation.

MeshCore Regions / Scopes (#3667) — #3704 (per-message scope override), #3762 (received-message scope display, Phase 2), #3765 (0-hop region discovery), #3783 (saved-regions catalog + pickers).

MeshCore UI#3707 (channel "heard repeaters" badge), #3716 (channel unread indicators), #3750 (hop count + relay route under received messages), #3790 (byte-accurate character counter + readability).

Other#3781 (custom login title/logo via env vars), #3764 (filter out Null Island 0,0 positions), #3692 (rich multi-source Map-Analysis node popups), #3779 (compact {ROUTE} auto-ack variable), #3768 (git-native LXC templates with bundled in-place updater).

🐛 Bug Fixes

Position history & maps#3795 (render every fix + paginate full history), #3800 (ground_speed is km/h, not m/s — fixes ~3.6× speed inflation), #3801 (Analysis-Map cross-source neighbor links: union not intersection), #3687 (spiderfy + auto-collapse), #3784 (neighbor-link dedup + MQTT transport class), #3694 (position-packet channel from decryption context).

Multi-source / MQTT#3736, #3738 (messages no longer vanish from the unified feed), #3717 (channel queries scoped by sourceId), #3714 (manual backup scoped to source), #3757 (local-node lookup scoped to source), #3713/#3708/#3754 (MQTT channels identified by name and key), #3748 (batch per-source reads — fixes source-toggle 429s).

MeshCore#3794 (heartbeat/auto-reconnect + drop detection + reconnect-after-disconnect), #3706 (stop virtual node server on transport teardown), #3702 (Discover Regions timeout), #3722/#3728 (serialize binary-response/raw-frame ack handling), #3737/#3715 ({ROUTE}/{SNR} resolve on routed messages), #3733 (room-server author pubkey), #3760/#3766 (no DM UI for repeaters / unmessagable nodes), #3785 (preserve node name on empty advert), #3761/#3778 (CLI focus + metadata readability).

Notifications / auto-favorite#3799 (new-node notification fires for direct Meshtastic nodes), #3786 (never auto-favorite CLIENT/CLIENT_MUTE on CLIENT_BASE locals).

Traceroute#3699/#3723 (route over the default-keyed channel + channel-selection dropdowns).

🔒 Security

  • #3749 — scope filterNodesByChannelPermission by sourceId (cross-source permission leak for guests).
  • #3730 — hide node identity from unauthenticated users in the header and poll API.

🛠️ Data / Migrations

  • #3753 — rebuild channel_database on PostgreSQL column-tombstone exhaustion (1600-attnum limit), now hardened to run atomically (BEGIN/COMMIT/ROLLBACK) so a mid-rebuild failure rolls back to the original table intact.

🤝 Contributors

Thanks to @BeerMan81 for the LXC template work (#3768, #3793).

Issues Resolved

#3791, #3792, #3796, #3797, #3798, #3787, #3782, #3780, #3777, #3776, #3774, #3773, #3770, #3769, #3763, #3756, #3755, #3752, #3751, #3745, #3744, #3743, #3742, #3740, #3735, #3734, #3732, #3729, #3725, #3720, #3719, #3712, #3711, #3710, #3709, #3703, #3701, #3700, #3698, #3696.

Full changelog: v4.11.6...v4.12.0

🚀 MeshMonitor v4.12.0

📦 Installation

Docker (recommended):

docker run -d \
  --name meshmonitor \
  -p 8080:3001 \
  -v meshmonitor-data:/data \
  ghcr.io/Yeraze/meshmonitor:4.12.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.

v4.12.0-rc2

26 Jun 02:20
d36cf11

Choose a tag to compare

v4.12.0-rc2 Pre-release
Pre-release

MeshMonitor v4.12.0-rc2

⚠️ Pre-release / release candidate. Built for testing the 4.12.0 line — not recommended for production. Please report issues.

Summary

This second 4.12.0 release candidate rolls up a large body of multi-source, MeshCore, and Automation work on top of rc1. MeshCore region discovery now actually works end-to-end: it queries only nearby (0-hop) repeaters and routes the request directly so repeaters answer it, and received messages now show the scope/region, hop count, and relay route they arrived on. The Automation Engine gains a "Run a script" action with JSON result variables, cron-scheduled triggers, a geofence map editor, multi-source/unified-channel sends, and {{ }} token highlighting/validation. A cluster of multi-source correctness and security fixes landed — cross-source permission and channel-scoping leaks closed, the "messages vanish after ~1 minute" dedup regression fixed, node identity hidden from unauthenticated users, and manual backups scoped to the selected source. MQTT channel handling was consolidated to identify channels by name + key (no more duplicate raw-slot entries), and a PostgreSQL channel_database tombstone-exhaustion migration failure was fixed. Traceroutes now route over the correct default-keyed channel, and the Map/Map-Analysis views got richer multi-source popups plus a spiderfy auto-collapse fix. Also includes the unmessagable-node DM-UI fix and a dashboard rate-limit (429) fix when toggling sources.

Features

  • MeshCore: query only 0-hop repeaters for region discovery + route the query direct (#3765, #3743)
  • MeshCore: show the scope/region a received message was sent with (#3762) and hop count + relay route below received messages (#3750) — #3742
  • MeshCore: per-message scope/region override (#3704, #3701)
  • MeshCore: unread message indicator on the Channels view (#3716, #3703)
  • MeshCore: channel "heard repeaters" via self-echo correlation (#3707, #3700)
  • Automations: "Run a script" action + JSON result variables (#3746, #3653)
  • Automations: fire trigger.schedule on a cron schedule (#3726)
  • Automations: geofence map editor, multi-source/unified-channel send, builder/test-panel UX (#3721)
  • Automations: highlight {{ }} tokens + flag typos in builder text fields (#3727)
  • Map: filter out Null Island (0,0) positions (#3764, #3763)
  • Map Analysis: rich multi-source node popups matching the Unified map (#3692)

Bug Fixes

  • Messaging: no DM UI for MeshCore repeaters & Meshtastic unmessagable nodes (#3760, #3766, #3755)
  • Unified feed: append-only message feed so windowing can't evict a seen message (#3738) and prevent messages vanishing in multi-source feed (#3736) — #3719, #3720
  • Security: scope channel-permission node filter by sourceId (#3749, #3745); scope dashboard local-node injection lookup to the source (#3757)
  • Channels: scope channel queries, mark-read & message migration by sourceId (#3717, #3712)
  • Auth: hide node identity from unauthenticated users in header and poll API (#3730, #3729)
  • MQTT: consolidate channels by name (#3708, #3709); identify channels by name AND key (#3713); attribute same-key channels by packet hash (#3754)
  • Migration: rebuild channel_database on PostgreSQL tombstone exhaustion (#3753, #3751)
  • Traceroute: route over the default-keyed channel + channel dropdowns (#3723); always send on Primary (#3699) — #3696
  • MeshCore: keep CLI command-line focus after send (#3761, #3752); resolve room-server author full public key (#3733); {ROUTE}/{SNR} resolve on routed channel messages (#3737, #3715, #3710); unified radio-op lock (#3728, #3725); serialize 0x8C binary-response consumers (#3722); Discover Regions Sent-payload fix (#3702); stop virtual node server on teardown (#3706); honor packet-monitor Max count (#3693, #3690)
  • Meshtastic: resolve position-packet channel from decryption context (#3694, #3682)
  • Map: spiderfy fix + stop auto-collapse on Map Analysis & Unified maps (#3687, #3685)
  • Automations: don't flag valid-but-wrong-trigger {{ }} tokens as typos (#3739)

Performance

  • Dashboard: batch per-source reads to fix source-toggle 429s without exempting GETs (#3748, #3735)

CI / Chore

  • watch-ci.sh inspects only runs for the current head commit (#3747)
  • Version bumps to 4.12.0-rc1 (#3695) and 4.12.0-rc2 (#3767)

Issues Resolved

Closes #3763, #3755, #3752, #3751, #3745, #3744, #3743, #3740, #3735, #3734, #3732, #3729, #3725, #3720, #3719, #3712, #3711, #3710, #3709, #3703, #3701, #3700, #3698, #3696, #3690, #3689, #3685, #3682.

Thanks

Thanks to the community testers and issue reporters who drove the MeshCore region/scope and multi-source work this cycle — especially @m0urs for detailed, persistent reports on region discovery and channel behavior.

Full changelog: v4.12.0-rc1...v4.12.0-rc2

🚀 MeshMonitor v4.12.0-rc2

📦 Installation

Docker (recommended):

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

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

v4.12.0-rc1

24 Jun 02:46
078d6ed

Choose a tag to compare

v4.12.0-rc1 Pre-release
Pre-release

MeshMonitor v4.12.0-rc1

⚠️ Pre-release (Release Candidate). Not tagged latest; intended for testing. Please report issues before the stable v4.12.0.

Summary

This release brings major map improvements and a wave of MeshCore enhancements. Overlapping markers now spiderfy consistently across every map — the per-source Nodes map, Map Analysis, the Unified map, and the dedicated MeshCore source map — and the fan no longer collapses on data refresh or node selection. Map Analysis node popups now match the Unified map's rich card and list every source that reported a node, and a node stays visible if any of its sources is enabled. On the MeshCore side: 2/3-byte forwarding-path hashes in the Define Path editor, manual on-demand telemetry polling, region/scope support (phases 1–3), and richer Last-Heard handling. The Automation Engine landed its Phase 1a foundation with a more capable Test panel. Bug fixes include position packets on private secondary channels now resolving to the correct channel (instead of a raw hash), the MeshCore Packet Monitor honoring its Max-count setting, the local node's Unmessageable flag being persisted and surfaced, low-battery/inactive-node notifications firing for MeshCore, and DM telemetry graphs honoring the temperature-unit setting.

Features

  • Map Analysis: rich multi-source node popups matching the Unified map, with a "Seen by N sources" list (#3692, resolves #3689)
  • MeshCore: 2/3-byte path hash support in the Define Path editor (#3686, resolves #3670)
  • MeshCore: manual telemetry poll buttons (Status / Environment) (#3681, resolves #3674)
  • MeshCore: region/scope support — phase 1 (#3669), phase 2 flood-traffic scoping (#3673), phase 3 region discovery from nearby repeaters (#3679) (resolves #3667)
  • Automation Engine — Phase 1a foundation (#3668) with richer Test-panel dry-run inputs/output (#3675) (resolves #3653)
  • MeshCore: Last Heard shows the date when a node was last heard before today (#3663, resolves #3656)

Bug Fixes

  • Spiderfy works + no auto-collapse on the Map Analysis, Unified, and MeshCore source maps; markers register reliably and stay fanned through refreshes and selection (#3687, resolves #3685; follow-up to #3612/#3615)
  • Position packets on private secondary channels now resolve to the correct channel slot instead of a raw hash (e.g. "channel 39") (#3694, resolves #3682)
  • MeshCore Packet Monitor honors the configured Max-count setting instead of hard-capping at ~200 (#3693, resolves #3690)
  • Local node Unmessageable flag is now persisted and surfaced in the Config tab (#3688, resolves #3684/#3683)
  • MeshCore low-battery & inactive-node notifications now fire (#3672, resolves #3671)
  • DM telemetry graph honors the user's Temperature Unit setting (#3662, resolves #3659)
  • MeshCore Define-Path: shorter set_out_path timeout and clearer error (#3665, resolves #3664)
  • MeshCore logging: LPP telemetry WARN is labelled, and out-of-range nodeNum log-spam from pubkey lookups is gone (#3680, resolves #3676/#3677)

Tests / CI / Chore

  • Guard migrations against source-dependent crashes (#3661, resolves #3657)
  • Default the bug-investigator agent to Opus + grounding contract (#3666)
  • gitignore Python __pycache__ (#3678)
  • Version bump to 4.12.0-rc1 (#3695)

Issues Resolved

#3653, #3656, #3657, #3659, #3664, #3667, #3670, #3671, #3674, #3676, #3677, #3680, #3682, #3683, #3684, #3685, #3689, #3690

Full changelog: v4.11.5...v4.12.0-rc1

🚀 MeshMonitor v4.12.0-rc1

📦 Installation

Docker (recommended):

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

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

v4.11.6

24 Jun 19:35

Choose a tag to compare

MeshMonitor 4.11.6

Maintenance release on the 4.11.x line. Includes all fixes and features merged since 4.11.5 except the Automation Engine (#3653), which ships in 4.12.

MeshCore

  • Region/scope support — phase 1: per-channel scope (#3667)
  • Scope all originated flood traffic — phase 2 (#3667)
  • Region discovery from nearby repeaters — phase 3 (#3667)
  • Per-message scope/region override (#3701)
  • Channel "heard repeaters" via self-echo correlation (#3700)
  • Show unread message indicator on the Channels view (#3703)
  • Manual telemetry poll buttons (#3674)
  • 2/3-byte path hash support in the Define Path editor (#3670)
  • Last Heard shows the date when a node was heard before today (#3656)
  • Fix: honor Temperature Unit on the DM telemetry graph (#3659)
  • Fix: reduce set_out_path timeout and improve the error message (#3664)
  • Fix: low-battery and inactive-node notifications never fired (#3672)
  • Fix: clarify LPP telemetry WARN and stop pubkey/nodeNum log spam (#3680)
  • Fix: honor the packet-monitor Max-count setting in the live list (#3690)
  • Fix: Discover Regions always timed out due to a missing Sent payload (#3682)
  • Fix: stop the virtual node server during transport teardown (#3705)
  • Fix: correlate LogRxData path by hop count so {ROUTE} resolves on routed messages (#3710)

MQTT

  • Fix: consolidate channels by name instead of splitting by slot/hash (#3708)
  • Fix: identify channels by name and key, and enumerate them on the Channels tab (#3712 follow-up)

Map

  • Fix: make spiderfy work and stop auto-collapse on Map Analysis & Unified maps (#3685)
  • Rich multi-source node popups matching the Unified map (#3692)

Meshtastic / general

  • Fix: always send traceroutes on channel 0 (Primary) (#3696)
  • Fix: resolve position-packet channel from decryption context, not the raw hash (#3682)
  • Fix: persist & surface local node isUnmessagable/isLicensed (#3684)
  • Fix: scope manual device backup to the selected source (#3711)
  • Fix: scope channel queries, mark-read & message migration by sourceId (#3712)

Notes

  • Database migrations 098–102 on this line correspond to the 100–104 migrations on the 4.12 (main) line; upgrading 4.11.6 → 4.12 re-runs them idempotently and applies the Automation Engine migrations fresh — no data loss or manual steps.

🚀 MeshMonitor v4.11.6

📦 Installation

Docker (recommended):

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

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

v4.11.5

22 Jun 21:19
43a66c0

Choose a tag to compare

🚑 Hotfix release — supersedes v4.11.4 (retracted)

v4.11.4 was pulled because migration 033 crashed startup on PostgreSQL and on fresh installs with column "sourceId" does not exist (#3657). v4.11.5 fixes that and carries everything that was in v4.11.4.

If you ran v4.11.4, update to v4.11.5. The boot crash is resolved.

🔴 Hotfix (#3657)

  • Migration 033's channel_database backfill is now guarded on the legacy sourceId column existing (it's global-by-design — migration 021 no longer adds it and 063 drops it). Fixes the PostgreSQL / fresh-install boot crash introduced in v4.11.4.

Also included (from the retracted v4.11.4)

Critical

  • PostgreSQL boot-loop fix (tables can have at most 1600 columns) (#3639)

Features

  • MeshCore role icons in the map + DM node lists (#3647)
  • MeshCore favorites pinned to the top of the DM list (#3620)
  • Marker spiderfying for overlapping nodes on Map Analysis + Unified maps (#3612)
  • Channel "overshadow" warning for same-key/different-name Channel Database entries (#3644)
  • Traceroute packetId for cross-source correlation (#3623)

Fixes

  • Node disconnects / TX failures since 4.11.x (#3637)
  • Custom-LoRa-config primary channel mislabeled "LongFast" (#3644)
  • TCP reconnect shows the real per-source address (#3611)
  • Fictitious traceroute segments removed; incoming traceroutes visible (#3622)
  • MeshCore hashtag #channel secrets over plain HTTP-via-IP + at save time (#3606, #3607)
  • MeshCore Last Heard preserved across reconnect (#3645)
  • MeshCore new nodes populate fully when heard live (#3646)
  • Unified-map neighbor lines follow the merged marker (#3642)
  • Adaptive node-type filter per source protocol (#3610)
  • Saner single-anchor position-estimate uncertainty (#3616)

🚀 MeshMonitor v4.11.5

📦 Installation

Docker (recommended):

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

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

v4.11.3

21 Jun 18:25
8e24dca

Choose a tag to compare

MeshMonitor v4.11.3

This release adds a Dead Drop / Mailbox auto-responder — asynchronous "mesh voicemail" where a node can leave a message for another node that need not be online, retrieved later with inbox commands — contributed by new contributor @TheWISPRer. It also brings MeshCore node favoriting (pin any MeshCore node to the top of the list, stored server-side), FEM LNA Mode LoRa configuration surfaced on both the Device Configuration and Remote Admin panels for amplified hardware, and the MeshCore CLI bundled into the Docker image alongside the Meshtastic CLI. On the fixes side, a PostgreSQL/MySQL crash in the MeshCore neighbor query is resolved by widening the neighbor_info timestamp columns to BIGINT (they overflowed signed int32 with millisecond-epoch values), and a proto3 boolean-elision bug that silently re-enabled uplinkEnabled/downlinkEnabled after a container restart is fixed. Position history now captures and displays SNR for directly-heard (0-hop) nodes, the intermittently-blank MeshCore auto-ack {SNR}/{ROUTE} tokens are corrected, mesh-request endpoints return a meaningful 503 (not a generic 500) when the node is disconnected, and the macOS x64 desktop build no longer ships an arm64 re2.node that crashed on Intel Macs. Upgrades are automatic — three idempotent migrations (094–096) run on boot.

Features

  • Dead Drop / Mailbox auto-responder — async "mesh voicemail" (#3538, @TheWISPRer) — a fifth auto-responder type. DM msg <name> <text> to leave a message; retrieve with inbox, inbox play [name], inbox delete <id>, inbox clear. Per-source, configured entirely through the Auto Responder UI, messages marked played only on delivery-success, expired rows purged by the maintenance sweep.
  • MeshCore node favoriting — pin to top of list (#3595) — favorite any MeshCore node (Companion, Repeater, Room Server, …); stored server-side only (firmware has no native favorite concept), consistent with Meshtastic favorites.
  • FEM LNA Mode LoRa configuration (#3600) — surfaces Config.LoRaConfig.fem_lna_mode (Disabled / Enabled / Not Present, firmware ≥ v2.7.20) on both the Device Configuration and Remote Admin LoRa panels.
  • MeshCore CLI bundled in the Docker image (#3591) — ships meshcore-cli / meshcli alongside the Meshtastic Python CLI for a complete in-container toolkit.

Bug Fixes

  • MeshCore neighbor query crashed on PostgreSQL/MySQL (#3602) — meshcore_neighbor_info.timestamp / .createdAt were 32-bit INTEGER/INT but store millisecond-epoch values that overflow int32; widened to BIGINT (migration 096).
  • downlinkEnabled/uplinkEnabled: false reverted to true after restart (#3598) — proto3 elides boolean false, and a ?? true fallback re-inflated user-disabled channel flags on device reconnect; both now default to false.
  • Position history dropped SNR for directly-heard (0-hop) nodes (#3593) — SNR is now captured per-fix and shown in the tooltip; the same 0 dB-drop guard was fixed on the central snr_local telemetry path.
  • MeshCore auto-ack {SNR} / {ROUTE} tokens intermittently blank (#3592) — buffered SNR/route data is now correlated to the matching packet (freshness + pathLen, consumed once) instead of leaking across messages.
  • macOS x64 (Intel) desktop crashed on launch (#3604) — the x64 DMG shipped an arm64 re2.node (ERR_DLOPEN_FAILED); the build now rebuilds re2 from source as x86_64 and backfills the missing CI arch flags.
  • Mesh-request endpoints return 503 (not 500) when disconnected (#3597) — /api/traceroute, /api/position/request, /api/nodeinfo/request, /api/neighborinfo/request, /api/telemetry/request now return a meaningful 503 with the v1-API error shape.

Internationalization

Issues Resolved

  • #3587 — Add MeshCore CLI Python application to Docker image
  • #3588 — MeshCore node favoriting (pin to top of node list)
  • #3589{SNR}/{ROUTE} tokens intermittently missing in MeshCore auto-ack
  • #3590 — Position history: SNR not captured when node heard directly (0 hops)
  • #3594downlinkEnabled: false reverts to true after container restart
  • #3596 — Error on Traceroute when node not connected
  • #3599 — Support FEM LNA Mode configuration (LoRa)
  • #3603 — macOS x64 DMG bundles re2.node as arm64 instead of x86_64

New Contributors

  • @TheWISPRer made their first contribution in #3538 — the Dead Drop / Mailbox feature. Thank you! 🎉

Upgrade Notes

No breaking changes. Three idempotent migrations (094 MeshCore favorites, 095 Dead Drop store, 096 neighbor-timestamp BIGINT) run automatically on first boot across SQLite / PostgreSQL / MySQL.

Full Changelog: v4.11.2...v4.11.3

🚀 MeshMonitor v4.11.3

📦 Installation

Docker (recommended):

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

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

v4.11.2

21 Jun 00:02
57854ea

Choose a tag to compare

Hotfix for 4.11.1 startup crash (PostgreSQL / MySQL)

4.11.1 fails to boot on PostgreSQL/MySQL backends that have an existing Auto-Acknowledge configuration. Migration 093 (the Auto-Acknowledge 2×2 matrix backfill) inserted settings rows without the table's NOT NULL createdAt/updatedAt columns, aborting database initialization with null value in column "createdAt" … violates not-null constraint — a restart loop. On SQLite the violation was silently swallowed, so the matrix settings were never written.

Fixed

  • Migration 093 now supplies createdAt/updatedAt in all three backends (SQLite / PostgreSQL / MySQL). A regression test runs the migration against a real settings table.

Recovery

Affected instances recover automatically on upgrade to 4.11.2 — migration 093 was never marked complete (it threw before committing), so it re-runs and now succeeds, correctly migrating your auto-ack settings. No manual database changes are required.

Full changelog: see CHANGELOG.md → [4.11.2].

🚀 MeshMonitor v4.11.2

📦 Installation

Docker (recommended):

docker run -d \
  --name meshmonitor \
  -p 8080:3001 \
  -v meshmonitor-data:/data \
  ghcr.io/Yeraze/meshmonitor:4.11.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.

v4.11.1

20 Jun 20:17
5a20038

Choose a tag to compare

[4.11.1] - 2026-06-20

Features

  • Device notifications surfaced as toasts + firmware 2.8 favorite/ignore cap handling (#3548): MeshMonitor now shows ClientNotification messages the connected node emits about its own operation — duplicate-key security warnings, invalid-config errors, duty-cycle limits, and more — as top-right toasts. These were always sent by the node but previously decoded and dropped. A server-side policy (clientNotificationPolicy.ts) suppresses the routine recurring ones (e.g. the power-saving "sleeping for N interval" message) and dedupes identical messages to at most once per minute per source, so the feed stays useful rather than noisy. On firmware 2.8, when a Set Favorite / Ignore is refused because the device's protected-node list is full, MeshMonitor reverts its optimistic star/ignore toggle to match the device and surfaces the refusal (this warning is only emitted for the locally-connected node, not remote-admin targets). No protobuf changes were needed — the 2.8 NodeDB warm-tier restructure and the snr_q4 on-disk field do not affect the over-the-air wire MeshMonitor reads (SNR stays a float in dB; a regression test guards this). See docs/internal/dev-notes/MT28_NODEDB_SUPPORT_PLAN.md.

  • Auto-Acknowledge 2×2 matrix — message type × hop distance (discussion #3564): Auto-Acknowledge previously tangled two concepts — its "Direct" toggles actually meant 0 hops (not direct messages), tapback/reply were keyed only on hop distance (shared across channel & DM), and a single global "Respond via DM" applied everywhere. It's now a clean {Channel, Direct} × {0-hop, Multi-hop} matrix: each of the four cells independently configures Message (reply), Tapback (emoji reaction), and Respond via DM. "Respond via DM" applies to the reply only (tapback-via-DM is unreliable) and is disabled until Message is enabled; for Direct cells, replies are inherently DMs. Existing configurations are migrated automatically (migration 093) so behavior is preserved on upgrade. MeshCore auto-ack is unchanged.

  • MeshCore node-type icons & filter on the source map (#3546, #3576): The per-source MeshCore map now renders role-based marker glyphs by advert type — Repeater (tower), Room Server (server rack), Sensor (broadcast), Companion (person) — instead of the generic "MC" badge (kept as the fallback for standard/unknown nodes). The Map Features panel gains a Node Types filter (per-category checkboxes, persisted) to show/hide markers by role, and the legend gains a matching Node Types section when shown. This brings the MeshCore source map to parity with the Map Analysis workspace. The shared map legend opts into the new section via a showNodeTypes prop, so the Meshtastic maps are unchanged.

🚀 MeshMonitor v4.11.1

📦 Installation

Docker (recommended):

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

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

v4.11.0

19 Jun 22:45
a405874

Choose a tag to compare

MeshMonitor 4.11.0 is the general-availability release of the 4.11 line (consolidating v4.11.0-rc1 and v4.11.0-rc2). The headline is the MeshCore virtual node — connect the MeshCore mobile app to a MeshMonitor-managed MeshCore device over WiFi, the MeshCore counterpart to the existing Meshtastic Virtual Node Server. MeshCore also gains name-aware contact forwarding-path editing, role-based map icons, and a node-type map filter. Across both protocols, the map picks up a per-node Hide from Map toggle, and Node Details gets a 15m–7d telemetry time-range selector. This release also wires up newer AirQualityMetrics fields and lands a broad set of correctness fixes — most notably a replay guard that stops powered-off nodes from appearing "recently heard" via replayed/retained MQTT frames, a NodeInfo position-precision guard, RE2 hardening of user-supplied regexes, and per-source scoping fixes for traceroute history and neighbor-info display. Under the hood, server.ts was substantially decomposed into focused route modules and the test suite migrated onto a shared createTestDb helper. Upgrading is drop-in — no manual migration or configuration changes required.

✨ Features

  • MeshCore virtual node — connect the MeshCore app over WiFi (#3540, #3535) — expose a managed MeshCore device as a virtual node the MeshCore app connects to over TCP/WiFi (default port 5000, per-source enablement, admin commands blocked by default, private-key export always blocked).
  • MeshCore: define a contact's forwarding path by repeater name (#3550) — first-class, name-aware path editor, on by default.
  • MeshCore node-type icons + map filtering (#3563, #3546) — role-based markers (repeater / room server / sensor / companion) and a Node Types filter with legend.
  • Per-node "Hide from Map" toggle (#3565, #3549) — suppress a node's map marker everywhere while keeping it visible in lists, DMs, and the packet monitor.
  • Node list export — CSV / HTML (#3537, #3499) — export the Nodes view (respecting current filters/sort) for mesh upgrade planning.
  • Telemetry time-range selector in Node Details (#3530) — 15m–7d range buttons on the Node Details graphs, persisted and shared with Device Info.
  • Position-history map: a marker at every fix, points-only mode, hover tooltip (#3495, #3492).
  • Newer AirQualityMetrics fields wired up (#3517, #3507) — particles_40um, pm40_standard, formaldehyde trio, and PM-sensor extras now graphed.
  • Native OIDC group → role mapping (#3489, #3485) — map IdP groups to admin/login via OIDC_GROUPS_CLAIM / OIDC_ADMIN_GROUPS / OIDC_ALLOWED_GROUPS.
  • UI tweaks + map unification pass (#3561, #3557) — "Messages" → "Node Details" nav, clickable map-popup source rows, unified tile/legend/GeoJSON toggles, and more.

🐛 Bug Fixes

  • Offline nodes kept appearing "recently heard" from replayed packets (#3569) — new replay guard ignores stale lastHeard refreshes from retained/replayed MQTT frames.
  • NodeInfo could overwrite high-precision positions with lower-precision ones (#3516, #3513) — precision-downgrade guard added.
  • User-supplied regexes hardened against ReDoS (#3544) — all user/admin regexes now compiled with RE2 (resolves 4 CodeQL alerts).
  • Traceroute History mixed in rows from every source (#3566) — history now scoped to the active source.
  • Map "Show Neighbor Info" disagreed with the Map Analysis Neighbors view (#3560) — freshness filters aligned.
  • Per-node position override ignored on the multi-source dashboard map (#3559, #3551).
  • SaveBar only saved the active section (#3558, #3552) — grouped sections now save together via "Save All".
  • MeshCore DM contact list nearly empty while node/map view was full (#3554) — in-memory contacts seeded from the durable DB rows on connect.
  • MeshCore node list intermittently collapsed to a single node (#3539).
  • Link previews failed to load on MeshCore / first page visited (#3541) — switched to a static api import so previews resolve under BASE_URL.
  • MeshCore upsertNode overwrote stored data with nulls (#3510, #3504).
  • Node upsert could clobber learned name/MAC/hwModel with blanks (#3512, #3505).
  • Serial telemetry ingest unified onto the shared digit-aware normalizer (#3514, #3506).
  • Traffic Management / Status Message firmware gating corrected (#3493, #3491).
  • Auto-ping ACKs misattributed / duplicate sends (#3522).
  • Battery-alert monitored-node selection stuck with stale IDs (#3487, #3486).
  • Docker entrypoint integrity check for a 0-byte server bundle (#3543, #3542).
  • System-backup download hardened — async existence check + headersSent guards (#3529, #3524).
  • Mobile map Features panel blocked the sidebar Connect button (#3536, #3532).
  • Unified Packet Monitor headers aligned with columns (#3567).

📚 Documentation

  • New MeshCore Virtual Node guide alongside the Meshtastic one (config, default port 5000, admin-command safety, app setup, troubleshooting); CHANGELOG finalized for 4.11.0; refreshed README/index/CLAUDE references.
  • SSO docs corrected and expanded (#3489) — documented DISABLE_LOCAL_AUTH and added a Group → Role Mapping section.
  • Security pages restored to the public site (#3534) — Duplicate-Keys and Low-Entropy-Keys advisories.

🔧 Refactoring & Internal

  • server.ts decomposed into focused route modules — health/cleanup/maintenance/themes/purge, mesh-request/telemetry/connection/device/status, channels, device & system, scripts/data-exchange/server-info, backup + notification, traceroutes/route-segments/neighbor-info/ignored-nodes/announce (#3509, #3519, #3523, #3525, #3526, #3527, #3528).
  • Test suite migrated onto a shared createTestDb helper and config/module-type registry centralized (#3497, #3498, #3500, #3511, #3520).
  • Telemetry pipeline unified onto buildCanonicalMetrics (#3518); dead unguarded channel upsert path removed (#3508).

📦 Dependencies & CI

  • Dependabot updates: azure/setup-helm, actions/setup-python, wait-on-check-action, typescript-eslint, lucide-react, archiver types, and the dev/prod dependency groups (#3466#3476).
  • CI: pinned the Claude Action model (#3488); translations update from Hosted Weblate (#3438).

📋 Issues Resolved

Closes #3535, #3546, #3549, #3499, #3530, #3492/#3494, #3507, #3485, #3557, #3556, #3555, #3553, #3552, #3551, #3542, #3533, #3532, #3524, #3515, #3513, #3506, #3505, #3504, #3503, #3491, #3486, #3480, #3477, #3464.

⬆️ Upgrade Notes

Drop-in upgrade — no manual migration or config changes. Schema migrations (through 092_add_hide_from_map_to_nodes) run automatically on first boot. The MeshCore virtual node and MeshCore name-aware path editing are opt-in / gated by existing permissions.


Full changelog: v4.10.4...v4.11.0

🚀 MeshMonitor v4.11.0

📦 Installation

Docker (recommended):

docker run -d \
  --name meshmonitor \
  -p 8080:3001 \
  -v meshmonitor-data:/data \
  ghcr.io/Yeraze/meshmonitor:4.11.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.