# scoobler/esp-thread-br-sonoff-donglem architecture

> Architecture diagram of the GitHub repository scoobler/esp-thread-br-sonoff-donglem, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/scoobler/esp-thread-br-sonoff-donglem
- Repository: https://github.com/scoobler/esp-thread-br-sonoff-donglem

## Overview

This repository is firmware for a Sonoff Dongle-M OpenThread Border Router: the ESP32 provides border-router services while the EFR32MG24 remains the Thread RCP. The documented user path is to connect Ethernet or provision Wi-Fi, then manage Thread networks through the web UI, REST API, or console; the device maintains Thread state and exposes topology and Home Assistant integration. The tree also shows web-server, CLI, and OTA/RCP-update components. Several README capabilities have no sampled implementation, so those branches are represented at their enclosing component directory; unsampled runtime wiring is not asserted.

Main entry points: [`components/esp_ot_br_server/src/esp_br_web_api.c`](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_web_api.c) (REST handlers), [`components/esp_ot_br_server/src/esp_br_web.c`](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_web.c) (Web server), [`components/esp_ot_br_server`](https://github.com/scoobler/esp-thread-br-sonoff-donglem/tree/main/components/esp_ot_br_server) (Ethernet uplink), [`components/esp_ot_br_server/src/esp_br_wifi_config.c`](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_wifi_config.c) (Wi-Fi provisioning)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_connectivity["Uplink and recovery"]
  node_ethernet["Ethernet uplink"]
  node_wifi["Wi-Fi provisioning"]
  node_recovery["Failover recovery"]
end

subgraph group_thread["Thread services"]
  node_otbr["Border router"]
  node_dataset["Dataset management<br/>[esp_br_web_api.c]"]
  node_topology["Topology view<br/>[esp_br_web_api.c]"]
  node_nat64["NAT64 services<br/>[esp_ot_dns64.c]"]
end

subgraph group_management["User management"]
  node_webui["Web interface<br/>[api.js]"]
  node_webserver["Web server<br/>[esp_br_web.c]"]
  node_restapi["REST handlers<br/>[esp_br_web_api.c]"]
  node_console["CLI extensions"]
end

subgraph group_updates["Firmware updates"]
  node_ota["HTTP OTA<br/>[esp_br_http_ota.c]"]
  node_rcpupdate["RCP updater<br/>[esp_rcp_update.c]"]
end

node_operator(("Operator"))
node_browser(("Web browser"))
node_ha(("Home Assistant"))

node_operator -->|"connects via"| node_ethernet
node_operator -->|"provisions"| node_wifi
node_ethernet -->|"falls back"| node_recovery
node_wifi -->|"recovers through"| node_recovery
node_browser -->|"uses"| node_webui
node_webserver -->|"serves"| node_webui
node_webserver -->|"provides APIs"| node_restapi
node_operator -->|"uses"| node_console
node_restapi -->|"manages"| node_dataset
node_restapi -->|"reports"| node_topology
node_ha -.->|"integrates with"| node_otbr
node_ota -->|"uses"| node_rcpupdate

click node_ethernet "https://github.com/scoobler/esp-thread-br-sonoff-donglem/tree/main/components/esp_ot_br_server"
click node_wifi "https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_wifi_config.c"
click node_recovery "https://github.com/scoobler/esp-thread-br-sonoff-donglem/tree/main/components/esp_ot_br_server"
click node_otbr "https://github.com/scoobler/esp-thread-br-sonoff-donglem/tree/main/components/esp_ot_br_server"
click node_dataset "https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_web_api.c"
click node_topology "https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_web_api.c"
click node_nat64 "https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_cli_extension/src/esp_ot_dns64.c"
click node_webui "https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/frontend/static/api.js"
click node_webserver "https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_web.c"
click node_restapi "https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_web_api.c"
click node_console "https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_cli_extension/src/esp_ot_cli_extension.c"
click node_ota "https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_br_http_ota/src/esp_br_http_ota.c"
click node_rcpupdate "https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_rcp_update/src/esp_rcp_update.c"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_ethernet,node_wifi,node_recovery,node_browser toneBlue
class node_otbr,node_dataset,node_topology,node_nat64 toneAmber
class node_webui,node_webserver,node_restapi,node_console toneMint
class node_ota,node_rcpupdate toneRose
class node_operator,node_ha toneIndigo
```

## Components

### Uplink and recovery

- [Ethernet uplink](https://github.com/scoobler/esp-thread-br-sonoff-donglem/tree/main/components/esp_ot_br_server): `components/esp_ot_br_server`
- [Wi-Fi provisioning](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_wifi_config.c): `components/esp_ot_br_server/src/esp_br_wifi_config.c`
- [Failover recovery](https://github.com/scoobler/esp-thread-br-sonoff-donglem/tree/main/components/esp_ot_br_server): `components/esp_ot_br_server`

### Thread services

- [Border router](https://github.com/scoobler/esp-thread-br-sonoff-donglem/tree/main/components/esp_ot_br_server): `components/esp_ot_br_server`
- [Dataset management](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_web_api.c): `components/esp_ot_br_server/src/esp_br_web_api.c`
- [Topology view](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_web_api.c): `components/esp_ot_br_server/src/esp_br_web_api.c`
- [NAT64 services](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_cli_extension/src/esp_ot_dns64.c): `components/esp_ot_cli_extension/src/esp_ot_dns64.c`

### User management

- [Web interface](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/frontend/static/api.js): `components/esp_ot_br_server/frontend/static/api.js`
- [Web server](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_web.c): `components/esp_ot_br_server/src/esp_br_web.c`
- [REST handlers](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_br_server/src/esp_br_web_api.c): `components/esp_ot_br_server/src/esp_br_web_api.c`
- [CLI extensions](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_ot_cli_extension/src/esp_ot_cli_extension.c): `components/esp_ot_cli_extension/src/esp_ot_cli_extension.c`

### Firmware updates

- [HTTP OTA](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_br_http_ota/src/esp_br_http_ota.c): `components/esp_br_http_ota/src/esp_br_http_ota.c`
- [RCP updater](https://github.com/scoobler/esp-thread-br-sonoff-donglem/blob/main/components/esp_rcp_update/src/esp_rcp_update.c): `components/esp_rcp_update/src/esp_rcp_update.c`

### Other components

- **Operator**
- **Web browser**
- **Home Assistant**

## Connections

- Operator → Ethernet uplink: connects via (evidence: `README.md`)
- Operator → Wi-Fi provisioning: provisions (evidence: `README.md`)
- Ethernet uplink → Failover recovery: falls back (evidence: `README.md`)
- Wi-Fi provisioning → Failover recovery: recovers through (evidence: `README.md`)
- Web browser → Web interface: uses (evidence: `README.md`)
- Web server → Web interface: serves
- Web server → REST handlers: provides APIs
- Operator → CLI extensions: uses (evidence: `README.md`)
- REST handlers → Dataset management: manages (evidence: `components/esp_ot_br_server/src/esp_br_web_api.c`)
- REST handlers → Topology view: reports (evidence: `components/esp_ot_br_server/src/esp_br_web_api.c`)
- Home Assistant → Border router: integrates with (evidence: `README.md`)
- HTTP OTA → RCP updater: uses (evidence: `components/esp_br_http_ota/src/esp_br_http_ota.c`)
