proxctl
A command-line interface for Proxmox VE -- manage VMs, containers, nodes, storage, and more from your terminal. Includes declarative infrastructure management with apply and export.
Install
# From crates.io
cargo install proxctl
# From PyPI (pre-built binaries, no Rust toolchain needed)
pip install proxctl
# From GitHub Releases (Linux, macOS, Windows)
curl -fsSL https://github.com/rvben/proxctl/releases/latest/download/proxctl-$(uname -m)-unknown-linux-gnu.tar.gz | tar xz
Quick Start
# Interactive setup (creates API token automatically)
proxctl config init
# Check connectivity
proxctl health
# List VMs
proxctl vm list
# Start a VM
proxctl vm start 100
# Show VM configuration
proxctl vm config 100
# List snapshots
proxctl vm snapshot list 100
# Raw API access
proxctl api get /nodes
Declarative Infrastructure (IaC)
Manage Proxmox resources declaratively with YAML manifests, similar to kubectl apply.
Export existing resources
# Export a single VM
proxctl export vm 101 > haos.yaml
# Export all containers
proxctl export container --all > containers.yaml
# Export cluster firewall rules
proxctl export firewall cluster > firewall.yaml
Apply desired state
# infra/web.yaml
kind: vm
name: web-01
vmid: 100
config:
memory: 4096
cores: 2
onboot: true
---
kind: firewall-rule
scope: cluster
config:
action: ACCEPT
type: in
proto: tcp
dport: "443"
comment: "Allow HTTPS"
# Preview changes
proxctl apply -f infra/ --dry-run
# Apply changes
proxctl apply -f infra/
# Round-trip: export, then verify nothing drifted
proxctl export vm --all > current.yaml
proxctl apply -f current.yaml --dry-run # should show "noop" for all
Key behaviors
- Idempotent -- running apply twice produces "up to date" on the second run
- Patch semantics -- only specified config keys are changed, others left untouched
- Name or VMID -- resources can be identified by name (auto-resolves VMID) or pinned by ID
- Multi-document -- multiple resources in one file with
---separators, or a directory of files - Optional power state -- add
state: runningorstate: stoppedto manage power, or omit to leave it alone - Safe -- shows a diff before applying, destructive changes prompt for confirmation
Features
- 145+ commands covering VMs, containers, nodes, storage, backups, cluster, firewall, access control, pools, and Ceph
- Declarative IaC --
applyandexportfor infrastructure-as-code workflows - Auto-detection -- resolves which node a VM lives on automatically
- Agent-friendly --
--jsonoutput,schemacommand for introspection, structured exit codes - Async task handling -- waits for operations to complete with progress spinner
- Safe -- destructive operations require
--yesconfirmation - Raw API escape hatch --
proxctl api get/post/put/deletefor any endpoint - Hidden aliases --
qmforvm,ctforcontainer - Idempotent -- starting an already-running VM succeeds without error
Configuration
Config file
~/.config/proxctl/config.toml
[default]
host = "https://192.168.1.1:8006"
token = "root@pam!proxctl=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
insecure = true
[production]
host = "https://pve.example.com:8006"
token = "admin@pam!proxctl=yyyyyyyy-..."
Environment variables
| Variable | Description |
|---|---|
PROXMOX_HOST |
Proxmox host (e.g. pve.example.com:8006) |
PROXMOX_TOKEN |
API token (user@realm!tokenid=secret) |
PROXMOX_PROFILE |
Config profile name (default: default) |
PROXMOX_NODE |
Default node name |
Precedence
CLI flags > environment variables > config file
Usage Examples
Human output (TTY)
$ proxctl vm list
VMID NAME STATUS NODE CPUS MEMORY
100 k8s-control-1 running pve1 4 8.00 GiB
101 k8s-worker-1 running pve1 8 16.00 GiB
200 dev-sandbox stopped pve2 2 4.00 GiB
JSON output (piped or --json)
$ proxctl vm list --json | jq '.[].name'
"k8s-control-1"
"k8s-worker-1"
"dev-sandbox"
JSON output is automatic when stdout is not a TTY, so piping to jq, grep, or scripts works without flags.
Agent Integration
The schema command outputs a JSON description of all 145+ commands with their arguments, types, defaults, and behavioral metadata:
proxctl schema | jq '.commands | length'
145
This enables AI agents and automation tools to discover available operations, required parameters, and which commands are mutating or destructive -- without parsing help text.
Comparison
| Feature | proxctl | pvesh (built-in) | proxmoxer (Python) |
|---|---|---|---|
| Declarative IaC (apply/export) | Yes | No | No |
| Typed CLI with completions | Yes | No | N/A |
| Cross-platform binaries | Yes | No (PVE only) | pip install |
| VMID auto-resolution | Yes | No | Manual |
| JSON + human output | Auto-detect | JSON only | N/A |
| Agent schema introspection | Yes | No | No |
| Idempotent lifecycle ops | Yes | No | Manual |
License
MIT
Releasing
Vership owns versioning, changelog generation, release commits, and tags. See the release runbook for the verified workflow and recovery policy.
Metadata
Release files for proxctl 0.2.11
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| proxctl-0.2.11.tar.gz | 124.3 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| proxctl-0.2.11-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| proxctl-0.2.11-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| proxctl-0.2.11-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| proxctl-0.2.11-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| proxctl-0.2.11-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 19.2 MB
Release files / proxctl-0.2.11.tar.gz
| Download URL | proxctl-0.2.11.tar.gz |
|---|---|
| Size | 124.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
05b4f47c367a6bb5cdbc70ebfa2e94f7fead295be6aea44bd7e5153492566f94
|
|
BLAKE2b-256 checksum How to use checksums |
8a30eb26e3eb59e2dbf4f86ae6e45a859d46e68bb599eaa39124b8fbdb25b847
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / proxctl-0.2.11-py3-none-win_amd64.whl
| Download URL | proxctl-0.2.11-py3-none-win_amd64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
2a2371400a3b0d97d07556baf462da7ae11ed74ee412611f09b9bf9e920c264e
|
|
BLAKE2b-256 checksum How to use checksums |
42f911714dbaf4061d66274a13867202bfcec2333215aae2a814245c783320fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / proxctl-0.2.11-py3-none-manylinux_2_28_x86_64.whl
| Download URL | proxctl-0.2.11-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
b9b85e71295a92d42e937f2a09d4cb3f575e7a2b65c313e59dba5c826a25a573
|
|
BLAKE2b-256 checksum How to use checksums |
fc8ade8a05124e273a4ad966bac6998b9e0410387eb17e217d953d401c519271
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / proxctl-0.2.11-py3-none-manylinux_2_28_aarch64.whl
| Download URL | proxctl-0.2.11-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 3.7 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
539ab201084a51f7f41a195f7b82008d52bd3907a0cbf48b1ad2de4506be5003
|
|
BLAKE2b-256 checksum How to use checksums |
c8e5cf42d969c27cebdc5e8c69ffff1914ce9308d8ad62e0ba908629e609a608
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / proxctl-0.2.11-py3-none-macosx_11_0_arm64.whl
| Download URL | proxctl-0.2.11-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.7 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
e7f5abd9bc3f7770094b7c9f1909f0548294c9e3fa722fa6f27de57193966312
|
|
BLAKE2b-256 checksum How to use checksums |
ff4337299071cc034163cc453ff61cad7af952cd0f756eaab43a905655eb3509
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / proxctl-0.2.11-py3-none-macosx_10_12_x86_64.whl
| Download URL | proxctl-0.2.11-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.8 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
42a77915bcacb40befa0e30e27cb8f3ccdf7c26e9c5f351fe08d858b42e517bd
|
|
BLAKE2b-256 checksum How to use checksums |
66973baedaf42a08bd16ba809516f69ceae8460d7b280ff919e8e637c0bc96d4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|