Wheelhouse docs

Which page writes which subtree#

Every editor in the web UI stages set and delete operations against one part of the router's configuration tree, and each page says which part in its own header. This table is that mapping, both ways: from a screen to the tree, and from a node you found on the command line to the screen that owns it.

Nothing here is a Wheelhouse-specific schema. These are the router's own configuration paths.

By page#

Nav labelPathSubtree it ownsNotes
Dashboard/Reads only.
Interfaces/interfacesinterfacesEvery interface kind, and their live kernel state beside the configuration.
Static routes/routesprotocols staticThe page title is Routes. It also shows the kernel forwarding table, which nothing writes.
BGP / OSPF/routingprotocolsReads protocols bgp and protocols ospf.
High availability/hahigh-availability, service conntrack-sync, protocols failover, load-balancing wan, policy routeThe header changes with the tab: the VRRP and conntrack tabs own the first two, the uplink tabs the last three.
QoS/qosqos
Firewall/firewallfirewall ipv4 or firewall ipv6The header follows the family tab.
NAT/natnat
IDS/idsservice suricataHidden unless the suricata feature module is enabled.
WireGuard/wireguardinterfaces wireguardHidden unless the wireguard feature module is enabled.
IPsec/ipsecvpn ipsec
OpenVPN/openvpninterfaces openvpn
DHCP/dhcpservice dhcp-server
DNS/dnsservice dnsForwarding, local zones and dynamic DNS.
Apps/appscontainer
/apps/<name>container name <name>One app's detail page.
Companions/daemonsserviceThe page's own title is Daemons. It reports the configuration state of service upnp, service dns and service dhcp-server.
Sessions/sessionsconntrackReads only.
Diagnostics/diagnosticsReads, plus traceroute and lookups, which are commands rather than configuration.
Logs/logssystem syslog
System/systemsystemHost name, resolvers, time zone, NTP, SSH, revisions, power and boot images.
Certificates/certificatespki
Config tree/config/the whole treeThe escape hatch: search any node, render it as commands.
Reconcile/reconcileagent.yamlNot a subtree: the desired-state file in the agent's data directory.
Fleet/fleetfleetNot a subtree either: the routers in --fleet-config. Hidden unless the licence carries the fleet feature.
About/about
Users/usersThe agent's own state, not the router's configuration. Admin only.
API tokens/tokensSame. Admin only.
Agent settings/settingsSame. The page's own title is Settings. Admin only.
Licence/licenseSame. Admin only.
Account/accountYour own password, single sign-on link, second factor and sessions.

/wan is kept as a redirect to /ha; the two used to be separate pages.

By subtree#

NodePage
containerApps
conntrack (operational)Sessions
firewallFirewall
high-availabilityHigh availability
interfacesInterfaces
interfaces openvpnOpenVPN
interfaces wireguardWireGuard
load-balancing wanHigh availability
natNAT
pkiCertificates
policy routeHigh availability
protocolsBGP / OSPF
protocols failoverHigh availability
protocols staticStatic routes
qosQoS
service conntrack-syncHigh availability
service dhcp-serverDHCP
service dnsDNS
service ntpSystem
service sshSystem
service suricataIDS
service upnpCompanions (read-only)
systemSystem
system syslogLogs
vpn ipsecIPsec
anything elseConfig tree

Three pages hide themselves#

PageHidden until
IDSthe suricata feature module is enabled — or service suricata exists in the configuration
WireGuardthe wireguard feature module is enabled — or interfaces wireguard exists
Fleetthe licence carries the fleet feature

The "or" matters: a page is never hidden while the configuration it edits is live on the router. A feature module's catalogue entry declares the config_path that decides it — see Catalogue schema.

Four pages are admin-only and simply absent otherwise: Users, API tokens, Agent settings and Licence.

Everything goes through one door#

No page commits. Every editor stages operations into the working set, and the Commit Bar is the only thing that commits — which is why every change, whatever page it came from, appears as the same set and delete lines before it is applied, and why the audit log records commits rather than clicks.

If a page will not write the node you want, the Config tree page will: it renders any node as commands and stages them the same way.

Re-deriving this table#

bash
grep -rn '<PageHeader' ui/src/pages/*.tsx -A 4 | grep -E 'title=|path='
grep -n 'to:' ui/src/components/nav.ts

See also#

Checked against#

ui/src/components/nav.ts, ui/src/App.tsx, ui/src/pages/Interfaces.tsx, ui/src/pages/Firewall.tsx, ui/src/pages/Ha.tsx, ui/src/pages/Nat.tsx, ui/src/pages/Qos.tsx, ui/src/pages/Dns.tsx, ui/src/pages/Dhcp.tsx, ui/src/pages/Apps.tsx, ui/src/pages/AppDetail.tsx, ui/src/pages/Daemons.tsx, ui/src/pages/ConfigTree.tsx, ui/src/pages/Reconcile.tsx, ui/src/pages/System.tsx, agent/catalog.json, docs/ui.md.

Updated 2026-09-02 ui config-tree mapping