Fast local VMs for Linux with KVM, QEMU, and cloud-init.
Yeast is a project-based VM tool for Linux. You describe one or more machines in yeast.yaml, pull a trusted base image, run yeast up, and Yeast handles the local QEMU/KVM lifecycle for you.
It is built for people who want:
- real VMs, not containers
- a simpler local workflow than older VM tooling
- cloud-init based guest setup
- repeatable terminal-friendly automation
| Area | What Yeast gives you |
|---|---|
| VM model | Project-local VMs defined in yeast.yaml |
| Base images | Shared cache in ~/.yeast/cache/ |
| Provisioning | Cloud-init |
| Runtime | QEMU + KVM |
| Automation | --json on major commands |
| Networking | user, private, bridge |
| SSH access | Automatic host port forwarding to guest port 22 |
If the repository is reachable over HTTPS:
curl -fsSL https://raw.githubusercontent.com/Twarga/yeast/main/install.sh | bashIf you already cloned the repo:
bash install.shWhat the installer does:
- detects the Linux package manager
- installs Yeast dependencies
- installs Go for the source-build path
- clones and builds Yeast
- installs
yeastinto/usr/local/bin - creates
~/.yeast/cache/ - generates an SSH key if needed
- adds the user to the
kvmgroup when possible
Optional overrides:
YEAST_REPO_URL=https://github.com/Twarga/yeast.git YEAST_REF=main bash install.shImportant:
- if the repo is private, direct install only works for users who already have access
- if the installer adds you to the
kvmgroup, log out and back in before your firstyeast up
git clone https://github.com/Twarga/yeast.git
cd yeast
go build -o yeast ./cmd/yeast
sudo mv yeast /usr/local/bin/Yeast currently supports:
- Linux only
Yeast needs:
- KVM support on the host
qemu-system-x86_64qemu-imggenisoimagessh- an SSH public key in
~/.ssh/id_ed25519.pubor~/.ssh/id_rsa.pub
Typical package installs:
# Ubuntu / Debian
sudo apt install qemu-system-x86 qemu-utils genisoimage
# Fedora / RHEL
sudo dnf install qemu-system-x86 qemu-img genisoimage
# Arch Linux
sudo pacman -S qemu-base cdrtoolsIf needed, add your user to the kvm group:
sudo usermod -aG kvm $USERyeast doctormkdir my-project
cd my-project
yeast initDefault starter config:
version: 1
instances:
- name: web
image: ubuntu-22.04
memory: 1024
cpus: 1
disk_size: 20G
user: yeast
sudo: noneYou can also generate the starter config with your own values:
yeast init \
--name api \
--image ubuntu-24.04 \
--memory 2048 \
--cpus 2 \
--disk-size 25G \
--user operator \
--sudo passwordList supported images:
yeast pull --listPull one:
yeast pull ubuntu-22.04Current built-in trusted images:
ubuntu-22.04ubuntu-24.04
yeast upyeast statusExample output:
NAME STATUS PID IP SSH PORT
web running 12345 127.0.0.1 45678
For scripts:
yeast status --jsonyeast ssh webIf your bootstrap user is different:
yeast ssh web --user operatoryeast downversion: 1
instances:
- name: web
image: ubuntu-22.04
memory: 2048
cpus: 2
disk_size: 25G
user: yeast
sudo: password
env:
APP_ENV: development
LOG_LEVEL: debugSupported fields today:
nameimagememorycpusdisk_sizeusersudoenvuser_data
Important behavior:
user_data, if provided, replaces Yeast's generated cloud-init- custom
user_datadoes not automatically merge your SSH key, user, sudo policy, or env values disk_sizecreates a larger overlay disk on first boot and grows an existing disk when the configured size increases- Yeast does not provide reusable cloud-init templates or presets yet; custom provisioning is raw
user_data
Yeast supports 3 network modes on up and restart:
| Mode | What it does |
|---|---|
user |
Default QEMU user-mode NAT with SSH port forwarding |
private |
User-mode NAT with restrict=on |
bridge |
Host bridge attachment plus a restricted management NIC for SSH |
Examples:
yeast up --network-mode user
yeast up --network-mode private
yeast up --network-mode bridge --bridge br0
yeast restart web --network-mode bridge --bridge br0Current networking limits:
- only SSH port forwarding is built in
- no custom
8080:80style forwards yet - network mode is selected at command time
- network mode is not stored in
yeast.yaml
| Command | What it does |
|---|---|
yeast doctor |
Check whether the host is ready |
yeast init |
Create a starter yeast.yaml |
yeast pull |
List and pull trusted images |
yeast up |
Start all VMs in the current project |
yeast status |
Show tracked VM state |
yeast ssh <name> |
Connect to a running VM |
yeast halt [name...] |
Stop selected tracked VMs |
yeast down |
Stop all tracked VMs |
yeast restart [name...] |
Restart configured VMs |
yeast destroy [name...] |
Stop and remove local instance data |
Most major commands support:
yeast <command> --jsonyeast ssh is interactive and does not support JSON output.
Project directory:
yeast.yaml: desired VM definitionsyeast.state: runtime state for the current project
Home directory:
~/.yeast/cache/: shared base images~/.yeast/instances/<name>/: per-instance runtime files
Each instance directory typically contains:
disk.qcow2seed.isouser-datameta-datavm.log
Yeast is intentionally small right now.
Current non-goals or missing features:
- Linux only
- no GUI
- no global VM inventory command
- no arbitrary port-forward configuration
- no snapshots or suspend/resume
- no per-instance
yeast up <name> - no guest IP discovery in bridge mode
For the full user guide, see docs.md.
Also useful: