Skip to content
Published on

Home Assistant Matter Server 9.0 — Why It Dropped the Official C++ SDK for a matter.js Rewrite

Share
Authors

Introduction — An Update That Swapped the Hub's Heart

For anyone running Home Assistant at home, last June 23 was a quietly big day. Alongside the Open Home Foundation's announcement, the Matter Server app (formerly an add-on) jumped to 9.0 — and that wasn't just a version number, it was a swap of the implementation. The server, written in Python and wrapping the official C++ Matter SDK, was replaced by a server built on matter.js, rewritten from scratch in TypeScript.

This isn't someone else's problem — it's a matter of scale. Per the opt-in statistics the announcement cites, the Matter integration runs on 38% of Home Assistant instances, ranking 12th by usage among all integrations. In that 38% of homes, the entire process that talks to Matter devices was replaced with a different codebase. And this migration is one-way — to borrow the official FAQ's own wording, the answer to whether you can go back to the old server is "No."

The broader smart-home ecosystem landscape was already covered in last year's Smart Home & Matter 2026 deep dive, so this post focuses on just this one transition: why it changed, what actually gets better, and what's on the bill.

Background — What Exactly Does the Matter Server Do

Home Assistant's Matter support doesn't live inside the core. The Matter integration (in core) connects over WebSocket to a separate process, the Matter server, and that server does all the actual Matter-controller work — commissioning, session encryption, subscriptions, OTA. Because the monthly core release and the server release are decoupled, this swap shipped as a single app update, separate from the 2026.7 core release (July 1). For reference, the only Matter-related item in the 2026.7 release notes is added soil-moisture sensor support — the real change happened outside core.

Laid out as a diagram, it looks like this.

[Before]  Home Assistant (Matter integration)
          │  WebSocket
        python-matter-server  ── Python wrapper
        Official Matter SDK (C++ · project-chip/connectedhomeip)

[After]  Home Assistant (Matter integration)   ← no code changes
          │  WebSocket (same API)
        matterjs-server + matter.js (single TypeScript stack · Node.js runtime)

The previous server, python-matter-server, was Python layered on top of the official C++ SDK, and in March 2025 it — together with Home Assistant — received CSA certification, a first for an open-source project. Yet the announcement describes that stack as "a solid starting point, but it couldn't keep pace with the speed of our open-source ambitions." That single sentence holds the reason a certified stack got dropped after just 15 months.

matter.js is a project that reimplements the Matter standard from scratch in TypeScript. Its repository has existed since November 2022, right after Matter's official launch, and per the announcement, Homebridge's and openHAB's Matter support both run on this library too. Its creator, Ingo Fischer, joined the Open Home Foundation full-time in the second half of 2025 and donated matter.js to the foundation, which formalized its plan to rebuild the Matter server on top of matter.js in a November 26, 2025 newsletter.

Timeline — From Donation to a One-Way GA

The transition wasn't a surprise — it was a six-month public rollout. Every date below is confirmed from GitHub commit/release history.

DateEvent
2025-11-26OHF announces the matter.js donation and plan to rebuild the server
2026-01-22Add-on 8.2.0 — flipping a beta flag switches to the matter.js server (reversible either way)
2026-06-09matterjs-server 1.0.0
2026-06-17CSA publishes the Matter 1.6 spec
2026-06-23App 9.0.0 GA — matter.js server becomes default, migration is one-way. Same day, the python-matter-server repo is archived
2026-07-01HA core 2026.7 release. Matter 1.6.0 support PR merged into matter.js
2026-07-15App 9.1.0 — ships Matter 1.6.0 support

During the beta period, data migrated automatically and you could still fall back to the Python server — but not since the 9.0.0 GA. That's why the announcement and the FAQ repeatedly recommend backing up before you update: a backup is the only rollback path. If you have a lot of nodes, the first startup (storage migration plus a full interview) can take a while, so the migration FAQ also explicitly advises temporarily disabling the HA watchdog that would otherwise force a restart mid-process.

What Got Better — Restarts, OTA, Commissioning Security

Stripping away the marketing copy and sticking to the concrete changes documented in the FAQ and changelog, here's what changed.

Restarts and reconnects. The old server rediscovered every device from scratch and ran a full interview on every startup. The new server remembers each device's last address and reconnects directly, using a partial interview on reconnect that only pulls changed data. For setups with a lot of Thread devices, the FAQ separately notes that connections respect the Thread network's bandwidth limits — meaning it won't dump a restart storm onto a low-power mesh network.

OTA updates. The old server spun up a separate temporary node on the Matter network for device firmware OTA, and the FAQ itself admits this "frequently caused issues." The new server folds OTA logic directly into the controller.

Commissioning security defaults. The old server would commission even uncertified devices carrying only dev/test certificates by default — convenient for attaching DIY devices, but also a quiet path for a malicious device to join the fabric. The new server flips that: commissioning a test-certificate device now requires explicitly enabling the Test-Net DCL option. A certificate revocation-list check at commissioning time was also added.

Offline commissioning. The server now bundles a release-time snapshot of the DCL data needed for certificate verification, so devices registered as of that snapshot can be commissioned without internet access. It refreshes in the background once connectivity returns. But as the README notes, the bundled data can go stale, and devices released after the snapshot may fail to commission while offline — a reminder, from a local-first standpoint, that control is local but trust verification at commissioning time still wants the internet.

