Self-hosted virtualization · Debian 13 · QEMU/KVM

Run VMs on one Debian box. From your phone.

home-ve turns a plain Debian machine into a VM host you run from the browser: create and install VMs, watch and control them, back them up every night and keep an encrypted copy off-site. No Proxmox, no custom kernel, and the web UI never runs as root.

LOGIN

Real screens from the web UI. The animation and the beat are generated live in your browser.

1 boxplain Debian 13, no cluster
0 rootthe web UI never runs as root
1 filereadable config per VM
7 + 4daily and weekly backups kept
Why home-ve

Tools you already know, without the lock-in.

Made for a home server or a small office box: a router VM, Home Assistant, a NAS, a few Linux servers.

Plain Debian

Nothing custom underneath

QEMU/KVM, LVM thin volumes, systemd and nginx. Each VM is one text file in /etc/vm/ and one vm@name unit, so anything the UI does, the shell can do too.

Least privilege

The backend is not root

It may only start and stop vm@… units through polkit and write VM settings. Root-side scripts parse those files and never execute them.

Any screen

A phone is enough

The whole UI works on a phone as well as on a desktop, including the VM console in the browser, with a key panel for the keys a phone keyboard lacks.

Backups

Without stopping the VM

File systems freeze for a moment, a thin snapshot is taken and compressed with zstd. Nightly, restore in one tap with an undo snapshot, optional encrypted copy to Cloudflare R2.

Self-updating

One button to update

One idempotent install.sh sets it up. After that, updates come from the web UI on the stable or dev channel.

Small

No database, no runtime

A self-contained backend binary with no .NET on the host, a static frontend, and state in plain files.

The web UI

Everything from a 390 px screen.

Scroll through the real pages, shown with the mock data the backend serves in development.

The VM list: a running router VM and a stopped test VM
VMsStatus, CPU, memory, address
A VM's page: buttons, load, IP addresses, hardware
VMLoad, uptime, guest IPs
A VM console in the browser with a key panel
ConsolenoVNC with a phone key panel
VM settings: CPUs, memory, autostart, backup, CD drive, network
SettingsCores, memory, NICs, autostart
A VM's backups: back up now, restore, delete
BackupsOn demand, restore, undo
The New VM form
New VMFrom an ISO or a qcow2 image
ISO images: download by URL and the list
ISOsThe host downloads by URL
Host status: CPU, temperature, memory, disk
HostCPU, temperature, disk
Update channel and offsite backup
UpdateStable or dev channel
How it works

One request path. No magic in between.

home-ve · request path
browser ──► nginx on the host ─┬─► /var/www/home           frontend: static files (React)
                               └─► /api/ → 127.0.0.1:5000  backend: ASP.NET Core, API only
                                                ├─► /etc/vm/*.conf               VM settings (reads and writes)
                                                ├─► systemctl … vm@<name>        via polkit, only these units
                                                ├─► /run/vm-<name>/vnc.sock      console, WebSocket ⇄ VNC
                                                └─► /proc, /sys, journalctl      load, temperature, log

vm@<name>.service ──► vm-run <name> ──► qemu-system-x86_64     (root; validates the .conf itself, executes nothing from it)
Private by defaultThe backend listens only on localhost, lets in private networks only, and only after a password login.
Readable stateVM settings are plain .conf files. Back them up, diff them, edit them by hand.
No root in the UIOnly the small vm-run script runs as root, and it trusts nothing it reads.
Install

From a USB stick to a VM host in minutes.

The installer image brings its own page, on the machine's screen or on your phone.

  1. Get the imageThe installer ISO from the latest release, about 550 MB. Write it to a USB stick or attach it to a VM.
  2. Boot itIt starts the installer by itself. The screen shows an address and a code.
  3. Fill in the pageOn the screen or on a phone: the disk and how it is split, the network card, host name, update channel, passwords.
  4. InstallIt asks once more before erasing the disk, then shows each step with its log.
  5. Restart and sign inThe first start finishes setup, then the screen shows the web UI's address.

What you need

  • A 64-bit machine or a VM with a wired network card and DHCP
  • Internet access during the install
  • A disk of at least 32 GB that will be erased whole
  • BIOS or UEFI, Secure Boot included

Already on Debian 13? Install step by step instead, see the deployment guide.

Deployment guide
License

Free at home. Licensed for business.

PolyForm Noncommercial 1.0.0 with an additional permission. This is a summary; the LICENSE file is what applies.

Free of charge

At home, for hobby, study and research; for noncommercial, educational and government organizations; for an individual, freelancer or sole proprietor for their own work. Change it and share it.

Commercial license

For any company that makes money, and for anyone who sells it, builds it into a product or device, offers it as a service or installs it for clients for a fee. Contact the author via GitHub.