MicroVM orchestrator for your VPS with built-in sleep/wake policies, backups, snapshots, HTTPS, custom image, logs and metrics
nibrunner runs apps in Firecracker microVMs on one Linux machine. It is a single binary,
nibrunnerd. You list the apps you want in a JSON file. The daemon boots each one in its own
microVM and keeps it running.
- Sleep/wake policies — An app with no traffic is snapshotted and suspended. The next request wakes it. Which apps sleep, and after how long, is set per app, so a machine that runs a few dozen apps at once can hold hundreds.
- Backups and snapshots — Volumes can live in an object store, so they survive the machine. A checkpoint is a point-in-time copy of a volume. An export bundles a volume and the app's environment into an archive a new volume can start from.
- HTTPS — A built-in proxy routes each hostname to its app. It terminates TLS with the certificate you give it, or serves plain HTTP behind an edge that terminates TLS. Non-HTTP ports (ssh, DNS, WireGuard) are forwarded as-is, TCP or UDP, and wake a sleeping app like a request does.
- Custom image — An app's root filesystem is a stack of layers on top of the Debian guest image nibrunner ships: a bare executable the host packs into an image, or a squashfs or ext4 you built. A volume can start from an archive instead of empty.
- Logs and metrics — Each app's output goes to its own file. The host serves a Prometheus page built from the same state it reports.
You need a Linux x86_64 machine with /dev/kvm (bare metal, or a VPS with nested
virtualisation), running Debian or Ubuntu with systemd. As root:
curl -fsSL https://raw.githubusercontent.com/ilbertt/nibrunner/main/deploy/install.sh | shThis installs the required packages and the release, verified against its published digests, and
sets up the host from /etc/nibrunner/config.toml. If the file does not exist, it writes one:
volumes as files on the local disk, plain HTTP on port 80, no object store. Nothing is started
yet. Edit the file if you want, then:
nibrunnerd startThen put a binary in the artifact store and write /var/lib/nibrunner/desired.json, the file
nibrunnerd watches. The daemon boots the app, checks its health, and routes its hostname to it:
deploy an app.