A terminal user interface (TUI) for managing OpenStack clouds, built with Go, Bubble Tea, and Gophercloud.
Sidebar — resource navigation with quick reference panel

Limits — quota usage with colored bars

- Full resource browsing — navigate all major OpenStack services from a single interface. Every resource is drill-down navigable with
Enter. - Global search — press
/from the sidebar to search across all services simultaneously. Queries run in parallel against Compute, Network, Storage, and more. - Relationship graph — press
gto visualize connected objects (volumes, ports, networks, floating IPs, load balancers) as an ASCII graph. - Topology view — press
Tfor a flat tree of all resources grouped by network. - Command mode — press
:for instant navigation with Tab autocomplete and inline suggestions. - Shell passthrough — use
:!to run anyopenstackCLI command. Output appears in a scrollable viewport inside the TUI. - Log streaming — press
lon any server for live console logs with pause/resume and adjustable refresh interval. - Token caching — authentication tokens are cached to disk and reused across sessions. No re-auth on every launch.
- Parallel client creation — all service clients are initialized concurrently for fast startup.
- Dynamic layout — sidebar and tables adapt to terminal dimensions automatically.
- Debug mode — verbose output with
--debugflag. - Context-sensitive help — press
?for keybindings relevant to the current view.
| Service | Resources |
|---|---|
| Compute | Servers, Images, Flavors, Keypairs, Hypervisors, Availability Zones, Limits |
| Network | Networks, Subnets, Routers, Ports, Floating IPs, Security Groups, Load Balancers |
| Storage | Volumes, Snapshots |
| Identity | Projects, Users, Token |
| DNS | Zones, Record Sets |
Press g on any resource to see its connected objects as an ASCII graph.
╭──────────────────╮ ╭──────────────────╮ ╭──────────────────╮
│ Vol: /dev/vda │ │ Vol: /dev/vdb │ │ Vol: /dev/vdc │
╰────────┬─────────╯ ╰────────┬─────────╯ ╰────────┬─────────╯
│ │ │
╭────────┴─────────────────────┴──────────────────────┴──╮
│ Server: web-01 Status: ACTIVE │
╰────────────────────────────┬────────────────────────────╯
│
╭──────────┴──────────╮
│ Port │ ── ╭──────────────────╮
│ IP: 192.168.1.10 │ │ Net: prod-net │
╰─────────────────────╯ ╰──────────────────╯
│
╭──────────┴──────────╮
│ FIP: 1.2.3.4 │
╰─────────────────────╯
[g] close [j/k] scroll
Available for: Servers, Networks, Volumes, Floating IPs, Load Balancers.
Press / from the sidebar to open the global search overlay. Type to search — queries run live in parallel across all OpenStack services.
Results are grouped by category (Servers, Networks, Volumes, etc.) and can be opened directly with Enter.
Requirements: Go 1.22+
git clone https://github.com/matteorosi/OS-TUI.git
cd OS-TUI
go run ./cmd/ostui/main.go --cloud mycloudgo build -o ostui ./cmd/ostui/main.go
./ostui --cloud mycloudgo install ./cmd/ostui
ostui --cloud mycloudDownload the latest release for your platform from GitHub Releases.
ostui reads from your existing clouds.yaml. To see which clouds are configured:
cat ~/.config/openstack/clouds.yaml
# clouds:
# mycloud: ← this is your cloud name
# auth:
# auth_url: https://...go run ./cmd/ostui/main.go --cloud mycloud
# With debug output
go run ./cmd/ostui/main.go --cloud mycloud --debug
# Custom clouds.yaml location
OS_CLIENT_CONFIG_FILE=/path/to/clouds.yaml go run ./cmd/ostui/main.go --cloud mycloud| Flag | Description |
|---|---|
--cloud <name> |
Cloud name from clouds.yaml (required) |
--project <name> |
OpenStack project to work with (optional) |
--debug |
Enable verbose debug logging |
| Key | Action |
|---|---|
j / k |
Move down / up |
Enter |
Open detail / drill-down |
Esc |
Go back |
g |
Open relationship graph |
l |
View server logs |
i |
Inspect (raw fields) |
y |
JSON view |
v |
Console URL |
/ |
Global search (from sidebar) or filter list (in resource views) |
: |
Command mode |
? |
Context-sensitive help |
c |
Switch cloud |
T |
Topology view |
q |
Quit |
| Command | Alias | Target |
|---|---|---|
servers |
srv |
Servers |
networks |
net |
Networks |
volumes |
vol |
Volumes |
images |
img |
Images |
limits |
quota |
Quota |
dns |
zones |
DNS Zones |
loadbalancers |
lb |
Load Balancers |
routers |
Routers | |
floatingips |
fip |
Floating IPs |
secgroups |
sg |
Security Groups |
topology |
topo |
Topology view |
search |
Global search | |
quit |
Exit | |
!<cmd> |
Run openstack <cmd> inline |
cmd/ostui/
main.go ← entry point
internal/
cache/ ← in-memory TTL cache
client/ ← OpenStack client interfaces (compute, network, storage, dns, lb…)
config/ ← clouds.yaml loader
ui/
app.go ← root model, state machine
uiconst/ ← shared UI constants (column widths, table heights)
common/ ← reusable components (table, confirm dialog, action menu)
compute/ ← servers, flavors, keypairs, hypervisors, limits, logs, graph
network/ ← networks, subnets, routers, ports, floating IPs, security groups
storage/ ← volumes, snapshots
image/ ← images
identity/ ← projects, users, token
dns/ ← zones, record sets
loadbalancer/ ← load balancers, listeners, pools
graph/ ← generic relationship graph
search/ ← global search across all services
shell/ ← openstack CLI passthrough
topology/ ← topology view
- Bubble Tea — TUI framework
- Lipgloss — terminal styling
- Bubbles — UI components (table, textinput, spinner, list)
- gophercloud — OpenStack SDK
- errgroup — parallel API queries
- Go 1.22
Contributions are welcome! Please follow the project's coding standards:
- Keep functions small and pure where possible.
- Write tests for new functionality.
- Run
go test ./...andgo build ./...before submitting a PR.
Open an issue to discuss major changes before submitting a pull request.
Apache 2.0