In this article, we'll see how to make an Open Threads Border Router (OTBR) with a 10€ usb dongle from Nordic Semi.
As for myself, I've bought this one from Farnell (I had other stuff to order, so I got free shipping, but I wouldn't recommend Farnell it if you only intend to buy the dongle). You can pretty much just use anything else that has an NRF85240 and the appropriate radio frontend.
All of the instructions assume a Debian Trixie system. Most of this blogpost uses Nordic Semi developer documentation as a reference, feel free to dig into it if you want to know more!
Thread uses the same wireless standard than a ZigBee network, which is 802.15.4 from IEEE. The big difference with ZigBee is that Thread has native IPv6 connectivity, through the use of 6LowPAN.
However, it does not mean you can immediately join your Thread network to another IPv6 network, since its a little bit different from your "bog standard" IPv6 stack. To be able to do this, you will need a "border router" - concept defined in Thread. The border router is a device that joins your Thread network with another IPv6 network, by taking care of the physical wireless communication layer, and the 6LowPAN layer. It can be all-in-one (everything on the same device) or distributed (one device for radio communication processing, and another for 6LowPAN processing and generic IPv6 routing). That's why Thread makes a distinction between:
In this tutorial, we're going to build the Radio Co Processor part, using both the dongle and an open implementation of Thread from Google, named OpenThread. It is assumed you have another device (raspberry pi or small computer) to plug the Radio Co Processor into and install the OpenThread Border Router daemon on. This is how you'll be able to have a fully working OTBR.
As for the dongle, I chose RCP mode, since it is both what is natively supported by Home Assistant and the mode with the most support from Google OSS OTBR. There's a pull request with full NCP support for Google's OTBR, but I wasn't really sure I wanted to risk it, as it is quite new (and god knows Google doesn't test their shit enough). Also I'm not even sure there's an NCP mode for the dongle. Anyways,
To program the little USB dongle into doing what you want, we're going to do some CLI magic. Don't worry, I'll guide you through! I did all that painful trial-and-error so you don't have to :D
For this, we're going to use OpenThread NRF85240 example implementation of an RCP. It's directly from OpenThread and sports tons of niche features only 3 people in R&D know about, but it works, and that's the most important part.
First off, we're going to install the build dependencies. Under Debian Trixie, you can do so with the following commands:
sudo apt-get install binutils-arm-none-eabi gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib
sudo apt-get install g++ lsb-release cmake ninja-build shellcheck libgtest-dev libgmock-dev
Nordic Semi has one unified utility for their device range, which will enable us to program the dongle using DFU mode (the safest and easiest there is! no jumper cables required ^^). You can download the binary straight from their artifact store. It also requires the J-link software from Segger as a dependency - please check the exact version that your download of nrfutil requires, if you download the latest one. You can download J-link directly from Segger website.
As a reference, I have the following versions installed. You can reinstall the exact sames, to save yourself some headaches - as I have not tested this with newer releases.
$ jlink --version && echo && nrfutil --version
21.0.11
nrfutil 8.2.0 (c910332 2026-04-21)
commit-hash: c910332307392c1f6801baadd3cc0265965803a5
commit-date: 2026-04-21
host: x86_64-unknown-linux-gnu
build-timestamp: 2026-04-21T14:10:36.571810011Z
classification: nrf-external
Once you've put the nrfutil utility in your PATH, you'll need to run the following commands to install the necessary components / add-ons from Nordic Semi. Otherwise you won't be able to actually flash the dongle.
nrfutil install nrf5sdk-tools
nrfutil install device
That's it! Let's go to the build part now.
Make a fresh copy of the nrf528xx OpenThread examples repo, with its submodules:
git clone --recursive https://github.com/openthread/ot-nrf528xx.git
And then from this repo, build for nrf52840 (our lil guy), with USB transmission (a.k.a an emulated serial for data exchange), and bootloader serial set to USB (since we're using the dongle version). The build script takes care of everything:
./script/build nrf52840 USB_trans -DOT_BOOTLOADER=USB
Next, we're gonna flash the RCP binary onto the dongle. There are still some steps left, as we'll be using DFU for flashing. Sadly, the build system doesn't directly outputs an image for this mode. But we can make ours from the binary build, with some CLI magic:
arm-none-eabi-objcopy -O ihex build/bin/ot-rcp build/bin/ot-rcp.hex
nrfutil nrf5sdk-tools pkg generate --hw-version 52 --sd-req=0x00 --application build/bin/ot-rcp.hex --application-version 1 build/bin/ot-rcp.zip
You can then flash the firmware using the device subcommand of nrfutil (SERIAL is the MAC address you can obtain when doing nrfutil device list - its 12 hex numbers):
nrfutil device program --traits nordicDfu --serial-number SERIAL --firmware build/bin/ot-rcp.zip
If everything went well, congratulations! You've successfully made yourself a Thread Radio Co Processor (tm). That's it.
In the next part, I'll explain to you how to use your brand spanking new Thread Radio Co Processor (tm) with your HomeAssistant machine.