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 | Provenance | Actions |
|---|---|---|---|---|
| proxctl-0.2.11.tar.gz | 124.3 kB | Without provenance | Details for proxctl-0.2.11.tar.gz |
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| proxctl-0.2.11-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details for proxctl-0.2.11-py3-none-win_amd64.whl |
| proxctl-0.2.11-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details for proxctl-0.2.11-py3-none-manylinux_2_28_x86_64.whl |
| proxctl-0.2.11-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details for proxctl-0.2.11-py3-none-manylinux_2_28_aarch64.whl |
| proxctl-0.2.11-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details for proxctl-0.2.11-py3-none-macosx_11_0_arm64.whl |
| proxctl-0.2.11-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details for proxctl-0.2.11-py3-none-macosx_10_12_x86_64.whl |
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
|
Security for proxctl 0.2.11
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.