busware

Thread Border Router (THBR) THBR

A complete Thread border router on an ESP32-C6 stick, reached through the chip's own USB port — no radio co-processor in the host. Runs as a Home Assistant add-on or as a plain Docker container.

Version 2026.8.40  runs on: ESP32-C6, ESP32-C5

Thread Border Router (THBR)

The border router runs entirely on an ESP32-C6. It reaches the host through the chip’s native USB port, which the host side turns into a network interface (tap). There is no radio co-processor in the host, no Ethernet chip on the stick, and no Spinel link that stops working when a host process restarts.

Because the border router lives on the stick, the Thread network survives whatever happens on the host: restarting Home Assistant, updating the add-on, recreating the container. The mesh keeps running — only the path to it pauses.

The add-on's page in Home Assistant: state of stick and Thread network, with the mesh graph below

Features

Topology of a larger mesh on the same page: nodes with their RLOC16, line weight = link quality

Requirements

Getting started

Under Settings → Add-ons → Add-on store → ⋮ → Repositories add the repository URL https://github.com/tostmann/THBR, install THBR Thread Border Router, pick the stick under device on the Configuration tab, and start it. The Supervisor pulls a published image, so this takes seconds rather than a build.

Two steps remain in Home Assistant: under System → Network, enable the tap interface in addition to your normal adapter and restart — otherwise the announcements crossing the backbone never reach discovery — and add the Open Thread Border Router integration with the stick’s address. It has to be typed in; that integration carries no mDNS discovery.

Without the Home Assistant Supervisor the same thing runs as an ordinary container: docker pull tostmann/thbr (multi-arch, arm64 and amd64), take the service from addon/compose.yaml and point it at the stick. Firmware and flasher are in the same image — nothing else to install here either.

Limits

Commissioning over the stick’s Bluetooth radio needs a Matter server that accepts a proxy radio — matter.js does with --ble-proxy, the python-matter-server turns the offer away. Everything else works regardless.

The code is under the PolyForm Noncommercial License 1.0.0: free for anything that is not commercial. The components it builds on keep their own licences (OpenThread BSD-3-Clause, the Espressif components Apache-2.0, cJSON MIT, esptool GPL-2.0-or-later).