Lightweight tool for managing linux virtual machines
๐ Flint โ KVM Management, Reimagined
A single <11MB binary with a modern Web UI, CLI, and API for KVM.
No XML. No bloat. Just VMs.
Flint is a modern, self-contained KVM management tool built for developers, sysadmins, and home labs who want zero bloat and maximum efficiency. It was built in a few hours out of a sudden urge for something better.
๐ Prerequisites
System Requirements:
- Linux host (Debian, Ubuntu, Fedora, RHEL, Arch, etc.)
- libvirt >= 6.10.0 (check with
libvirtd --version) - QEMU/KVM virtualization support
Debian/Ubuntu
sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-daemon libvirt-clients bridge-utils
sudo systemctl enable --now libvirtd
RHEL/Fedora/CentOS
sudo dnf install -y qemu-kvm libvirt libvirt-client virt-install
sudo systemctl enable --now libvirtd
Arch Linux
sudo pacman -S qemu-full libvirt virt-install virt-manager
sudo systemctl enable --now libvirtd
Note: If you encounter libvirt-lxc.so.0: cannot open shared object file, install the LXC library:
# Debian/Ubuntu sudo apt install -y libvirt-daemon-driver-lxc
RHEL/Fedora
sudo dnf install -y libvirt-daemon-lxc
Arch
sudo pacman -S libvirt-lxc
Platform Compatibility:
Flint is built with CGO (libvirt-go bindings). We provide binaries for both glibc and musl (Alpine Linux):
- glibc binaries:
flint-linux-amd64,flint-linux-arm64(for Debian, Ubuntu, Fedora, RHEL, Arch, etc.) - musl binaries:
flint-linux-amd64-musl,flint-linux-arm64-musl(for Alpine Linux)
Running Flint on Alpine Linux
Native musl support is now available! Download the musl-specific binary for your architecture:
# For Alpine Linux (amd64)
wget https://github.com/volantvm/flint/releases/latest/download/flint-linux-amd64-musl.zip
unzip flint-linux-amd64-musl.zip
chmod +x flint
./flint serve
For Alpine Linux (arm64)
wget https://github.com/volantvm/flint/releases/latest/download/flint-linux-arm64-musl.zip
unzip flint-linux-arm64-musl.zip
chmod +x flint
./flint serve
Prerequisites for Alpine:
# Install required Alpine packages apk add libvirt-daemon libvirt-qemu qemu-system-x86_64 rc-update add libvirtd rc-service libvirtd start
Alternative: Use gcompat compatibility layer
If you prefer to use the standard glibc binary on Alpine:
apk add gcompat libstdc++ wget https://github.com/volantvm/flint/releases/latest/download/flint-linux-amd64.zip unzip flint-linux-amd64.zip chmod +x flint ./flint serve ๐ One-Liner Install
curl -fsSL https://raw.githubusercontent.com/volantvm/flint/main/install.sh | bash
Auto-detects OS/arch, installs to /usr/local/bin, and prompts for web UI passphrase setup.
๐ Security & Authentication
Flint implements a multi-layered security approach:
Web UI Security:
- Passphrase Authentication: Web interface requires a passphrase login
- Session-Based: Secure HTTP-only cookies with 1-hour expiry
- No API Key Exposure: Web UI never exposes API keys to browsers
- Bearer Token Authentication: CLI and external tools use API keys
- Protected Endpoints: All API endpoints require authentication
- Flexible Access: Support for both session cookies and API keys
# First run - set passphrase flint serve ๐ No web UI passphrase set. Let's set one up for security.
Enter passphrase:
Web UI access
Visit http://your-server:5550 โ Enter passphrase โ Full access
CLI access (uses API key)
flint vm list --all
External API access
curl -H "Authorization: Bearer YOURAPIKEY" http://localhost:5550/api/vms
โจ Core Philosophy
- ๐ฅ๏ธ Modern UI โ A beautiful, responsive Next.js + Tailwind interface, fully embedded.
- โก Single Binary โ No containers, no XML hell. A sub-8MB binary is all you need.
- ๐ ๏ธ Powerful CLI & API โ Automate everything. If you can do it in the UI, you can do it from the command line or API.
- ๐ฆ Frictionless Provisioning โ Native Cloud-Init support and a simple, snapshot-based template system.
- ๐ Secure by Default โ Multi-layered authentication with passphrase protection.
- ๐ช Non-Intrusive โ Flint is a tool that serves you. It's not a platform that locks you in.
- ๐ Remote Management โ Connect to remote KVM/libvirt servers via SSH from a single Flint instance.
๐๏ธ Quickstart
1. Start the Server
# Interactive setup (recommended for first run) flint serve --set-passphrase
Or set passphrase directly
flint serve --passphrase "your-secure-password"
Or use environment variable
export FLINT_PASSPHRASE="your-secure-password"
flint serve
On first run, you'll be prompted to set a web UI passphrase for security.
- Web UI:
http://localhost:5550(requires passphrase login) - API:
http://localhost:5550/api(requires authentication)
- Visit
http://localhost:5550 - Enter your passphrase to access the management interface
- All API calls are automatically authenticated via session
# VM Management
flint vm list # List all VMs
flint vm launch my-server # Create and start a VM
flint vm ssh my-server # SSH into a VM
Cloud Images
flint image list # Browse cloud images
flint image download ubuntu-24.04 # Download an image
Networks & Storage
flint network list # List networks
flint storage volume list default # List storage volumes
4. API Access (for external tools)
# Get your API key (requires authentication) curl -H "Authorization: Bearer YOURAPIKEY" http://localhost:5550/api/vms
๐ Remote Server Management via SSH
Flint can connect to remote KVM/libvirt servers via SSH, allowing you to manage distributed virtualization infrastructure from a single instance.
Setup Requirements:
- SSH key-based authentication configured between Flint host and remote server
- Remote server must have libvirt >= 6.10.0 installed
- User on remote server must have permissions to access libvirt
Option 1: Web UI (Recommended)
- Navigate to Settings in the Flint web interface
- Enable "SSH Connection" toggle
- Fill in SSH connection details:
root or user with libvirt permissions) - Host (IP address or hostname) - Port (default: 22) - SSH Key Path (auto-detected from ~/.ssh/) - Click "Test Connection" to verify
- Click "Save Configuration" and restart Flint
~/.flint/config.json: { "libvirt": { "uri": "qemu:///system", "ssh": { "enabled": true, "username": "root", "host": "192.168.1.100", "port": 22, "keypath": "~/.ssh/idrsa", "knownhostspath": "~/.ssh/known_hosts" } } }
Option 3: Environment Variables
export FLINTLIBVIRTSSH_ENABLED=true export FLINTLIBVIRTSSH_USERNAME=root export FLINTLIBVIRTSSH_HOST=192.168.1.100 export FLINTLIBVIRTSSH_PORT=22 export FLINTLIBVIRTSSHKEYPATH=~/.ssh/id_rsa flint serve
SSH Key Setup:
# On Flint host, generate SSH key if needed ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
Copy public key to remote server
ssh-copy-id root@192.168.1.100
Verify connection
ssh root@192.168.1.100 virsh list --all
Security Notes:
- SSH keys must have secure permissions (600 or 400)
- Password authentication is not supported (key-based only)
- Flint uses the standard libvirt SSH transport (qemu+ssh://)
- All libvirt operations are encrypted via SSH tunnel
๐ Full Documentation
Complete CLI commands, API reference, and advanced usage:
โก๏ธ docs.md - Complete CLI & API Documentation
๐ง Tech Stack
- Backend: Go 1.25+
- Web UI: Next.js + Tailwind + Bun
- KVM Integration: libvirt-go
- Binary Size: ~11MB (stripped)
๐ Flint is young, fast-moving, and designed for builders.
Try it. Break it. Star it. Contribute.
From the team at Chaser ยท Run it on your own infrastructure โ
