This release includes 1 security fix for security teams reviewing exposed deployments.
Topics
Affected surfaces
ReleasePort's take
Light signalv4.6.3 fixes blocking Linux LXC and baremetal installation failures and introduces per-source MQTT ACL enforcement on retroactive decryption.
Why it matters: Linux LXC and baremetal deployments must upgrade to install. MQTT users with sensitive channels should enable per-source ACLs and register channel_database permissions immediately.
Summary
AI summaryBroad release touches Bug Fixes, Issues Resolved, π MeshMonitor v4.6.3, and meshcore.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Medium |
Enforce per-source ACLs on retroactive decrypt and register `channel_database` permission resource. Enforce per-source ACLs on retroactive decrypt and register `channel_database` permission resource. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
β |
| Feature | Medium |
Optional zero-hop injection mode prevents RF rebroadcast of MQTT-bridged packets. Optional zero-hop injection mode prevents RF rebroadcast of MQTT-bridged packets. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
β |
| Feature | Medium |
Scroll-position-aware infinite scrollback for MeshCore channels with "Jump to Bottom" button. Scroll-position-aware infinite scrollback for MeshCore channels with "Jump to Bottom" button. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
β |
| Feature | Medium |
MQTT channel permissions routed through `channel_database`, keyed by channel name across all sources. MQTT channel permissions routed through `channel_database`, keyed by channel name across all sources. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
β |
| Dependency | Medium |
Bump version to 4.6.3 and add v4.6.3 permissions blog post link. Bump version to 4.6.3 and add v4.6.3 permissions blog post link. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
β |
| Deprecation | Medium |
Hide per-source `channel_0..7` toggles for MQTT scopes, directing admins to Virtual Channel Permissions. Hide per-source `channel_0..7` toggles for MQTT scopes, directing admins to Virtual Channel Permissions. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
β |
| Bugfix | Medium |
Skip puppeteer Chrome download via `.npmrc` to fix Linux LXC and baremetal install failures. Skip puppeteer Chrome download via `.npmrc` to fix Linux LXC and baremetal install failures. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
β |
| Bugfix | Medium |
Cascade bridge prune to parent MQTT broker source for consistent geo-membership state. Cascade bridge prune to parent MQTT broker source for consistent geo-membership state. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
β |
| Bugfix | Medium |
Preserve tapback metadata across MQTT ingest and cross-source merges, stopping reaction flickering. Preserve tapback metadata across MQTT ingest and cross-source merges, stopping reaction flickering. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
β |
| Bugfix | Medium |
Persist contact `advType` to `meshcore_nodes` for correct repeater target classification in remote-telemetry scheduler. Persist contact `advType` to `meshcore_nodes` for correct repeater target classification in remote-telemetry scheduler. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
β |
| Bugfix | Medium |
Stamp `node.channel = CHANNEL_DB_OFFSET + dbId` on MQTT NODEINFO and POSITION ingest; gate `/traceroutes` and `/neighbor-info` endpoints by channel permissions. Stamp `node.channel = CHANNEL_DB_OFFSET + dbId` on MQTT NODEINFO and POSITION ingest; gate `/traceroutes` and `/neighbor-info` endpoints by channel permissions. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
β |
| Bugfix | Medium |
Use Catppuccin variables for MQTT permissions hint banner, improving readability in light and dark themes. Use Catppuccin variables for MQTT permissions hint banner, improving readability in light and dark themes. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
β |
| Other | Medium |
Drop worktree restriction from CLAUDE.md documentation. Drop worktree restriction from CLAUDE.md documentation. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
β |
Full changelog
MeshMonitor v4.6.3
Patch release focused on MQTT-source permissions and map visibility. v4.6.2 reworked MQTT ingest end-to-end so cross-source dedup and channel decryption finally work; v4.6.3 fixes the permission and rendering gaps that release exposed. The MQTT ingest path now stamps node.channel with the channel-database-encoded virtual channel id so the map filter can honor Virtual Channel Permissions; previously anonymous and non-admin viewers saw zero nodes on the map for MQTT sources regardless of what was granted. The traceroute and neighbor-info endpoints are now channel-gated, so the map no longer renders line segments between coordinates of nodes the user has no permission to view ("floating lines"). MeshCore contacts are now mirrored to meshcore_nodes on ingest so the remote-telemetry scheduler can correctly classify repeater targets β closes the user-visible part of #3092 for deployments with repeaters that don't anonymously answer LPP requests. Unified Messages now keeps tapback metadata across multi-source merges so reactions stop flickering between rendering as emoji pills and full inline messages. A long-standing puppeteer install failure on Linux LXC / baremetal was fixed by skipping the Chrome download via .npmrc. Companion features include an opt-in MQTT-broker zero-hop injection mode (prevent RF rebroadcast of MQTT-bridged packets), scroll-position-aware infinite scrollback for MeshCore channels, and a Catppuccin restyle of the MQTT permissions hint banner.
Features
- #3100
feat(mqtt-broker): optional zero-hop injection to prevent RF rebroadcast of MQTT-bridged packets (closes #3084) - #3102
feat(meshcore): scroll-position-aware infinite scrollback for MeshCore channels with "Jump to Bottom" button (closes #3101) - #3108
feat(mqtt): route MQTT channel permissions throughchannel_databaseso MQTT-source access is keyed by channel name across all sources, not by per-source slot. Hides thechannel_0..7toggles for MQTT scopes and directs admins to Virtual Channel Permissions.
Bug Fixes
- #3098
fix(install): skip puppeteer Chrome download via.npmrcso installs no longer fail on Linux LXC, Raspbian baremetal, and other environments without GUI dependencies (closes #3097) - #3103
fix(security): enforce per-source ACLs on retroactive decrypt; register thechannel_databasepermission resource - #3104
fix(prune-roi): cascade bridge prune to the parent mqtt_broker source so geo-membership state stays consistent across linked sources - #3105
fix(unified): preserve tapback metadata (emoji,replyId) across MQTT ingest + cross-source merge β reactions no longer flicker between rendering as emoji pills and as full inline messages - #3107
fix(meshcore): persist contactadvTypetomeshcore_nodesso the remote-telemetry scheduler can correctly classify repeater targets and route them through the SendStatusReq + guest-login paths added in #3094 (closes #3092) - #3109
fix(users): use Catppuccin variables for the MQTT permissions hint banner so it's readable in both light and dark themes - #3110
fix(mqtt): stampnode.channel = CHANNEL_DB_OFFSET + dbIdon MQTT NODEINFO and POSITION ingest so the map filter honors Virtual Channel Permissions, and channel-gate the/traceroutesand/neighbor-infoendpoints so non-admins no longer see traceroute / neighbor lines floating between hidden nodes
Docs
- #3106
docs(claude): drop worktree restriction from CLAUDE.md - #3111
chore(release): bump version to 4.6.3 (this release) β also adds the v4.6.3 permissions blog post
Issues Resolved
- #3084 β [FEAT] MQTT Broker: Optional zero-hop injection
- #3092 β [BUG] MeshCore telemetry retrieval fails on every repeater (meshcore-only setup) β final fix; the in-memory contact advType is now persisted so the scheduler picks the repeater paths
- #3097 β 4.6.2-1 install fails on Linux LXC: Puppeteer Chrome extraction error
- #3101 β MeshCore channel display: implement infinite scrollback
Upgrade notes
Action required if you have anonymous or non-admin map viewers on MQTT sources:
- Open Users β Permissions β scope to each MQTT source. The
channel_0..7grid is now hidden for MQTT scopes; a banner directs you to Virtual Channel Permissions below. - Scroll down to Virtual Channel Permissions and grant
View on MapandReadon the relevantchannel_databaserows (e.g.LongFast,MediumFast) for each user (including Anonymous if applicable). - Existing nodes with
channel=NULLwill recover as each MQTT node re-broadcasts NODEINFO (typically every few hours). If you don't want to wait, restart the MQTT broker / bridge container.
MeshCore repeater telemetry: if you have repeaters with Telemetry Retrieval enabled and were seeing only LPP timeouts on v4.6.2 (issue #3092), 4.6.3 finally activates the SendStatusReq + guest-login paths shipped in v4.6.2's #3094 β they were never being invoked because advType wasn't being persisted to the database.
Full Changelog
https://github.com/Yeraze/meshmonitor/compare/v4.6.2-1...v4.6.3
π MeshMonitor v4.6.3
π¦ Installation
Docker (recommended):
docker run -d \
--name meshmonitor \
-p 8080:3001 \
-v meshmonitor-data:/data \
ghcr.io/Yeraze/meshmonitor:4.6.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.
Security Fixes
- Fix #3103: enforce per-source ACLs on retroactive decrypt and register `channel_database` permission resource
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]