Skip to install
v0.9.0 — public release

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 | bash

Requires Proxmox VE + a scoped API token · Apache-2.0 licensed

hlab — dashboard
·nameidcpu
web200
db201
cache210
build202
proxy211
cluster
pve1online
cpu41%
ram58%
dsk36%
pve2online
cpu23%
ram47%
dsk29%
↑↓ movec createp provisions ssh? help
install

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 | bash

The 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.

show, don't tell

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.

Without hlab
  1. 1Write Terraform for the VM
  2. 2terraform apply
  3. 3Wait, find the IP
  4. 4ssh in, fix cloud-init
  5. 5Write an Ansible inventory
  6. 6ansible-playbook …
  7. 7Package lock? Retry.
  8. 8Repeat for every guest
With hlab
hlab vm create --name web --vmid 200
lifecycle · Terraform
hlab vm provision web --software docker,node
provision · Ansible

Two phases, on purpose: create brings the guest up, provision installs software — and the selection is remembered on the declaration.

capabilities

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.

architecture

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.

hlab
the CLI & dashboard TUI
Terraform
Guest lifecycle
clone · cloud-init · destroy
Ansible
Provisioning
software · dotfiles · idempotent
Proxmox VE
Discovery & power
nodes · storage · snapshots
Your infrastructure
VMs & LXC containers across your Proxmox cluster
in practice

Commands you'll actually type

Every subcommand takes a name or a numeric ID. Prefer the dashboard? The same two phases drive it.

First run
hlab setup
✓ Proxmox reachable · node pve1, pve2
hlab doctor
✓ terraform 1.9 ✓ ansible-core ✓ API token
hlab
launching dashboard…

Configure the connection once, then launch the dashboard.

Create & provision a VM
hlab vm create --name web --vmid 200 --plan KVM2
✓ cloned template → web (200) on pve1
✓ 192.168.1.200 · cloud-init done
hlab vm provision web --software docker,node
✓ docker · node (mise) installed
hlab vm ssh web

Two phases by design: lifecycle, then configuration.

Containers & day-2 ops
hlab ct create --name cache --vmid 210 --plan small
✓ container cache (210) up · 192.168.1.210
hlab vm snapshot web pre-upgrade
✓ snapshot pre-upgrade created
hlab vm migrate web --to pve2
→ live-migrating web to pve2…

LXC works the same way, with full day-2 operations.

documentation

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.