virtu

Virtualization management platform with a GUI and a WUI.

Virtu Banner

Virtu

A dual-interface, high-performance virtualization management platform.

GitLab Repository GitLab CI Status Crystal Version License: GPL-3.0-or-later

[!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 libvirt C 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 Virtu WUI Dashboard Virtu GUI Dashboard
Virtual Machines Virtu WUI Domains Virtu GUI Domains
Storage Pools Virtu WUI Storage Virtu GUI Storage
Virtual Networks Virtu WUI Networks Virtu GUI 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-crystal or make to 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 (or make test) β€” Run the unit and controller spec test suite
  • make test-e2e β€” Run the 5-tier end-to-end integration test suite
  • make test-browser β€” Run browser-based integration specs via Selenium and Broadway
  • make format β€” Format Crystal codebase (crystal tool format)
  • make lint β€” Run Ameba static analysis, ESLint, and Stylelint
  • make security β€” Run Flaw security scanner
  • make doc β€” Build Sphinx HTML documentation
  • make dev β€” Run development server with auto-reload (sentry)
  • make install β€” Install release binaries, desktop entry, systemd unit, and WUI assets
  • make 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.

  1. Fork the project.
  2. Create your feature branch (git checkout -b feature/my-feature).
  3. Commit your changes (git commit -s -m 'feat(scope): add some feature').
  4. Push to the branch (git push origin feature/my-feature).
  5. Open a Merge Request on GitLab.

Co-developed by Rénich Bon Ćirić & Gemini AI Pair-Programmer

Repository

virtu

Owner
Statistic
  • 2
  • 0
  • 0
  • 0
  • 12
  • 11 days ago
  • June 7, 2026
License

GNU General Public License v3.0 or later

Links
Synced at

Tue, 20 Oct 2026 08:42:00 GMT

Languages