A simple Node.js-based launcher for a preconfigured QEMU virtual machine. VPN routing is handled by your host VPN client or network setup.
⚠️ This project does not include QEMU binaries due to licensing. See the QEMU Setup section below for instructions on installing them manually.
- Launches a QEMU VM from a preconfigured disk image
- Optional ISO boot for OS installs
- Config-driven VM settings (CPU, RAM, display, accel)
- Designed to run alongside a host VPN (routing handled externally)
- Windows Hypervisor Platform or Hyper-V enabled (for WHPX acceleration)
- Node.js (v18+ recommended for development/build)
- QEMU binaries in
qemu/ - VM disk image (e.g.,
.qcow2) - Optional ISO image for installs
pkgfor building the Windows EXE- Optional VPN client (OpenVPN or WireGuard) if you want host VPN routing
When exporting and distributing, the directory must have:
deb.img(or your VM disk image)qemu/config.json- ISO file specified by
config.json(for installs)
The launcher reads config.json and uses these keys:
showConsole: Show QEMU output window.useIso:trueto boot from ISO for installs.isoPath: Path to the installer ISO.diskPath: Path to the VM disk image.memoryMB: RAM in MB.cpus: vCPU count.diskFormat: Disk format, defaultqcow2.compatMode:trueto use legacy devices (IDE disk, RTL8139 NIC, standard VGA). Helpful if WHPX has MSI/virtio issues.machine: QEMU machine type, defaultpc(i440fx).display: Display backend, defaultsdl(often smoother thangtkon Windows).accel: Acceleration backend, defaultwhpx. You can add options likewhpx,kernel-irqchip=offif WHPX MSI injection fails.cpu: CPU model, defaultmax(WHPX does not accepthost).
Paths in config.json can be relative to the project root or absolute.
This project depends on QEMU to launch virtual machines. Due to licensing terms (GPLv2), QEMU binaries are not included in this repository.
Download QEMU for Windows from:
Extract the .exe and .dll files into the qemu/ directory at the root of this project.
If you need a minimal Debian installation image, download the official Debian netinst ISO:
Place the .iso file wherever you keep VM assets and set isoPath in config.json to match.
Example:
vm-images/
├── debian-13.3.0-amd64-netinst.iso
├── debian.qcow2
Install dependencies:
npm installInstall a distro (recommended flow):
- Set
useIsototrueinconfig.jsonand pointisoPathto the ISO. - Run:
node index.js- After installation, set
useIsoback tofalseto boot from disk.
Legacy install script (uses hardcoded paths):
node install.jsRun/test an existing image:
node index.jsOld:
npm build = pkg . --targets node14-win-x64 --output vpn-vm-launcher.exe --debugNew:
npx pkg . --targets node14-win-x64 --output vpn-vm-launcher.exe --debug --win-console=false