kvm-gui: macOS, Linux, and Windows VMs on KVM with a VirtualBox look

Mascote do LinuxPro numa estação de trabalho iniciando VMs Linux, Windows, macOS e Debian num gerenciador no estilo VirtualBox, com o gopher do Go segurando um cubo e o cão caramelo deitado ao lado

People who use Linux on the desktop and want virtual machines usually choose between two options: VirtualBox, which is comfortable but has its own kernel module and performance below KVM, or pure KVM, which is fast but full of command-line tools, libvirt XML, and, on macOS, a repository of scripts and a config.plist hand-edited OpenCore. The kvm-gui is my project to bring the two worlds together: an app with the look and workflow of VirtualBox, running directly on QEMU/KVM, that creates macOS, Linux, and Windows at native speed — everything in a single Go binary that is also a command-line tool and MCP server for AI agents.

For the homelab. macOS is Apple software, and its license only allows you to run it on Apple hardware. Make sure your use complies with the terms of the license. This project has no affiliation with Apple.

What the kvm-gui delivers

  • macOS in just a few clicks — you choose the version and the app downloads the recovery directly from Apple, verifying the signature. OpenCore and OVMF are built in: no need to clone OSX-KVM or edit config.plist
  • Metal on macOS with the Reims vGPU, a paravirtual GPU that uses the host's Vulkan driver — without needing a second graphics card
  • Linux, Windows, and others from an ISO — OS profiles, UEFI with Secure Boot, TPM 2.0 for Windows 11, and displays from HD to 4K
  • 3D and Vulkan on Linux guests on the host GPU of your choice, without passthrough: OpenGL via virgl and Vulkan via Venus
  • The VirtualBox workflow — manager with Details, Display, Snapshots, and Logs tabs, new VM wizard, Settings, snapshots, full clones, and import and export .ova VirtualBox-compatible
  • Native KVM speed, and VMs keep running after you close the app
  • Automatable — everything the GUI does is a command, and AI agents (Claude, Codex, Cursor) control the VMs through the MCP server

Gerenciador do kvm-gui no estilo VirtualBox, com VMs macOS, Ubuntu e Windows 11 e os detalhes de uma VM macOS Sequoia em Reims vGPU

How it works under the hood

kvm-gui is not a frontend for libvirt. The same binary has three entry points — the desktop GUI (Go + Wails), the CLI (kvm-gui vm …) and the MCP server (kvm-gui mcp, via stdio) — and all three go through the same Go core, which validates the configuration, locks the VM folder against concurrent use, stores the VM list in SQLite, and assembles the QEMU arguments. For each VM it starts a QEMU process with KVM, controlled by a private QMP socket; the display reaches the app through a private VNC socket as well, with no network port open. qcow2 disks, UEFI NVRAM, TPM state, and snapshots are kept in a per-VM folder.

Diagrama da arquitetura do kvm-gui: GUI, CLI e servidor MCP sobre o mesmo núcleo, um processo QEMU/KVM por VM e convidados macOS, Linux e Windows

Installation

You need an x86_64 CPU with virtualization (VT-x / AMD-V) enabled in the firmware and QEMU 10.0 or newer — the packages install QEMU for you. Download the package for your distro from latest release and verify the download:

sha256sum -c --ignore-missing SHA256SUMS
sudo apt install ./kvm-gui_*_amd64.deb          # Ubuntu 26.04, Debian 13

On Rocky Linux 10, WebKitGTK comes from EPEL:

sudo dnf install epel-release && sudo dnf install ./kvm-gui-*-1.x86_64.rpm

There are also an AppImage and a plain binary, which depend on GTK 4, WebKitGTK 6, and the distribution's QEMU. On Ubuntu 24.04, stick with v0.15.0, the last release for it.

Your first VM

One-time setup: prepare the host: setup install whatever is missing from QEMU, load the KVM module, add yourself to the group kvm and adjust the necessary kernel parameters, asking for the password only once via pkexec. Then open the app:

kvm-gui setup
kvm-gui

Click New, choose macOS and the version, or Linux / Windows / Other with an ISO. kvm-gui detects the system and suggests CPU, memory, and disk according to your host. Click Start and the screen appears inside the app; a macOS VM boots straight into Recovery, where you install the system.

