MeshMonitor v4.9.0
A feature release focused on keeping your mesh healthy and your automations polite. v4.9.0 adds low-battery alerts for monitored nodes and an airtime-utilization cutoff that automatically pauses bot automations (auto-traceroute, auto-announce, timers, and more) whenever the connected node's Channel Utilization climbs above a threshold — so bots back off while real people are using the channel and resume once it quiets down. The Device Info telemetry graphs gain a time-range selector (15m–7d) with averaging that scales correctly across long windows on every database backend. Automation templates pick up a new {LAST_HOP} variable that resolves the last relay node. The per-source ignore list is now authoritative, re-applying the ignore flag (and re-pushing it to the radio) when a device drops it. On the fixes side, MQTT environment telemetry is visible again (keys now match serial ingestion, with a migration to repair history), and a PostgreSQL GROUP BY bug in the new averaged telemetry query — which returned HTTP 500 on Postgres deployments — was caught by the release system tests and fixed, with a Postgres regression test added to standard CI so it can't recur.
Features
- Low-battery alerts for monitored nodes (#3310, closes #3305) — notify via Apprise / Web Push / Desktop when a monitored node's battery drops below a configurable threshold.
- Airtime-utilization cutoff (#3311) — a "Cutoff Airtime Utilization Threshold" on the Automation page pauses all transmitting automations while the mesh is busy; live status banner, manual sends never blocked.
- Telemetry time-range selector + scalable averaging (#3312) — 15m–7d window selector on the Device Info graphs, remembered per browser, with averaging that no longer truncates long windows.
{LAST_HOP}automation variable (#3320, closes #3318) — resolves the last relay node (short name → hex byte →unknown) in autoresponder/auto-ack templates.- Ignored-node auto-reapply (#3313, closes #2601) — the per-source ignore list is authoritative; re-applies and re-pushes the ignore flag when a device's node DB drops it.
- MeshCore chat date separators (#3319, closes #3316) — separators between messages from different days.
Bug Fixes
- Averaged telemetry graph query on PostgreSQL (#3327) — fixed an HTTP 500 from
GET /api/telemetry/:nodeIdon Postgres (GROUP BYfunctional-dependency error); added a Postgres regression test topr-testsCI. - MQTT telemetry key normalization (#3315, closes #3314) — MQTT environment metrics now use the canonical keys serial uses, with a migration to repair existing rows, so they show in the graphs.
- Unified source node count (#3323, closes #3321) — include MeshCore nodes in the count.
- Apprise configuration (#3325, closes #3324) — fixed a UNIQUE constraint error when configuring Apprise for a second source.
- MeshCore packet-log timestamps (#3317) — widened
meshcore_packet_logtimestamp/createdAt to BIGINT. - API rate limiter (#3309, closes #3308) — exempt RFC 1918 / loopback IPs so local/reverse-proxy traffic isn't throttled.
- PWA chat input (#3307) — removed dead space below the chat input in the installed PWA.
- MeshCore sidebar icons (#3306) — use lucide icons matching the MQTT/Meshtastic styling.
Issues Resolved
#3305, #3308, #3314, #3316, #3318, #3321, #3324, #2601
Full changelog: v4.8.3...v4.9.0
🚀 MeshMonitor v4.9.0
📦 Installation
Docker (recommended):
docker run -d \
--name meshmonitor \
-p 8080:3001 \
-v meshmonitor-data:/data \
ghcr.io/Yeraze/meshmonitor:4.9.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.