🇰🇷 한국어 | 🇺🇸 English
A terminal UI (TUI) for OpenStack cloud administration. Built with Rust and ratatui.
Designed for cloud infrastructure operators who manage servers, networks, volumes, and floating IPs across OpenStack environments — directly from the terminal.
- 17 domain modules: Servers, Flavors, Networks, Security Groups, Floating IPs, Volumes, Snapshots, Images, Projects, Users, Aggregates, Compute Services, Hypervisors, Network Agents, Host Operations, Migration, Usage
- Create/Delete forms: Required field validation, confirmation dialogs, Toast notifications
- Hierarchical navigation: Sidebar ↔ List ↔ Detail with consistent arrow key flow
- Volume Attach/Detach: Bidirectional entry (volume → server, server → volume)
- Floating IP Associate/Disassociate: Auto port selection, service disruption warnings
- Force Detach / State Reset: Admin-only with TypeToConfirm safety
- Server Resize / Migration / Evacuate: Host failure recovery workflows
- Risk-based confirmation: Y/N (normal) → TypeToConfirm (risky) → name input (critical)
- Usage Module: btop-style resource dashboard (Infrastructure Summary + Project Usage + Hypervisor Allocation)
- Gauge bars: Color thresholds (Green 0–70% / Yellow 71–90% / Red 91–100%)
- Activity Log: CUD operation history popup (
!key), StatusBar error badge
- RBAC 3-tier: Reader / Member(Operator) / Admin permission model
- CrossTenantGuard: Block CUD in all_tenants mode + break-glass (
Ctrl+T) - TransitionGuard: Disable keys during resource state transitions
- Boot volume protection: Non-admin blocked, admin requires TypeToConfirm
- Audit log:
~/.config/nexttui/audit.logJSON Lines with 10MB rotation
- Theme system: Focus highlight, status icons, rounded borders
- SelectPopup inline search:
/key to filter server/volume lists - ConfirmDialog context: Volume name, size, type, project shown in dialogs
- Resource connectivity: Connected resources shown by name across all views
- Navigation shortcuts:
v(Volumes)n(Networks)s(SG)i(Images) from server detail
- Rust (edition 2024)
- OpenStack environment +
clouds.yaml
# Build
cargo build --release
# Run (requires clouds.yaml)
cargo run -- --cloud mycloud
# Demo mode (no API needed)
cargo run -- --demoPlace clouds.yaml in one of:
$OS_CLIENT_CONFIG_FILEenvironment variable./clouds.yaml(current directory)~/.config/openstack/clouds.yaml/etc/openstack/clouds.yaml
clouds:
mycloud:
auth:
auth_url: https://keystone.example.com/identity/v3
username: admin
password: secret
project_name: admin
user_domain_name: Default
project_domain_name: Default
region_name: RegionOne| Key | Action |
|---|---|
↑↓ / j/k |
Navigate list |
Enter / → |
Detail view / Select |
← / Esc |
Back |
Tab |
Toggle Sidebar ↔ Content focus |
1-9, 0 |
Jump to sidebar module |
c |
Open create form |
D (Shift+D) |
Delete |
r |
Refresh |
! |
Activity Log popup |
q |
Quit |
| Key | Action |
|---|---|
a |
Attach / Associate |
x |
Detach / Disassociate |
F (Shift+F) |
Force Detach (Admin) |
R (Shift+R) |
Force State Reset (Admin) |
| Key | Action |
|---|---|
A (Shift+A) |
Attach Volume |
x |
Detach Volume |
f |
Associate Floating IP |
v / n / s / i |
Navigate to Volumes/Networks/SG/Images |
| Key | Action |
|---|---|
[ / ] |
Cycle period (This Month / Last Month / Last 7 Days) |
j / k |
Scroll |
r |
Refresh |
src/
├── app.rs # App root (FocusPane, InputMode, AuditLogger)
├── registry.rs # ModuleRegistry (auto module registration)
├── component.rs # Component trait
├── worker.rs # Background worker (Action → API → AppEvent)
├── event_loop.rs # tokio::select (key/tick/background events)
├── adapter/ # HTTP adapters (Nova, Neutron, Cinder, Glance, Keystone)
├── port/ # Port traits (API abstraction)
├── module/ # 17 domain modules
│ ├── server/ # ServerModule + ServerViewContext
│ ├── volume/ # VolumeModule (attach/detach)
│ ├── floating_ip/# FloatingIpModule (associate/disassociate)
│ ├── host/ # HostModule (evacuate, composite layout)
│ ├── usage/ # UsageModule (btop-style dashboard)
│ └── ...
├── ui/ # UI widgets
│ ├── select_popup.rs # SelectPopup (inline search)
│ ├── confirm.rs # ConfirmDialog (YesNo / TypeToConfirm)
│ ├── gauge_bar.rs # GaugeBar (btop-style)
│ ├── toast.rs # Toast notifications
│ └── ...
├── models/ # OpenStack API response models
└── infra/ # RBAC, Cache, Config, AuditLogger, CrossTenantGuard
Pattern: Component-Based + TEA hybrid (Action → Worker → AppEvent → State) + Port/Adapter + ViewContext
cargo test # 1108 tests
cargo clippy # lintContributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'feat: add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License — see the LICENSE file for details.




