Alpha software. vmlab is under active development — expect frequent breaking changes.
// declarative VM labs · QEMU/KVM

Orchestrate virtual machine labs from your terminal.

vmlab turns a single vmlab.wcl into a running fleet of VMs — machines, networks, and provisioning, wired automatically. Boot, snapshot, and tear down complex topologies with one command.

$curl -fsSL https://vmlab.io/install.sh | sh
vmlab : win-domain
$ vmlab up labs/win-domain.wcl resolved 2 machines · 1 network booting dc01 ready 1m08s booting client01 ready 52s lab "win-domain" is up · 10.50.0.0/24 $ vmlab console dc01
// capabilities

Everything a lab needs, in one binary.

Declarative labs

Describe machines, networks, and provisioning in one file. vmlab up does the rest.

Powered by QEMU

Runs x86_64, aarch64, and riscv guests — all emulated on an x86_64 host.

Isolated networking

Virtual switches, NAT, DNS, and DHCP are provisioned per lab on private subnets — no manual wiring.

Snapshots

Capture a single VM or the whole lab, then roll back to any snapshot in seconds.

Isolated guest management

Share files and run commands inside guests over the QEMU agent — no network connectivity to the VM required.

OCI registry support

Distribute templates through any OCI container registry like GitHub — or pull defaults from templates.vmlab.io.

UI automation

Drive keyboard, mouse, and OCR-based screen reads over VNC or QEMU sockets — script GUI flows headlessly.

Rich provisioning

Script setup with wscript — handle sysprep, wait for the OS to be ready, then gate the next steps on it.

Linked clone templates

Spin up machines as qcow2 linked clones of a base image — labs share backing files and stay small on the host.

Template creation

Define a template block in your vmlab.wcl and vmlab builds a reusable image — no extra tooling.

// quick start

From a single file to a running lab in one command.

vmlab.wcl
import <vmlab.wcl> lab "alpine-3-23" { segment "lan" { subnet = "10.99.0.0/24" nat = true } vm "myvm" { template = "x86_64/alpine-3.23" nic { segment = "lan" } } }
shell
$ vmlab up
// install

Install vmlab

$curl -fsSL https://vmlab.io/install.sh | sh

Linux, or Windows 11 via WSL 2 or Docker · QEMU/KVM

docker run ghcr.io/vmlabdev/vmlab