One CLI for your
entire homelab.
The hlab CLI drives Terraform and Ansible on Proxmox VE — so you provision, configure, and manage VMs and LXC containers from a single workflow. It orchestrates the tools you already trust. It doesn't replace them.
❯curl -fsSL https://hlab.sh/install.sh | bashRequires Proxmox VE + a scoped API token · Apache-2.0 licensed
Up and running in one command
The installer drops the latest release binary into ~/.local/bin and sets up its runtime tools — Terraform, and Ansible for provisioning. Re-run any time to update.
❯curl -fsSL https://hlab.sh/install.sh | bashThe official installer: drops the latest release binary into ~/.local/bin (verified against SHA256SUMS) and sets up Terraform + Ansible. Re-run to update.
Need a least-privilege Proxmox token first? See the token setup guide. Then run hlab setup once and you're ready.
The same result, without the ceremony
Standing up one guest by hand is a chain of context switches: write config, apply, hunt the IP, SSH in, write an inventory, run the playbook, retry on a lock. hlab folds that into two intentional steps.
- 1Write Terraform for the VM
- 2terraform apply
- 3Wait, find the IP
- 4ssh in, fix cloud-init
- 5Write an Ansible inventory
- 6ansible-playbook …
- 7Package lock? Retry.
- 8Repeat for every guest
Two phases, on purpose: create brings the guest up, provision installs software — and the selection is remembered on the declaration.
Everything you need for day 1 and day 2
A small, sharp surface area — declarative guests, a live dashboard, and the operations you actually reach for after the VM is up.
VMs & LXC from declarations
Describe a guest once in simple, versioned YAML. hlab creates and manages both QEMU VMs and LXC containers from it.
Dashboard TUI
Run hlab with no arguments for a full-screen dashboard: live status, cluster metrics, and every operation in one app.
Discovers your cluster
Reads nodes, templates, storage and bridges through the Proxmox API, then asks only what it can't infer.
Orchestrates Terraform + Ansible
Terraform drives the guest lifecycle, Ansible does provisioning. You never write or maintain either by hand.
Day-2 operations
Snapshots, live migration between nodes, and resize of CPU / RAM / disk — for both VMs and containers.
Adopt existing guests
Bring guests created outside hlab under management by importing them into state — without ever touching the live guest.
Software catalog + dotfiles
Docker, Podman, k3s, language runtimes via mise, and your dotfiles — installed idempotently over SSH.
Themeable
Built-in themes with live switching, plus your own in themes.yaml. The whole TUI restyles without a rebuild.
An orchestration layer, not another platform
hlab sits above the tools you already run. It reads your cluster, generates the config, and drives each tool — you keep Terraform state and Ansible playbooks, minus the glue work.
Commands you'll actually type
Every subcommand takes a name or a numeric ID. Prefer the dashboard? The same two phases drive it.
Configure the connection once, then launch the dashboard.
Two phases by design: lifecycle, then configuration.
LXC works the same way, with full day-2 operations.
The docs are a first-class citizen
Every command, flag, and gotcha is written down — from least-privilege token setup to the two-phase model and LXC specifics. Read before you run.