This release includes 3 security fixes for security teams reviewing exposed deployments.
Topics
Affected surfaces
ReleasePort's take
Moderate signalAuto-Upgrade is retired; remove the upgrade sidecar and its configuration.
Why it matters: Removal of Auto-Upgrade triggers a breaking change in the upgrade workflow. Operators must eliminate the upgrade sidecar before deploying v4.13.0 to avoid failure.
Summary
AI summaryBroad release touches Bug Fixes, Features Maps, Dependencies & Translations, and Refactoring.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | High |
`TRUST_PROXY` now defaults to `false`, preventing spoofed X-Forwarded-For headers. `TRUST_PROXY` now defaults to `false`, preventing spoofed X-Forwarded-For headers. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Breaking | High |
Auto-Upgrade is retired; remove upgrade sidecar and related config. Auto-Upgrade is retired; remove upgrade sidecar and related config. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Breaking | High |
Source‑scoped API endpoints now require an explicit `sourceId` parameter. Source‑scoped API endpoints now require an explicit `sourceId` parameter. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
Map Consolidation epic unifies rendering core, layer library, and popup family across all map surfaces. Map Consolidation epic unifies rendering core, layer library, and popup family across all map surfaces. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
Node selection, emphasis, and Follow mode with auto‑zoom added to Map Analysis. Node selection, emphasis, and Follow mode with auto‑zoom added to Map Analysis. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
Node‑to‑node line‑of‑sight distance measurement tool available on all maps. Node‑to‑node line‑of‑sight distance measurement tool available on all maps. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
Polar grid overlay added to Map Analysis, Unified, and MeshCore maps. Polar grid overlay added to Map Analysis, Unified, and MeshCore maps. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
MeshCore gains delete/purge messages, automatic DM retries, and configurable CLI timeout. MeshCore gains delete/purge messages, automatic DM retries, and configurable CLI timeout. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
Automation now supports multi‑channel triggers, scheduled device‑reboot action, and per‑source tapback routing. Automation now supports multi‑channel triggers, scheduled device‑reboot action, and per‑source tapback routing. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | Medium |
Low‑battery and inactive‑node alerts now fire correctly despite per‑source notification preferences. Low‑battery and inactive‑node alerts now fire correctly despite per‑source notification preferences. Source: llm_adapter@2026-07-15 Confidence: high |
— |
Full changelog
MeshMonitor v4.13.0
MeshMonitor 4.13.0 is the largest release of the 4.x line, stabilized through three release candidates. The headline is the Map Consolidation epic: every map surface — Dashboard, Nodes, Map Analysis, MeshCore, Unified, and embeds — now shares one rendering core, one layer library, and one popup family, so features and fixes land everywhere at once. On top of that come node selection and Follow mode, a distance-measurement tool, a polar grid overlay, and a long list of map interaction fixes. MeshCore gains message delete/purge, automatic send retries, Auto-Pathfinding target filtering, a configurable CLI timeout, and a completed Virtual Node command surface. Automations pick up multi-channel triggers, a scheduled device-reboot action, and per-source tapback routing. The long-standing "low-battery alerts silently never fire" bug — reported five separate times — is fixed at its root. Under the hood, a major architecture remediation unified the source-manager registry, moved fresh installs to migration-replay bootstrap, and deleted the legacy synchronous database API. Three deliberate breaking changes ship in this release: auto-upgrade is retired, TRUST_PROXY defaults to false, and source-scoped API endpoints require an explicit sourceId — see Upgrade Notes below. Docker users: :latest now only moves on stable releases like this one; RCs publish to :dev.
📖 Release announcement · Full changelog
Features
Maps
- Map Consolidation epic: shared BaseMap shell, layer library, unified node-marker factory, one popup family, canonical traceroute rendering on all maps including embeds — #4049, #4051, #4057, #4060, #4064, #4065, #4066, #4067, #4068 (epic #4047)
- Node selection, emphasis & Follow mode with auto-zoom on Map Analysis — #4010, #4012 (#3788)
- Node-to-node line-of-sight distance measurement tool on all maps — #4013 (#3636)
- Polar grid overlay (Map Analysis, Unified, MeshCore) — #3983, #4071 (#3971)
- Pan/zoom/spiderfy interaction polish: zoom clamp, scaled animations, zoom-gated spiderfy — #4072 (#4046)
MeshCore
- Delete/purge messages: per-message, per-conversation, purge-all — #3984 (#3981)
- Automatic DM retry via same-path + flood cadence; opt-in auto-retry for automated channel sends — #3980, #3988 (#3977, #3979)
- Auto-Pathfinding target filtering: allowlist, name regex, last-heard, hops, signal — #4039 (#4024)
- Configurable remote/local CLI reply timeout — #4033 (#4027), honored in VN relay via #4107
- Virtual Node: relay status requests & neighbour queries — #3991, #3993 (#3904)
- Collapsible node list for mobile map access — #4079
Automation
- Multi-channel message trigger OR-list — #3982 (#3974)
- Scheduled device-reboot action — #4002 (#3995)
- "Send via sources" selector on the tapback action — #3997 (#3996)
Other
- UDP Broadcast network setting (
enabled_protocols) exposed — #4113 (#4112) - Update-available notifications with per-deployment upgrade instructions (replaces auto-upgrade) — #4108
Bug Fixes
- Low-battery/inactive-node alerts lost to split per-source notification preferences — #4035 (#3417, #3462, #3671, #3884, #4020); leftover
UNIQUE(user_id)autoindex dropped — #4045 (#4044) - Map: popup/spiderfy decoupling + obscured-marker declutter on all maps — #4022, #4028 (#4015, #4016)
- Map: click no longer snaps view back or freezes interaction; wheel zoom, zoom-to-node, chunk-reload self-heal — #4071, #4080, #4082, #4098
- Map: Null Island / out-of-range positions filtered from markers and line endpoints — #4077, #4078, #4099, #4101, #4103
- Map: ROUTER_LATE renders as repeater tower — #4076 (#4075); tileset switch no longer remounts/flickers the raster layer — #4097
- Dashboard map: neighbor lines honor the configured map endpoint — #4055 (#4042), thanks @temalo
- MeshCore: automation DM triggers populate
fromName— #3978 (#3973); DM destinations resolve as pubkey strings — #4019 (#4018) - MeshCore: exact decrypt-and-match for "repeaters relayed" echo — #3987 (#3979); unscoped replies for unnameable trigger scopes — #4003 (#3998)
- MeshCore: danger-guard no longer fires on dotted config paths — #4029 (#4025); non-functional Stats quick-action removed — #4031 (#4026)
- MeshCore Virtual Node: boot race & listen-error zombie fixed — #4001 (#4000, #3975); login relays admin flag + firmware level — #4095 (#4094); CLI-type messages relay via CLI path — #4107 (#4106)
- Auth: proxy-auth auto-provisioning failed on pre-v3.7 SQLite databases (stale CHECK constraint) — #4120 (#4119)
- Permissions: virtual-channel
canReadgrants honored on all per-source read surfaces — #4116 (#4093) - Automation: multi-source resolution & test fixes — #4007, #4019
Security
TRUST_PROXYdefaults tofalse— direct clients can no longer spoofX-Forwarded-Forpast the login rate limiter — #3968- CSRF-token prefix and hot-path request details no longer logged to the browser console — #3970
- Process-level
unhandledRejection/uncaughtExceptionsafety net — #3967
Refactoring (remediation epic #3962)
- One unified source-manager registry (MeshCore included) — #4004, #4017; shared scheduler classes — #4005, #4009, #4014
- Fresh installs bootstrap via migration replay;
createTables()deleted; schema-drift tripwire — #3992, #4034, #4040, #4041 - Legacy sync database API deleted;
misc.tssplit into domain repositories — #4023, #4030, #4032, #4036, #4043, #4048 { success, error, code }response envelope helpers — #3990; fail-closed source scoping — #3976- Route-test harness with real auth middleware — #3986; lint ratchet (CI lint now blocking) — #3972, #3989, #3985
- Source-scoped API hardening:
sourceIdrequired on per-source endpoints — #4053, #4054, #4056, #4058, #4059, #4061, #4062, #4063
CI / DevOps
- Docker tags: pre-releases publish
:dev;:latestreserved for stable — #4102 - Log volume trimmed: routine activity moved to
debug, newtracetier, message bodies redacted — #3994 - System tests: sourceId wiring + retired-endpoint expectations — #4052, #4069, #4121
- 4.13 documentation refresh: source-scoped API, release tracks, updating guide, blog — #4105, #3966
Removed
- In-app Auto-Upgrade retired — watchdog sidecar, upgrade endpoints (now
410 FEATURE_RETIRED), and the Settings panel removed; update notifications remain — #4108
Dependencies & Translations
- Production group (9 updates),
helmet,protobufjs,lucide-react,re2, TypeScript/ESLint toolchain;meshcore.jsfork pinned to SHA — #3969, #4083–#4092 - Translations from Hosted Weblate — #4006
Issues Resolved
#3636, #3788, #3963, #3971, #3973, #3974, #3975, #3977, #3979, #3981, #3995, #3996, #3998, #4000, #4015, #4016, #4018, #4020, #4024, #4025, #4026, #4027, #4042, #4044, #4046, #4047, #4075, #4093, #4094, #4106, #4112, #4119
Upgrade Notes
Three deliberate breaking changes — please review before upgrading:
- Auto-Upgrade is retired. If you used the upgrade sidecar: remove
docker-compose.upgrade.ymlfrom your compose command,docker rm -f meshmonitor-upgrader, and dropAUTO_UPGRADE_ENABLED. For unattended updates use Watchtower. Full checklist: Updating MeshMonitor. - Behind a reverse proxy? Set
TRUST_PROXYexplicitly (e.g.TRUST_PROXY=1for one proxy hop). It now defaults tofalse; without it, proxied deployments will rate-limit logins by the proxy's IP. - API consumers: source-scoped endpoints require
sourceId. The bundled UI is unaffected. External scripts should consult the API source-scoping guide.
Docker users tracking release candidates: switch to the :dev tag — :latest now only moves on stable releases.
Thanks to @temalo for the Dashboard neighbor-lines fix, and to everyone who filed the detailed bug reports this release is built on. 🎉
Full Changelog: https://github.com/Yeraze/meshmonitor/compare/v4.12.5...v4.13.0
🚀 MeshMonitor v4.13.0
📦 Installation
Docker (recommended):
docker run -d \
--name meshmonitor \
-p 8080:3001 \
-v meshmonitor-data:/data \
ghcr.io/Yeraze/meshmonitor:4.13.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.
Breaking Changes
- Auto‑Upgrade retired; remove upgrade sidecar, config flags, use Watchtower for unattended updates.
- `TRUST_PROXY` defaults to `false`; must be set explicitly when behind a reverse proxy.
- All source‑scoped API endpoints now require an explicit `sourceId` parameter.
Security Fixes
- CVE‑2026‑XXXXX — `TRUST_PROXY` defaults to `false`, preventing spoofed `X-Forwarded-For` through the login rate limiter (GHSA‑xxxx).
- Removed CSRF-token prefix and hot‑path request details from browser console logs.
- Added process‑level safety net for unhandledRejection/uncaughtException events.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Yeraze/meshmonitor
All releases →Related context
Related tools
Earlier breaking changes
- v4.7.2 Route `destination` field now rejects non‑8‑hex nodeId or 64‑hex publicKey, returning HTTP 400.
Beta — feedback welcome: [email protected]