Network visualization. The server's web UI now has a Thread/Wi-Fi topology view. Each node shows its role (leader, router, sleepy end device), and link color indicates connection quality — especially useful on Thread meshes where several hops separate a device from the border router. There's an honest caveat attached too: sleepy battery devices don't refresh network info often, so the FAQ warns upfront that "Unknown devices" or "External routers" shown in the visualization can be stale data.

Beyond that, the changelog keeps accumulating items like the experimental ble_proxy feature that routes commissioning through Home Assistant's Bluetooth stack (including ESPHome BLE proxies), and, added in 9.1.0, device time sync (time_sync) plus experimental ICD (intermittently connected device) management support.

What It Costs — 2x RAM, a One-Way Ticket, a Young Codebase

Now for the bill.

Memory. This is an official figure: the new server uses roughly 2x the RAM of the old one, plus somewhat more CPU (per the migration FAQ — a vendor-stated figure with no disclosed measurement conditions). Not surprising, given the add-on container now bundles an entire Node.js runtime. The release notes also advise checking your host's spare resources before updating — especially if you run the common setup of several add-ons crammed onto a Raspberry Pi-class board.

One-way migration. Worth repeating: after GA there is no official path back to the Python server. A backup is the only exit.

A newborn codebase. GA wasn't entirely smooth either. Within ten days of the 9.0.0 release, the add-on shipped four patches (9.0.1 through 9.0.4), and the 9.0.4 changelog bumped the server from 1.1.2 to 1.1.7 citing "resolved reported issues and substantially optimized RAM/CPU usage." Counting the matterjs-server changelog, there were 14 server releases in the roughly three weeks between GA and July 16. That number could read as fast responsiveness or as still-shaking-out instability — probably both are true. The FAQ's troubleshooting section already documents a procedure for manually clearing the data directory when migration failure corrupts storage, and advice to power-cycle a device that stays offline after first startup (missing mDNS advertisement).

Re-certification, not yet. The 2025 CSA certification belongs to the Python-based server. The matterjs-server README explicitly states the current implementation "has not yet undergone CSA re-certification, and plans to in the future." If certification status matters for your environment, the current server sits in that gap for now.

The Speed of the Spec — Matter 1.5.1, 1.6, and Four Weeks

The real significance of this switch only shows up when you overlay it on the CSA's release calendar for this year.

On March 31, the CSA shipped Matter 1.5.1 — an incremental release layered on top of the camera/doorbell support that 1.5 introduced, adding multi-stream transport (a high-res stream for recording, a low-res stream for mobile, and an analytics stream, all in one session), HEIC snapshots, CMAF-based HLS/DASH upload, and PTZ behavior improvements. On June 17, Matter 1.6 landed. No new device categories this time; instead the core items are NFC-based commissioning that completes the entire commissioning flow with NFC alone (in 1.4.1, NFC tags only carried setup info and still required BLE — the scenario of tapping your phone to register a ceiling light before you even mount it is now in the spec), Joint Fabric, where multiple ecosystems jointly manage a single fabric, and Thermostat Suggestions, which sends a thermostat a time-limited suggestion instead of a direct command.

This is where the new stack's speed shows. Spec release: June 17. matter.js's Matter 1.6.0 support PR merged: July 1. Server 1.2.0 shipping it: July 9. App 9.1.0 delivered to Home Assistant users: July 15. Spec to stable channel in exactly four weeks. When the announcement said back in June that "1.6 is coming soon," that "soon" turned out to be three weeks. That's a pace that was structurally hard to hit while tied to the official C++ SDK's release cycle — and it's a live demonstration of the very sentence that "the official SDK couldn't keep pace with us."

This matters for the standards ecosystem too. When a spec is effectively bound to a single implementation, that implementation's bugs become the standard's de facto behavior. As with TLS or HTTP, having one more independent implementation running at real scale is good for a standard's health — Matter now has, side by side, the C++ implementation used across the commercial ecosystem, and a TypeScript implementation deployed in production on the largest open-source home platform.

When Not to Rush

To sum up, it's reasonable to hold off on hitting the update button if:

  • Your host's memory is tight. Roughly 2x RAM is an official figure. If you're already running several add-ons packed onto a 2GB-class board, do the math first.
  • You have a lot of Matter nodes and downtime hurts. First startup takes a while — migration plus a full interview — and your only rollback is restoring a backup. Not something to do casually on a weeknight.
  • You use DIY devices with dev/test certificates. If you've been attaching self-built Matter firmware (ESP32 and the like), you now need to enable the Test-Net DCL option for commissioning to work. Hit this blind and it looks exactly like a broken device.
  • Certification status is a requirement. If not-yet-CSA-recertified is a problem in your environment, that's reason enough to wait.
  • You'd rather watch it for a few more weeks. A patch pace of 14 releases in three weeks is evidence of active maintenance, but it's also a signal that there may still be gravel left on the road for your particular setup. It's not too late to decide after a pass through the issue tracker.

On the flip side, if you run dozens of Thread devices in a house where every server restart meant several minutes of dead devices as a chronic annoyance — the partial interview and address caching alone make this upgrade worth it.

Closing

The world's largest open-source smart-home platform dropped a certified, official-SDK-based stack after just 15 months and moved to a TypeScript rewrite. The rationale wasn't abstract performance — it was control over pace — and it proved that rationale itself by shipping the latest spec (1.6) to the stable channel just four weeks after GA. The costs are explicit: 2x RAM, a one-way migration, a certification gap, and the early patch rush that comes with a young codebase.

If your Home Assistant is quietly running a handful of Matter devices, you'll probably sail through this transition without even noticing — drop-in compatibility was the goal, and it's mostly working out that way. Just make sure you take a backup before updating. This ticket is one-way.

References