Open-source project
openthread/ot-br-posix avatar
openthread/ot-br-posix

OpenThread Border Router: joining a Thread mesh to Wi-Fi and Ethernet

OpenThread Border Router, a Thread border router for POSIX-based platforms.

577 stars294 forksC++BSD-3-Clause

At a glance

What is it?
OpenThread Border Router is a POSIX implementation of the Thread border router role, providing IP routing between a Thread mesh and external networks along with mDNS and SRP service discovery, DHCPv6 prefix delegation, NAT64 and external commissioning. It suits a developer building a Thread gateway on Linux, and it is released monthly under a BSD 3-Clause licence.
Who is it for?
OpenThread Border Router fits a developer who needs a Thread gateway on a POSIX platform, whether for a Raspberry Pi bring-up or for embedding in a product, and it does not fit a developer who only needs the Thread stack itself, since the mesh implementation lives in the separate openthread/openthread repository.
Can I use it commercially?
Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 24, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What the border router role actually does

A Thread Border Router connects a Thread network to other IP-based networks, such as Wi-Fi or Ethernet. That one sentence covers the hardware role, but the interesting part is the list of functions it has to support to be a compliant implementation rather than a simple bridge.

End-to-end IP connectivity via routing between Thread devices and other external IP networks is the first. A Thread border router does not bridge at layer two and does not put the mesh on the same broadcast domain as your LAN. It routes, which is why the IPv6 addressing story matters: the Thread network has its own IPv6 prefix space and the border router is what makes addresses on it reachable from outside.

Bidirectional DNS-based service discovery is the second. On a Wi-Fi or Ethernet link that is mDNS, and on the Thread network it is SRP, the DNS-based service registration protocol Thread uses instead. The border router translates between the two so a service advertised on one side is discoverable on the other. This is the feature that lets a phone on Wi-Fi find a sensor on the mesh by name without any configuration.

DHCPv6 Prefix Delegation is the third, and it is the part that makes the routing work. The border router obtains IPv6 prefixes for the Thread network from an upstream router, so the mesh is addressed with prefixes your network actually owns rather than with addresses invented inside the mesh.

NAT64 for connecting to IPv4 networks is the fourth, and it exists because Thread is IPv6-only. Without NAT64, a Thread device talking to an IPv4-only server has no path. The last function is External Thread Commissioning, for example a mobile phone, authenticating and joining a Thread device to a Thread network, which is what lets a device be brought into the mesh from outside it.

OpenThread's implementation of a Border Router is called OpenThread Border Router, OTBR for short, and it is the subject of this repository.

The POSIX build, and what the repository layout says about it

The repository description calls this a Thread border router for POSIX-based platforms, and that qualifier is the whole scope of the project.

The primary language is C++, and the build is CMake-driven, with a CMakeLists.txt at the top level. The layout is that of a native project with an in-tree dependency model: src/ holds the implementation, include/ the headers, tests/ the test suite, and third_party/ the vendored dependencies, with .gitmodules present to manage them. There are also script/ and tools/ directories, examples/ with a platforms/ subdirectory, doc/ for documentation, and etc/ for auxiliary configuration.

A few entries reveal how the project is policed. .clang-format at the top level means the C++ formatting is machine-enforced rather than left to review, and there is a separate STYLE_GUIDE.md referenced from the readme alongside a CODE_OF_CONDUCT.md. A SECURITY.md exists, which is the file to read before reporting a vulnerability. .codecov.yml is present for coverage reporting, and a .prettierrc covers the non-C++ files in the repository, typically the Markdown and JSON.

The AGENTS.md at the top level and the AUTHORS file are worth noting as conventions rather than technical details: AGENTS.md is the kind of file that instructs automated coding assistants how to work in the tree, and its presence alongside CONTRIBUTING.md tells you the project expects both human and tool-driven contributions.

The licence is BSD 3-Clause, with the LICENSE file referenced from the readme and a NOTICE file at the top level alongside it. The BSD 3-Clause licence is permissive, with a requirement to retain the copyright notice and disclaimer in redistributions, and for a product that vendors this code that is the only obligation it creates. The readme adds a trademark condition: only use the OpenThread name and marks when accurately referencing the software distribution, and do not use the marks in a way that suggests endorsement by or affiliation with Nest, Google or The Thread Group. Thread itself is a registered trademark of the Thread Group, which matters if you name the protocol in your own product.

Getting started, which is a Raspberry Pi guide rather than a build manual

The getting started section is short, and what it points to is not a build instruction. The quickest way to set up a Thread-compliant Border Router is to follow the Raspberry Pi Setup guide, and the readme also notes that for users in China, end-user documentation is available at a separate site.

The homepage for the project is given as follows.

