Skip to content

Terminal cockpit for Proxmox VE & PBS.

A Rust TUI and CLI that talks to real Proxmox clusters. REST against PVE and PBS, SSH for the rest. No agent on the cluster.

proxxx describe — one command prints the whole cluster (nodes, guests, storages) for a live 3-node Proxmox VE 9.1 cluster
● main · gate greenv0.13.1full mutation lifecycle · LXC + cluster + QEMU + QGA0 system deps · rustls onlyMIT

By the numbers ​

SurfaceToday
Source~72 KLOC Rust · ~17 KLOC tests · 745 lib tests + 478 integration tests (error-handling + resilience-chaos sweeps)
Quality gate8 stages · ~340–480 s wall time (live cluster path)
Live cluster coverage67 read probes + 34 mutation probes per gate run
Property testing~25 proptest properties × 256 random cases = ~6 400 invariant checks per cargo test
Mutation lifecycleLXC create→start→snapshot→stop→delete · cluster-level CRUD across 8 of the 10 state families (pools / ACL / storage-defs / backup-jobs / firewall-cluster / notifications / HA rules / HA resources) · QEMU 9998 from alpine ISO · opt-in QGA round-trips
Binary6–9 MB stripped depending on target · single static · no installer
Supply chaincargo audit --deny warnings + cargo deny check per push + nightly cron + CodeQL Rust SAST
System dependencies0 — rustls only, no native-tls, no openssl (banned in deny.toml)
MCP surface25-tool registry · stdio + HTTP · compile-time fixed · server-sent notifications/cluster-event over both transports
Exit code contract9 stable codes (0–8) — see exit-codes

A taste ​

bash
# Read the cluster
proxxx ls nodes
proxxx ls guests --format json | jq '.[] | select(.status == "running")'
proxxx ha preview --node pve1
proxxx hw conflicts --node pve1
proxxx perms root@pam --node pve1

# Operate it (with consent)
proxxx start 100 101 102
proxxx delete 100 --yes
proxxx migrate 100 pve2 --yes
proxxx snapshot create 100 --name pre-upgrade
proxxx snapshot rollback 100 --name pre-upgrade --yes
proxxx disk move 100 --disk scsi0 --storage ceph-rbd --yes
proxxx patch apply --reboot=auto --dry-run

# Hand off to a graphical client
proxxx ssh    100                       # interactive SSH into the guest (system ssh)
proxxx serial 100 --node pve1           # raw termproxy WebSocket
proxxx spice  100 --node pve1           # writes .vv (0600), launches remote-viewer
proxxx novnc  100 --node pve1           # opens browser to web UI's noVNC

# GitOps loop over 10 state families
# (pools / ACL / storage / backup-jobs / firewall-cluster / notifications / ha-rules / ha-resources / mappings-pci / mappings-usb)
proxxx state export > cluster.toml      # byte-stable TOML snapshot
proxxx state diff cluster.toml          # exit 2 if drift (CI-gateable)
proxxx state apply cluster.toml --dry-run
proxxx state apply cluster.toml --prune --interactive

# Incident lockdown (writes refused with exit 8 until thaw)
proxxx incident freeze --ttl 1h --reason "ceph osd flapping"
proxxx incident status
proxxx incident thaw

# Cross-cluster fanout (read-only)
proxxx ls guests --all-profiles --format json
proxxx find 100                          # which profile owns this vmid
proxxx describe --output llm-context     # paste at the top of an LLM chat

# Observability + chargeback
proxxx logs tail --service pveproxy --since "1h ago" --grep error
proxxx upgrade-check --target 9.x        # exit 1 on any block-severity finding
proxxx accounting --group-by pool --timeframe month
proxxx heatmap                           # per-node API RTT
proxxx anomaly                           # z-score outliers
proxxx backup-verify --max-age-days 7

# Drive it from an LLM
proxxx mcp serve                        # stdio JSON-RPC + cluster-event notifications
proxxx mcp serve-http --bind 127.0.0.1:8765   # HTTP/SSE + cluster-event notifications
proxxx mcp tools --checksum             # registry hash for audit

# Long-running daemon (alerts + HITL + scheduler under one SIGTERM)
proxxx daemon serve

What it is not ​

proxxx does not replace the Proxmox web UI. It is built for the workflows where the web UI is slow, repetitive, or unreachable from a terminal-only context. It does not render graphical SPICE or VNC frames — those hand off to remote-viewer and the system browser. It is not a Perl rewrite — when ground truth lives in pveum, proxxx shells out, parses, and stays out of the way.

Where to start ​

Released under the MIT License. · Privacy & legal