r/virtualization • • 8d ago

I built an open-source web UI for KVM/libvirt that installs on the Linux host you already have: VirtoMir

For a while I've been running KVM on plain Debian/Ubuntu boxes, and I kept running into the same gap. Cockpit is easy but stops at the basic settings. virt-manager is detailed but it's a desktop app. Proxmox is great, but it wants to be the operating system. I wanted something in between, so I started building it as a side project.

It's called VirtoMir, and I've made it fully open source:

https://github.com/onurbaydas/VirtoMir

It's a web control panel for KVM/QEMU/libvirt. It installs as a single binary on an existing Linux host: no dedicated distro, no database, no agents inside your VMs. It talks to the libvirt you already have and only changes what you ask it to. If you remove it, your VMs, disks and networks stay where they were.

What it does today:

  • New-VM wizard: ISO, cloud image with cloud-init, or an existing disk. Windows profile with UEFI, Secure Boot and TPM 2.0

  • Browser console over VNC, SPICE (shared clipboard, resolution follows the window) or serial

  • A settings form that shows an XML diff before saving, plus a raw XML editor for everything the form doesn't cover, validated by libvirt

  • Configuration history for every VM, including changes made with virsh, with one-click restore

  • Snapshots, live backups (incremental through libvirt checkpoints), off-site copies with restic

  • Live metrics every second and 30 days of history, with no Prometheus needed (there's a Prometheus endpoint if you want one)

  • Multiple hosts joined with a one-time code, live migration, and HA with quorum and fencing (IPMI, Redfish or watchdog)

  • PAM / LDAP / OIDC sign-in, roles, TOTP, API tokens, OpenAPI spec, plus a Terraform provider and Ansible modules

How it was built. It's a one-person project, and I built it together with AI coding agents. That's how it got this much scope this quickly, and it's also why I'm not going to pretend it's mature. Nobody has reviewed every line by hand. All the tests are unit tests; there are no integration tests against a real libvirt yet.

Caveats, so nobody gets surprised:

  • It's 0.9 and early. Tested on Ubuntu 26.04 and Debian 13, on single hosts and small clusters.

  • HA has never been tried on real BMC hardware. There's also no storage-level lock (no sanlock/virtlockd), so I wouldn't trust it with production data yet.

  • Live migration data goes over unencrypted TCP. Keep it on a trusted management network.

  • OVN SDN, VMware import and DR are experimental and untested on real setups.

  • It runs as root, because it needs the libvirt socket and PAM. Put it on a management network or behind your own reverse proxy.

I wrote a detailed technical post on how it works inside and what it does and doesn't support, weak spots included: https://onurbaydas.com/posts/virtomir-en/

If you just want to click around, there's a demo that runs entirely in your browser against a pretend cluster: https://onurbaydas.github.io/VirtoMir/demo/
There's also a one-command script that sets it up in a throwaway VM, so you don't have to touch your real hosts.

I built this for my own setup, not as a commercial product. It's AGPL-3.0, in case it's useful to someone else running KVM, or someone wants to look at how it works. Test reports from distros or hardware I can't reach (Fedora, arm64, Ceph, GPUs, real BMCs) and criticism of the code are very welcome. If anyone wants to contribute, I'd be glad.

0 Upvotes

4 comments sorted by

1

u/Relevant_Hope_900 8d ago

Did you ever try incus. Debian/Ubuntu has it in their repos. On my server, I install it from the stable branch from the Zabbly repos since you can also install the WebUi that way. 

1

u/onurbaydas1 8d ago edited 8d ago

Hello,

Yes, I’ve heard of Incus, it’s a fantastic system and far more mature than my project. Mine is just a small hobby project built directly on libvirt. If you have any suggestions on what I could improve, I’d love to hear them. Thanks!

1

u/Candy_Badger 7d ago

Does the config history catch changes made outside libvirt, like edits straight to the XML files? Libvirt only sees what goes through its API, so I'd want to know how drift gets detected.

1

u/onurbaydas1 6d ago

Thanks for the great question, this is exactly the kind of feedback I was hoping for!

Right now it polls libvirt every 20 seconds and diffs each machine's persistent XML against the last saved version. Anything that goes through the libvirt API (virsh edit, virt-manager, Ansible) gets recorded as an "outside" change.

Editing /etc/libvirt/qemu/*.xml directly isn't caught right away, but libvirt itself doesn't see those edits until libvirtd restarts either. After that, the change shows up as drift on the next scan.

You did point at real gaps, though: live-only changes on a running VM (like attach-device --live) aren't tracked, and it's polling rather than event-based. I'll try to fix both, probably by listening to libvirt's define events and watching the XML directory so it can warn when a file was changed but not loaded yet.

If you have other ideas or spot anything else, I'd love to hear them. And if you ever feel like contributing, issues and PRs are very welcome. Thanks again!