virtu

Virtu
A dual-interface, high-performance virtualization management platform.
[!WARNING] Work in Progress: This project is under active development. Expect breakage, rough edges, and evolving APIs or interfaces here and there.
β‘ Overview
Virtu manages libvirt-based virtualization infrastructure (KVM/QEMU) across single hosts and multi-node clusters. It shares a unified Crystal core driving two interfaces:
- Virtu Web (WUI): A reactive hypermedia web dashboard built with Kemal, Blueprint, and Datastar (v1.0.4).
- Virtu Desktop (GUI): A native desktop client built with GTK4 and Libadwaita.
β¨ Features
- Native Libvirt C-FFI Core: Written in Crystal with non-blocking, fiber-aware
libvirtC bindings and per-node connection pooling. - Dual Interfaces: Manage cluster nodes from the browser (WUI) or natively on the desktop (GUI) across domain lifecycles, cloning, snapshots, storage pools/volumes, virtual networks, host network interface transactions, secrets, NWFilters, and telemetry.
- Hardware & XML Management: Configure domain firmware, topology, memory backing, devices, VFIO PCI passthrough, and raw Libvirt XML definitions.
- Sharded State Cache: Per-node background workers combine Libvirt lifecycle push events with background reconciliation so UI reads do not block on hypervisor I/O.
- Secrets Vault & Network Filters: Manage Ceph, LUKS, and VNC secrets alongside Libvirt NWFilter firewall rules and interface bindings.
πΈ Gallery
| Feature | Web Interface (WUI) | Desktop Client (GUI) |
|---|---|---|
| Dashboard | ![]() |
![]() |
| Virtual Machines | ![]() |
![]() |
| Storage Pools | ![]() |
![]() |
| Virtual Networks | ![]() |
![]() |
π Getting Started
Prerequisites
On Fedora:
# Enable Crystal COPR repository and install dependencies
sudo dnf copr enable -y zawertun/crystal
sudo dnf install crystal shards libvirt-devel gtk4-devel libadwaita-devel gobject-introspection-devel
# Add user to libvirt, kvm, and qemu groups for non-root hypervisor access
sudo usermod -aG libvirt,kvm,qemu $USER
newgrp libvirt
Ensure Crystal >= 1.20.2 and development headers for libvirt, gtk4, and libadwaita are installed.
[!NOTE] Ensure system packages are installed before running
shards install. If package installation occurs afterwards, run./bin/gi-crystalormaketo generate missing GObject Introspection bindings.
Build & Run
# 1. Install dependencies
shards install
# 2. Build binaries (development or release)
make # Dev build (fast compilation)
make release # Production build (optimized)
# 3. Run interface
./bin/virtu-wui # Web UI
./bin/virtu-gui # Desktop GUI
Useful Commands
make check(ormake test) β Run the unit and controller spec test suitemake test-e2eβ Run the 5-tier end-to-end integration test suitemake test-browserβ Run browser-based integration specs via Selenium and Broadwaymake formatβ Format Crystal codebase (crystal tool format)make lintβ Run Ameba static analysis, ESLint, and Stylelintmake securityβ Run Flaw security scannermake docβ Build Sphinx HTML documentationmake devβ Run development server with auto-reload (sentry)make installβ Install release binaries, desktop entry, systemd unit, and WUI assetsmake uninstallβ Remove installed binaries, desktop entry, systemd unit, and assets
System Integration & Contrib
System integration assets (systemd service, desktop launcher, and Fedora RPM spec) are located in contrib/:
# Install release binaries and system assets (defaults to /usr/local)
sudo make install
# Enable and start the background WUI daemon
sudo systemctl daemon-reload
sudo systemctl enable --now virtu-wui.service
# Launch the native desktop client from your launcher or terminal
virtu-gui
See contrib/README.rst for full deployment instructions and RPM packaging with mock.
Configuration
All configuration is via environment variables. VIRTU_CLUSTER_CONFIG (path to cluster.yaml, see cluster.example.yaml) is the only one most deployments need; the rest have safe defaults.
| Variable | Default | Purpose |
|---|---|---|
VIRTU_CLUSTER_CONFIG |
./cluster.yaml (or ~/.config/virtu/cluster.yaml) |
Hypervisor inventory file |
VIRTU_ENV |
β | Set to test to isolate specs (disables background polling) |
VIRTU_NO_POLL |
β | Set to true to disable background state polling |
VIRTU_NO_RUN |
β | Set to true to load the app without starting the server/GUI (specs) |
VIRTU_HOST |
127.0.0.1 |
WUI bind address |
VIRTU_PORT |
5050 |
WUI bind port |
VIRTU_WUI_USER/VIRTU_WUI_PASS |
β | WUI basic-auth credentials (required when bound to a non-loopback address) |
VIRTU_PUBLIC_DIR |
β | Custom directory override for WUI static assets |
VIRTU_CACHE_DIR |
/var/lib/libvirt/images/cache (fallback ~/VirtualMachines/cache) |
OS image download cache |
VIRTU_NODES_PER_PAGE/VIRTU_DOMAINS_PER_PAGE |
24 |
GUI pagination sizes |
VIRTU_GRID_COLUMNS |
5 |
Maximum columns for GUI card grids (1..12) |
VIRTU_LOG_LEVEL |
info |
Logging verbosity (debug, info, warn, error, fatal) |
π Technical Documentation
Detailed architecture documentation, technical specs, Architecture Decision Records (ADRs), and the project roadmap can be found in the docs/ directory.
π€ Contributing
We welcome contributions! Please review our Contributing Guidelines for environment setup, testing standards, Conventional Commits, and code quality requirements.
- Fork the project.
- Create your feature branch (
git checkout -b feature/my-feature). - Commit your changes (
git commit -s -m 'feat(scope): add some feature'). - Push to the branch (
git push origin feature/my-feature). - Open a Merge Request on GitLab.
Co-developed by RΓ©nich Bon ΔiriΔ & Gemini AI Pair-Programmer
virtu
- 2
- 0
- 0
- 0
- 12
- 11 days ago
- June 7, 2026
GNU General Public License v3.0 or later
Tue, 20 Oct 2026 08:42:00 GMT







