π€ Corral
Herd your VMs into your tailnet.
Corral gives you one command for VMs on your laptop and your Kubernetes cluster. Local QEMU/KVM and cluster KubeVirt share the same five verbs β create, start, ssh, viewer, delete. Every VM lands on your Tailscale tailnet automatically. One static Go binary, no daemons.
corral create web --kubevirt --container-disk quay.io/containerdisks/fedora:42
corral ssh web # from this machine, your laptop, or your phone's terminal
Whyβ
- Same five commands everywhere. Identical whether local QEMU or cluster KubeVirt.
- SSH that just works. Public key injected at create time, auto-picks K8s tunnel or Tailscale port-forward.
- VMs that join the tailnet themselves. Drop a Tailscale auth key and every VM registers with MagicDNS.
- Plugin marketplace. Extensions ship as plugins β
corral plugin install bootc, then build OS disks on-cluster. - Point-and-shoot TUI. Bubble Tea interface: pick a VM, Start/Stop/SSH/VNC/Delete, toggle published ports.
- Proxmox-style web UI. Dark dashboard: datacenterβnodeβVM tree, live status, create wizard, live migration, in-browser VNC + serial consoles.
- One static Go binary. No daemons, no controllers, no client-side K8s SDK. Drives the tools you already trust.
Installβ
git clone https://github.com/tuna-os/corral.git
cd corral
go build -o corral .
Start the web UIβ
./corral web
By default it binds to 127.0.0.1:8006 (Proxmox's port). To reach it from other tailnet devices:
corral web --addr "$(tailscale ip -4):8006"
KubeVirt feature supportβ
Corral exposes Proxmox-style operations through CLI, TUI, and web UI:
- Change CPU/RAM β always works (live hotplug on migratable VMs, stopβpatchβstart otherwise)
- Live migration β needs
vmRolloutStrategy: LiveUpdate, RWX storage, same CPU vendor - Add disk (hotplug) β needs
HotplugVolumesfeature gate - Online disk expansion β needs
allowVolumeExpansion: trueon StorageClass - Snapshots/clone/restore β needs
VolumeSnapshotClassfor persistent disks
Full design document: SPEC.md
Docsβ
- SPEC.md β full specification
- WEBUI-PLAN.md β web UI architecture
- docs/api.md β REST API reference
- docs/architecture.md β design decisions
- docs/kubevirt-proxmox-setup.md β KubeVirt + Longhorn setup guide
- docs/testing.md β testing strategy
Requirementsβ
- Local backend:
qemu-system-x86_64+ KVM, systemd user session - Cluster backend:
kubectlcontext with KubeVirt (+ CDI for ISO import),virtctl; Tailscale operator for published ports tailscaleon the host
Licenseβ
GPL-3.0-or-later.