[3.11.1] - 2026-10-30
Breaking changes
- [frontend]: Rename all frontend local storage keys to use the
mbf-prefix and lowercase, hyphen-separated names to avoid possible storage key conflicts when running inside Home Assistant Ingress. As a consequence, all frontend settings will reset to their default values after updating.
Added
- [docker]: Include matterbridge-host-health from the dev branch in the dev and bundev images.
- [core]: Add the Tapo vendor id (5010) to
getVendorIdName. - [WaterHeater]: Enable the
EnergyManagementfeature alongsideTankPercenton theWaterHeaterManagementcluster (Matter 1.6.1 Device Library § 14.2.6, Application Cluster § 9.5.7.3-4), and add optionaltankVolume(default100L) andestimatedHeatRequired(default0mWh) parameters toWaterHeaterOptions,WaterHeater, andcreateDefaultWaterHeaterManagementClusterServer(). Thanks Ludovic BOUÉ. - [WaterHeater]: Implement
BoostStarted/BoostEndedevents, boost duration timer,oneShot,temporarySetpoint,targetPercentage,targetReheat, andHeatDemandupdates inMatterbridgeWaterHeaterManagementServer(Matter 1.6.1 § 9.5.8). - [chip]: Add
water-heater.pics,WaterHeaterManagementtest event triggers, and the 5WaterHeaterconformance tests (TC_EWATERHTR_2_1–2_3,TC_WHM_1_2,TC_WHM_2_1) on endpoint1402(npm run chip:test:water-heater). - [core]: Freeze the prototypes of the BroadcastServer, ThreadsManager, Matterbridge, platform, endpoint, command handler and MatterbridgeServer classes from the cli, and of the ThreadsWrapper, WebRTC session and transport classes when their module loads, so their methods cannot be patched.
- [docker]: Add instructions in README-DOCKER on how to change the health check port and protocol without disabling it.
- [frontend]: Double-click the plugin frontend button in the plugins and devices lists to open the plugin frontend in a new tab instead of the dialog.
- [frontend]: Show the web icon on the device config button when its
configUrlpoints to the device's own plugin frontend. - [workflows]: Add the daily
badgesworkflow andscripts/badges.mjs, which publish the all-time npm downloads and Docker pulls with one decimal (e.g. 1.1M) as shields.io endpoint badges in a gist; the READMEs use them.
Changed
- [core]: Skip frontend startup automatically in controller mode.
- [core]: Use an automatically assigned controller port unless
--portis explicitly provided. - [core]: Restore controller commands using the matter.js 0.18 controller API and separate MatterbridgeController storage.
- [vscode]: Enable Git sign-off and update commit message instructions to v.1.0.1 so Git adds the trailer at commit time.
- [core]:
Matterbridge.loadInstance()now throws when an instance is already loaded and the singleton is a true private field. - [scripts]: Sync deep-clean, git-sync-dev, and prepublish-clean with the mb-run templates.
- [frontend]: A device
configUrlopens in the dialog only when it points to the device's own plugin frontend. AconfigUrlpointing to another plugin's frontend hides the config button. - [agents]: Explain in the plugin-frontend rule (v.1.0.2) why the plugin frontend must be opened at its directory URL with a trailing slash.
- [codex]: Sync
.codex/config.tomlwith the mb-run template (v.1.0.6). - [matterbridge]: Bump
matterbridgeversion to v.3.11.1. - [matterbridge]: Bump
@types/bunto v.1.4.4. - [matterbridge]: Bump
oxfmtto v.0.74.0. - [matterbridge]: Bump
oxlintto v.1.89.0. - [matterbridge]: Bump
oxlint-tsgolintto v.7.0.2005. - [frontend]: Bump
react-routerto v.8.5.0. - [frontend]: Bump
viteto v.8.3.5. - [core]: Bump
multerto v.2.5.0. - [core]: Bump
weriftto v.0.25.2. - [tests]: Remove redundant WebSocket error event casts after updating the Bun types.
- [buntest]: Reach 100% function and line coverage with the line-precise Bun 1.4.4 coverage report (runtimeBun, tracker, mdns, matterbridgePlatform and matterNode), and make the tracker CPU load test deterministic.
Fixed
- [WaterHeater]: Preserve legacy positional constructor arguments; configure tank volume and estimated heat required through
WaterHeaterOptionsonly. - [frontend]: Reset Search Plugins table sorting and column visibility with the other UI preferences.
- [core]:
MatterbridgeColorControlServerclamps a restoredcolorTemperatureMiredsinto the current physical min/max range at initialization, so an endpoint whose range narrowed since the value was stored no longer fails to initialize. Refs matterbridge-hass#257. - [frontend]: Normalize frontend storage keys to lowercase with hyphens and align table preferences with UI reset.
- [frontend]: The search plugins dialog shows the cached plugin list at once and keeps it, with the cached totals, links and versions, when npm requests fail, and backs off when npm blocks the downloads API (a 429 reported by the browser as a network error).
- [core]: Fall back to the uid when
os.userInfo()throws, so Matterbridge starts when run as a uid without a passwd entry (i.e.docker run --user). Closes #666. - [core]: The matter storage backup no longer reports success when the copy fails, and is skipped when there is no matter storage.
- [devcontainer]: Fix the Bun dev container
npmshim: drop the npm-only flags thatbun pruneandbun linkreject since Bun 1.4.4. - [buntest]: Move
wssTest.test.tstopackages/core/buntest, so it resolveswswith the Bun isolated linker. - [thread]: Spawn
npm --versioninstead ofnpm listin the Bun spawn test, which fails on the Bun isolated linker layout. - [scripts]:
downloads.mjs(v.2.1.0) queries an explicit 30-day date range instead of the npmlast-monthperiod, which returns stale data.
Co-authored-by: Codex (GPT-6) noreply@openai.com
Co-authored-by: Claude Opus 5.5 noreply@anthropic.com
Co-authored-by: Gemini 4 Argon antigravity@google.com
Co-authored-by: Ludovic BOUÉ lboue@users.noreply.github.com
Co-Authored-By: Rin Nguyen rinnv.spkt@gmail.com