MeshMonitor v4.14.1
The headline of this release is the Meshtastic ↔ MeshCore Automation Bridge, you can now relay text between a Meshtastic channel and a MeshCore channel with a single click, built entirely on the Automation Engine rather than a native bridge. A new in-app Automation Template Gallery ships click-to-install templates (an MT↔MC Bridge and an Auto-Ack), a new {{ trigger.protocolShort }} token tags relayed messages MT@/MC@, and layered loop/flood safeguards (a per-automation rate limit, a MeshCore cross-source self-guard, and a content guard) protect against the amplifying-loop failure mode. The release also completes a large theme-system overhaul: colors are now named by role rather than by swatch, with new categorical and sequential color scales and a full migration off hardcoded palette values. MeshCore gains a strict receive-only mode, Analyzer Observer battery/uptime/noise reporting, static MQTT auth, and several delivery/pathing fixes. Messaging picks up an unread divider with jump-to-first-unread and channel-list unread badges. Rounding it out: position "last updated" display and estimate-anchor rationale, a fistful of map and MQTT fixes, a Windows startup fix, ESM/build hardening, and the usual dependency and translation updates.
🌉 Meshtastic ↔ MeshCore Automation Bridge (#4577)
- In-app Automation Template Gallery, click-to-install templates that land disabled for review (#4679)
- MT↔MC Bridge template, scaffolds a matched automation pair with a built-in loop guard (#4681); wizard pickers scoped per-protocol (#4683)
- Auto-Ack template, acknowledge direct/zero-hop messages with a tapback or reply (#4679)
{{ trigger.protocolShort }}token →MT/MC(#4675)- Loop & flood safety: per-automation rate limit + MeshCore cross-source self-guard + content guard (#4676)
- User docs & recipe with flood-safety guidance (#4682)
✨ Features
- Automation Engine: became-mobile & left-home triggers for tamper/theft monitoring (#4648, thanks @gztproject)
- Automation Engine: distinct reaction emoji for MQTT-sourced pings (#4601)
- MeshCore: strict receive-only mode, backend enforcement, frontend UX, and Virtual Node gating (#4550, #4552, #4555)
- MeshCore: Analyzer Observer publishes battery / uptime / noise floor (#4557); static MQTT username/password auth (#4602)
- Messages: unread divider + jump-to-first-unread for both protocols (#4615); channel-list unread bell badge (#4669)
- Packet inspection detail view on message hop-count click (#4664)
- Show when a node's position was last updated (#4663); record & expose the anchors behind an estimated position (#4613)
- Security: set a node's private key from Device Configuration (#4654)
- Themes: categorical color scale (#4605) and sequential scale (#4611)
- Ko-fi support links in the sidebar and site nav (#4666, #4665); User Scripts Gallery, Border Wait Times (#4686)
🐛 Bug Fixes
- MeshCore: deliver MeshMonitor-originated channel messages to app clients (#4668); preserve newlines in message bodies (#4661); update contact Last Heard on incoming DM (#4554); treat a lost out_path ack as success (#4628); hot-swap Analyzer Observer publisher on signing-key change (#4544)
- MQTT: fire message events & alerts for MQTT-sourced messages so the Automation Engine and alerts trigger (#4600)
- Map: single card shell for node popups (#4680); reduce statistical-route edge overlap (#4678); gate marker clicks on density, not zoom alone (#4563); stop shading pending-traceroute nodes as 0-hop/local (#4576); fit-bounds icon fix (#4564)
- Nodes: stop dropping distinct nodes with a non-numeric nodeNum in the unified view (#4578); clear auto-favorite, auto-traceroute, and auto-time-sync allowlists on node purge (#4651, #4630)
- Auto-ack: stop acknowledging tapbacks (#4574); key the tapback guard on the emoji flag, not its presence (#4589)
- Neighbor Info: surface why a request was rejected (403/429) (#4575)
- Positions: make
replaceAnchorsatomic and document its empty-nodeNums contract (#4621); remove a deadhopsAwaywrite (#4612) - Desktop: fix Windows 11 startup by bundling
dist/componentsinto packaging (#4592) - Security: regenerate session on proxy-auth identity binding (#4672); gate MeshCore map positions on
nodes:viewOnMap(#4560)
🎨 Theme system overhaul (#4567 / #4579)
- Name theme colors by role, not by swatch (#4623); read role tokens from script, not palette vars (#4622)
- Migrate ~136 files off raw palette vars to semantic tokens across 5+ batches (#4581–#4587, #4619, #4620)
- Fix tinted backgrounds that ignored the active theme (#4617); pick chart slots that stay distinct in every theme (#4606); drop dead fallbacks on semantic tokens (#4585)
- Refresh the theme gallery for role-token themes (#4597, #4624)
🛠️ Build / CI / DevOps
- Enforce explicit
.jsESM extensions on server-compiled relative imports (#4599); fail the build on unresolvable runtime imports (#4598); guarantee the server emits sharedcompile.js(#4671) - Docs & agent-workflow notes; CHANGELOG backfill and MQTT-bridge test-flake fix (#4572)
📦 Dependencies & Translations
- ~15 Dependabot bumps (production & dev groups, CodeQL action, lucide-react, puppeteer, typescript-eslint, es-module-lexer, globals, rust-cache, and more)
- Several Hosted Weblate translation updates (#4673, #4561, #4541, #4252)
Issues Resolved
Closes #4685, #4677, #4662, #4660, #4659, #4657, #4633, #4632, #4629, #4625, #4614, #4610, #4609, #4607, #4604, #4596, #4595, #4594, #4593, #4591, #4590, #4579, #4573, #4570, #4569, #4568, #4567, #4566, #4562, #4559, #4556, #4553, #4551, #4547, #4545, #4543, #4535, #4517.
Contributors
Thanks to external contributors @gztproject and @pfmos this release, alongside the core maintainer @Yeraze and the Hosted Weblate translation community.
Full changelog: v4.14.0...v4.14.1
🚀 MeshMonitor v4.14.1
📦 Installation
Docker (recommended):
docker run -d \
--name meshmonitor \
-p 8080:3001 \
-v meshmonitor-data:/data \
ghcr.io/Yeraze/meshmonitor:4.14.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.