bash
The quickest way to set up a Thread-compliant Border Router is to follow the [Raspberry Pi Setup guide](https://openthread.io/guides/border-router/prepare).

That is a deliberate choice. A Thread border router is a certification-sensitive piece of equipment, and the documented path is a known-good one rather than an open-ended build matrix. The Raspberry Pi guide walks a specific platform from image to working mesh, which removes a large class of variables that would otherwise have to be debugged individually: radio firmware, the border routing daemon, network interface configuration, and IPv6 firewall handling.

What the readme does not offer is a per-platform build recipe. For anyone embedding OTBR on a custom Linux board, the build system is CMake and the third_party/ directory holds the vendored pieces, but the assembly instructions live outside this document, and the readme points to the OpenThread repository for the OpenThread stack itself.

That distinction is worth keeping straight. OpenThread Border Router is the border routing half. The mesh implementation itself, the radio driver, the Network and Management interfaces, the Thread stack that runs on each device, lives in the separate openthread/openthread repository, which the readme links as the place to learn more about OpenThread. OTBR consumes that stack.

For support, the readme splits the channels by subject. Bugs and feature requests about the border router go to the openthread/ot-br-posix issue tracker, bugs and feature requests about OpenThread itself go to the openthread/openthread issue tracker, and general discussion happens in the openthread/openthread discussions area.

Monthly releases, and what the version numbers tell you

The release history is unusual enough to be worth stating plainly, because it means the versioning scheme carries calendar information.

The recent releases are v2026.10.0 on 2026-10-01, v2026.09.0 on 2026-09-01 and v2026.08.0 on 2026-08-03. The version number is a date. OpenThread Border Router ships a release per month, named for the year and month it belongs to, and the three entries span three consecutive months.

That scheme has a practical consequence for anyone integrating the software. There is no semantic versioning to reason about, so there is no minor version with added features and a patch version with fixes. Instead, upgrading means taking a newer month, and the release notes for that month are the only description of what changed. Pinning is done by tag, and a rolling tag would pull in a month's worth of upstream work at whatever rate you rebuild.

The project also states a maintenance position that matters for a certification-sensitive product. The last push was on 2026-10-20, and the version 2026.10.0 release was on 2026-10-01, so the tree is actively moving between releases rather than sitting still.

The repository topics describe the domain: border-router, internet-of-things, iot-gateway, ipv6, openthread, thread-protocol, plus google and nest, and hacktoberfest is also listed, which means the project participates in the October contribution event and takes outside contributions. The contributing guidance asks people to abide by a Code of Conduct and by the project's Coding Conventions and Style Guide.

The DeepWiki badge at the top of the readme points to a community-generated documentation site for this repository, which is a reasonable place to start if the readme itself is thin on internals.

The limits of a POSIX-only border router, and what the alternatives are

Two boundaries are clear from the repository itself.

The first is platform. This is the POSIX implementation, and the readme's own framing of the ecosystem points at other platforms being separate repositories under the same organisation. The consequence for a product team is that choosing a Thread gateway platform is choosing a code line. A device that needs a Windows or MCU-hosted border router is not taking this tree, and the upstream OpenThread stack would be embedded differently there. The POSIX build also inherits POSIX assumptions: Linux network namespaces, a filesystem, the system's IPv6 stack, and the host's firewall handling of the IPv6 packets the border router emits.

The second is scope of responsibility. OTBR is the border router role, not the whole system. It does not provide the Thread radio driver, the commissioning UI, the Thread stack on the end devices, or the Thread certification itself. A team building a certified product assembles several pieces, and this repository is one of them.

The real alternative is not another border router implementation but a different architecture. A dual-radio device, one radio on the mesh and one on the LAN, does the same job with two chips instead of one, and it avoids the IPv6 routing and firewall complexity entirely because the two networks are physically separate. That approach costs hardware, power and board area, and it is the reason the single-radio border router exists at all: the Thread design puts the border routing function on the same radio as the mesh, which saves a chip and turns the border router into the routing hub rather than a gateway between two radios.

A second alternative is to not expose Thread to IP at all and use a gateway-only device for each protocol, which trades the elegance of a single IP fabric for simpler per-protocol handling. For an installation where the Thread devices are a handful of sensors and the network has no other IP clients, that can be the more practical answer.

For a developer who wants a compliant Thread fabric on a Linux device, OTBR with the Raspberry Pi guide is the documented path, and the monthly release train is the thing to plan around.

Editorial conclusion

OpenThread Border Router fits a developer who needs a Thread gateway on a POSIX platform, whether for a Raspberry Pi bring-up or for embedding in a product, and it does not fit a developer who only needs the Thread stack itself, since the mesh implementation lives in the separate openthread/openthread repository. Before building on it, read the Raspberry Pi Setup guide referenced in the readme as the fastest compliant path, and note that this project only exists in the POSIX flavour, with other platforms built from other repositories in the same organisation.

Frequently asked questions

What is the OpenThread Border Router and what functions does it support?

It connects a Thread network to other IP-based networks such as Wi-Fi or Ethernet, and supports end-to-end IP connectivity via routing, bidirectional DNS-based service discovery via mDNS and SRP, DHCPv6 Prefix Delegation, NAT64 for IPv4 networks, and external Thread Commissioning.

How do I set up a Thread-compliant border router?

The quickest way is to follow the Raspberry Pi Setup guide linked from the readme, which walks a known-good platform from setup to a working mesh. For users in China, end-user documentation is available at openthread.google.cn.

How often does OpenThread Border Router release new versions?

The version numbers are dates and the project ships monthly, with releases named v2026.10.0, v2026.09.0 and v2026.08.0 for October, September and August 2026. The last push was on 2026-10-20.

What licence is OpenThread Border Router released under?

It is released under the BSD 3-Clause license, with the terms in the LICENSE file at the top of the repository and a NOTICE file alongside it. The readme also asks that the OpenThread name and marks only be used to accurately reference the software, and not in a way suggesting endorsement by Nest, Google or The Thread Group.

Where is the Thread stack itself, as opposed to the border router?

The border router implementation is this repository, while the OpenThread stack is developed in the separate openthread/openthread repository, which the readme links as the place to learn more about OpenThread. Bugs about each are filed against their own issue trackers.

Official sources

  1. License: BSD-3-Clause
  2. openthread/ot-br-posix on GitHub
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/openthread-ot-br-posix.svg)](https://hysenlabs.com/projects/openthread-ot-br-posix)

Was this useful?