Assistente Nova VM do kvm-gui, com nome, pasta, ISO, tipo de convidado e versão do macOS

The same steps from the terminal:

kvm-gui vm create Ubuntu --guest linux --profile ubuntu --iso ubuntu-26.04.iso
kvm-gui vm start

Linux and Windows with 3D, Vulkan, and TPM

Windows guests use UEFI with Secure Boot and a 2.0 emulated TPM, swtpm, which meets the requirements for Windows 11. On Linux guests, the 3D acceleration option enables virtio-gpu with virgl (OpenGL), and Vulkan (Venus) brings the guest's Vulkan to the host GPU you choose: the vulkaninfo inside the VM shows your AMD or NVIDIA card, without passthrough. Vulkan was validated on the reference host, Ubuntu 26.04; on Debian 13, there is 3D without Vulkan.

Configurações de tela do kvm-gui com aceleração 3D e Vulkan (Venus) e a escolha da GPU do host

Coming from VirtualBox

If you have VMs on the VirtualBox, use File › Import Appliance… with a .ova, or:

kvm-gui vm import-ova box.ova --dry-run   # mostra o que será criado e o que não é mantido
kvm-gui vm import-ova box.ova

The appliance is treated as untrusted: the manifest, headers, and disks are checked before conversion to qcow2, and a failed import leaves no residue. The path back also exists — kvm-gui vm export-ova generates a .ova that VirtualBox 7 imports. macOS VMs are left out of the OVA and migrate between hosts with kvm-gui vm export --full.

macOS with Metal: Reims vGPU

macOS has no driver for QEMU's emulated video cards, so without acceleration the interface becomes sluggish. kvm-gui integrates the Reims vGPU, a paravirtual GPU that delivers Metal to the guest using the Vulkan driver of the GPU that already renders your desktop. The app installs QEMU from Reims from a ready-made package, with a verified SHA-256:

kvm-gui reims install
kvm-gui reims status

On the reference host, macOS Sequoia 15.8.1 boots on Reims vGPU with Metal enabled. Sonoma is the version validated end to end; the others, from High Sierra to Tahoe, are experimental.

Your VMs in the hands of an AI agent

The same binary is an MCP server. To use it in Claude Code:

claude mcp add kvm-gui -- kvm-gui mcp

Then you can ask, for example, “create an Ubuntu VM from ~/Downloads/ubuntu.iso and start it”. The agent creates, starts, and shuts down VMs, views the screen and types on it, runs commands over SSH, takes snapshots, and imports and exports appliances. Destructive actions, such as forcing a shutdown or running commands on the guest, require explicit confirmation. If you like the topic, the mcp-wp-go follows the same idea for WordPress.

Supported hosts

Host Package Status
Ubuntu 26.04 .deb tested on every CI; reference host (3D and Vulkan validated)
Debian 13 .deb tested on every CI; 3D without Vulkan
Rocky Linux 10 .rpm tested on every CI; macOS VMs require the Reims vGPU, and the distro's QEMU has no 3D
Ubuntu 24.04 — unsupported; use v0.15.0

Under the hood

Backend in Go with Cobra for the CLI, the official Go MCP SDK, and SQLite in pure Go (modernc.org/sqlite); the GUI is Wails with Vue. OpenCore, Lilu, VirtualSMC, WhateverGreen, and OVMF are bundled from the official releases. Everything compiles into a Docker image (make image test dist) and each release is installed and run in clean Ubuntu 26.04, Debian 13, and Rocky Linux 10 containers. BSD-3-Clause license, with credits to OSX-KVM, acidanthera, TianoCore, Dortania, and Reims vGPU.

Try it

If you live between the comfort of VirtualBox and the performance of KVM, kvm-gui is for your home lab: one binary, the VMs you already know, and a bonus AI agent. Install it, create your first VM, and tell me what you thought — stars and issues on GitHub are very welcome. For historical context, also see the history of Proxmox, another project that made KVM user-friendly, and the ova2xva, for migrating VMs from VirtualBox to XCP-ng.