TUI Dashboard

11-screen terminal dashboard with keybindings and screen layouts

The unifly tui subcommand launches a real-time terminal dashboard for monitoring your UniFi network. Eleven screens cover everything from live bandwidth charts to WiFi observability.

πŸ”—Launch

unifly tui                   # Launch with default profile
unifly tui -p office         # Use a specific profile
unifly tui -k                # Accept self-signed TLS certs
unifly tui -v                # Verbose logging to temp directory

πŸ”—Screens

Navigate with number keys 1-9, Tab/Shift+Tab, or , for Settings:

KeyScreenWhen to Use
1DashboardAt-a-glance health check. Start here.
2DevicesInvestigating a specific device, checking firmware, restarting
3ClientsFinding a client, checking signal strength, blocking a device
4NetworksReviewing VLANs, editing DHCP settings, checking subnets
5FirewallAuditing policies, reordering rules, checking zone assignments
6TopologyUnderstanding physical network layout, tracing uplink paths
7EventsReal-time troubleshooting, watching for connectivity issues
8StatsHistorical analysis, bandwidth trends, DPI app breakdown
9WiFiAP health, channel overlap, client experience, roaming history
,SettingsSwitching profiles, changing themes, adjusting display options
OnboardingFirst-run setup wizard (shown automatically on first launch)

πŸ”—Dashboard Panels

The dashboard packs eight live panels into a dense, information-rich overview:

PanelWhat It Shows
WAN TrafficArea-fill chart with Braille line overlay, live TX/RX rates, peak tracking
GatewayModel, firmware, WAN IP, IPv6, DNS, ISP name, latency, uptime
ConnectivitySubsystem status dots (WAN/WWW/WLAN/LAN/VPN), aggregate traffic bars
CapacityColor-coded CPU/MEM gauges, load averages, device/client fleet count
NetworksVLANs sorted by ID with IPv6 prefix delegation and SLAAC mode
WiFi / APsClient count and WiFi experience percentage per access point
Top ClientsProportional traffic bars with fractional block characters
Recent EventsCompact event display, color-coded by severity

πŸ”—Key Bindings

πŸ”—Global

KeyAction
1-9, ,Jump to screen
Tab / Shift+TabNext / previous screen
j / k / Up / DownNavigate up / down
g / GJump to top / bottom
Ctrl+d / Ctrl+uPage down / up
EnterSelect / expand detail
EscClose detail / go back
/Search
?Help overlay
Ctrl+rForce reconnect (when disconnected)
qQuit

πŸ”—Screen-Specific

ScreenKeyAction
DevicesRRestart selected device
DevicesLLocate (flash LED)
Devices (detail)h / lPrevious / next detail tab
ClientsTabCycle filter (All / Wireless / Wired / VPN / Guest)
Clientsb / BBlock / unblock client
ClientsxKick client
NetworkseEdit selected network (opens overlay)
Firewallh / lCycle sub-tabs (Policies / Zones / ACL / NAT)
FirewallK / JReorder policy up / down
TopologyArrowsPan canvas
Topology+ / -Zoom in / out
TopologyfFit to view
EventsSpacePause / resume live stream
Statsh d w mPeriod: 1h / 24h / 7d / 30d
StatsrRefresh data
WiFiTabCycle sub-tabs (Overview / Clients / Neighbors / Roaming)
WiFicToggle channel map on the Overview tab
WiFi[ / ]Switch WiFi band in the channel map
WiFiR / LRestart / locate selected access point
WiFib / u / xBlock / unblock / kick selected wireless client

πŸ”—Detail Views

Press Enter on any list item to open a detail panel with comprehensive information:

  • Devices: 5-tab panel (Overview, Performance, Radios, Clients, Ports)
  • Clients: Connection details, traffic history, DHCP info
  • WiFi: AP health decomposition, per-client WiFi metrics, channel occupancy, roam history
  • Networks: Full VLAN config with DHCP ranges and IPv6 settings
  • Firewall: Policy details with traffic filter breakdown

Navigate detail tabs with h/l. Press Esc to close.

πŸ”—Data Refresh

graph LR
API["Integration + Session APIs"] -->|"Every 10s"| DS["DataStore"]
WS["WebSocket"] -->|"Real-time push"| DS
DS -->|"watch channels"| TUI["TUI Screens"]

    style WS fill:#50fa7b,color:#0a0a0f
    style DS fill:#80ffea,color:#0a0a0f
  • Devices and clients: polled every 10 seconds from both APIs
  • Health and system info: polled every 10 seconds
  • Events: pushed via WebSocket in real-time (no polling delay)
  • Bandwidth: sampled from device stats on each refresh cycle

πŸ”—Authentication Modes

The TUI works with all authentication modes, but some screens degrade gracefully:

ModeDashboardDevicesClientsEventsStatsWiFi
API KeyFullFullFullNoFullFull
Username/PasswordFullFullFullFullFullFull
HybridFullFullFullFullFullFull
CloudPartialPartialPartialNoNoNo

Cloud mode’s Devices screen lists device data through the connector but the management actions (R restart, L locate) are unavailable: the connector has no Session client to issue device commands.

API Key mode works for most TUI screens on UniFi OS. Use Hybrid mode only when you need live WebSocket event streaming (the Events screen). Statistics and device data are available via Session HTTP endpoints that API Key mode can reach.

Cloud mode routes Integration API traffic through the Site Manager connector, one console at a time. Session-backed screens (Events, Stats, WiFi observability) need direct controller access and stay empty, and client rows miss their Session enrichment fields.

πŸ”—Graceful Degradation

When data is unavailable (e.g., API-key-only mode without Session access), panels show placeholder lines instead of crashing. The dashboard adapts to whatever data sources are available. Missing data is indicated with dim placeholder text.

πŸ”—Theme

The TUI uses the Opaline theme engine with the SilkCircuit color palette. Press , to open Settings and use the theme selector to preview and switch themes. Theme changes take effect immediately and persist to defaults.theme in your config file. You can also set the initial theme via the UNIFLY_THEME environment variable at launch.

πŸ”—Connection Resilience

When a connection attempt fails or the controller drops mid-session, the TUI reconnects automatically. Retries use exponential backoff starting at 2 seconds and doubling up to a 30-second cap, and they continue indefinitely; the status bar shows the current attempt number while reconnecting. Press Ctrl+r while disconnected to retry immediately instead of waiting out the backoff.

πŸ”—Next Steps