# monkfish-iot/wrthub-ui architecture

> Architecture diagram of the GitHub repository monkfish-iot/wrthub-ui, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/monkfish-iot/wrthub-ui
- Repository: https://github.com/monkfish-iot/wrthub-ui

## Overview

WrtHub-UI is a web console for managing OpenWrt devices, including device details, wireless status and configuration, user access, and audit history. The main workflow is browser request → authenticated and permission-checked Gin routes → device discovery or device RPC → rendered response; wireless calls use UBUS and reuse LuCI authentication tokens. Local accounts, RBAC, and audit records provide the internal access-control layer. The README provides screenshots but little architectural documentation; links for unsampled handlers and integrations are limited to relationships visible in the supplied excerpts.

Main entry points: [`internal/server/router.go`](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/router.go) (Route registry), [`internal/server/app.go`](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/app.go) (App assembly), [`internal/lucirpc/client.go`](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/lucirpc/client.go) (LuCI RPC client), [`internal/ubusrpc/client.go`](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/ubusrpc/client.go) (UBUS RPC client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_entry["HTTP startup<br/>[main.go]"]
  node_routes["Route registry<br/>[router.go]"]
  node_login["Login handlers<br/>[auth_handlers.go]"]
  node_device_list["Device listing<br/>[devices.go]"]
  node_device_detail["Device details<br/>[devices_detail.go]"]
  node_device_config["Device configuration<br/>[devices_config.go]"]
  node_wireless_ui["Wireless views<br/>[wireless.go]"]
  node_users_ui["User endpoint<br/>[users.go]"]
  node_audit_ui["Audit views<br/>[audit.go]"]
  node_app["App assembly<br/>[app.go]"]
end

subgraph group_access["Access and persistence"]
  node_auth["Sessions and auth<br/>[auth.go]"]
  node_rbac["Permission checks<br/>[rbac.go]"]
  node_store[("Local data store<br/>[store.go]")]
end

subgraph group_device["Device integration"]
  node_frps["Device discovery API<br/>[client.go]"]
  node_credentials["Device credentials<br/>[credential.go]"]
  node_luci["LuCI RPC client<br/>[client.go]"]
  node_ubus["UBUS RPC client<br/>[client.go]"]
  node_wireless_service["Wireless operations<br/>[wireless.go]"]
end

subgraph group_presentation["Presentation"]
  node_renderer["Template renderer<br/>[render.go]"]
  node_templates["HTML templates"]
end

node_operator(("Operator"))
node_openwrt{{"OpenWrt device"}}
node_frps_service{{"frps helper"}}

node_operator -->|"sends requests"| node_entry
node_entry -->|"assembles app"| node_app
node_entry -->|"mounts routes"| node_routes
node_routes -->|"registers auth"| node_login
node_routes -->|"routes devices"| node_device_list
node_routes -->|"routes details"| node_device_detail
node_routes -->|"routes config"| node_device_config
node_routes -->|"routes wireless"| node_wireless_ui
node_routes -->|"routes users"| node_users_ui
node_routes -->|"routes audit"| node_audit_ui
node_routes -->|"checks sessions"| node_auth
node_login -->|"authenticates users"| node_auth
node_login -->|"records audit"| node_store
node_app -->|"opens database"| node_store
node_app -->|"creates authenticator"| node_auth
node_app -->|"constructs client"| node_frps
node_app -->|"creates provider"| node_credentials
node_app -->|"constructs client"| node_luci
node_app -->|"constructs client"| node_ubus
node_app -->|"creates service"| node_wireless_service
node_app -->|"creates renderer"| node_renderer
node_credentials -.->|"retrieves credentials"| node_frps
node_luci -->|"requests credentials"| node_credentials
node_luci -->|"authenticates and calls"| node_openwrt
node_ubus -->|"reuses token"| node_luci
node_ubus -->|"calls UBUS"| node_openwrt
node_wireless_service -->|"queries wireless"| node_ubus
node_renderer -.->|"renders pages"| node_templates

click node_entry "https://github.com/monkfish-iot/wrthub-ui/blob/main/cmd/wrthub-ui/main.go"
click node_routes "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/router.go"
click node_login "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/auth_handlers.go"
click node_device_list "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/devices.go"
click node_device_detail "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/devices_detail.go"
click node_device_config "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/devices_config.go"
click node_wireless_ui "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/wireless.go"
click node_users_ui "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/users.go"
click node_audit_ui "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/audit.go"
click node_app "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/app.go"
click node_auth "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/auth/auth.go"
click node_rbac "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/auth/rbac.go"
click node_store "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/store/store.go"
click node_frps "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/frpsclient/client.go"
click node_credentials "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/service/credential.go"
click node_luci "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/lucirpc/client.go"
click node_ubus "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/ubusrpc/client.go"
click node_wireless_service "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/service/wireless.go"
click node_renderer "https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/render/render.go"
click node_templates "https://github.com/monkfish-iot/wrthub-ui/tree/main/templates"

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_entry,node_routes,node_login,node_device_list,node_device_detail,node_device_config,node_wireless_ui,node_users_ui,node_audit_ui,node_app toneBlue
class node_auth,node_rbac,node_store toneAmber
class node_frps,node_credentials,node_luci,node_ubus,node_wireless_service toneMint
class node_renderer,node_templates toneRose
class node_operator,node_openwrt,node_frps_service toneIndigo
```

## Components

### Web application

- [HTTP startup](https://github.com/monkfish-iot/wrthub-ui/blob/main/cmd/wrthub-ui/main.go): `cmd/wrthub-ui/main.go`
- [Route registry](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/router.go): `internal/server/router.go`
- [Login handlers](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/auth_handlers.go): `internal/server/auth_handlers.go`
- [Device listing](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/devices.go): `internal/server/devices.go`
- [Device details](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/devices_detail.go): `internal/server/devices_detail.go`
- [Device configuration](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/devices_config.go): `internal/server/devices_config.go`
- [Wireless views](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/wireless.go): `internal/server/wireless.go`
- [User endpoint](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/users.go): `internal/server/users.go`
- [Audit views](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/audit.go): `internal/server/audit.go`
- [App assembly](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/server/app.go): `internal/server/app.go`

### Access and persistence

- [Sessions and auth](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/auth/auth.go): `internal/auth/auth.go`
- [Permission checks](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/auth/rbac.go): `internal/auth/rbac.go`
- [Local data store](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/store/store.go): `internal/store/store.go`

### Device integration

- [Device discovery API](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/frpsclient/client.go): `internal/frpsclient/client.go`
- [Device credentials](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/service/credential.go): `internal/service/credential.go`
- [LuCI RPC client](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/lucirpc/client.go): `internal/lucirpc/client.go`
- [UBUS RPC client](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/ubusrpc/client.go): `internal/ubusrpc/client.go`
- [Wireless operations](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/service/wireless.go): `internal/service/wireless.go`

### Presentation

- [Template renderer](https://github.com/monkfish-iot/wrthub-ui/blob/main/internal/render/render.go): `internal/render/render.go`
- [HTML templates](https://github.com/monkfish-iot/wrthub-ui/tree/main/templates): `templates`

### Other components

- **Operator**
- **OpenWrt device**
- **frps helper**

## Connections

- Operator → HTTP startup: sends requests (evidence: `cmd/wrthub-ui/main.go`)
- HTTP startup → App assembly: assembles app (evidence: `cmd/wrthub-ui/main.go`)
- HTTP startup → Route registry: mounts routes (evidence: `cmd/wrthub-ui/main.go`)
- Route registry → Login handlers: registers auth (evidence: `internal/server/router.go`)
- Route registry → Device listing: routes devices (evidence: `internal/server/router.go`)
- Route registry → Device details: routes details (evidence: `internal/server/router.go`)
- Route registry → Device configuration: routes config (evidence: `internal/server/router.go`)
- Route registry → Wireless views: routes wireless (evidence: `internal/server/router.go`)
- Route registry → User endpoint: routes users (evidence: `internal/server/router.go`)
- Route registry → Audit views: routes audit (evidence: `internal/server/router.go`)
- Route registry → Sessions and auth: checks sessions (evidence: `internal/server/router.go`)
- Login handlers → Sessions and auth: authenticates users (evidence: `internal/server/auth_handlers.go`)
- Login handlers → Local data store: records audit (evidence: `internal/server/auth_handlers.go`)
- App assembly → Local data store: opens database (evidence: `internal/server/app.go`)
- App assembly → Sessions and auth: creates authenticator (evidence: `internal/server/app.go`)
- App assembly → Device discovery API: constructs client (evidence: `internal/server/app.go`)
- App assembly → Device credentials: creates provider (evidence: `internal/server/app.go`)
- App assembly → LuCI RPC client: constructs client (evidence: `internal/server/app.go`)
- App assembly → UBUS RPC client: constructs client (evidence: `internal/server/app.go`)
- App assembly → Wireless operations: creates service (evidence: `internal/server/app.go`)
- App assembly → Template renderer: creates renderer (evidence: `internal/server/app.go`)
- Device credentials → Device discovery API: retrieves credentials
- LuCI RPC client → Device credentials: requests credentials (evidence: `internal/lucirpc/client.go`)
- LuCI RPC client → OpenWrt device: authenticates and calls (evidence: `internal/lucirpc/client.go`)
- UBUS RPC client → LuCI RPC client: reuses token (evidence: `internal/ubusrpc/client.go`)
- UBUS RPC client → OpenWrt device: calls UBUS (evidence: `internal/ubusrpc/client.go`)
- Wireless operations → UBUS RPC client: queries wireless (evidence: `internal/service/wireless.go`)
- Template renderer → HTML templates: renders pages
