Run your app as its own virtual machine.

jerboa turns a Linux program into a bootable image with its own kernel, and runs it as a Firecracker or QEMU VM.

curl -fsSL 'https://jerboa.dev/install.sh' | sudo bash
Download for Windows Installs the CLI and a dedicated WSL2 distro for the daemon.
Download for macOS Development preview: Apple Silicon, macOS 26+, not yet signed. Read the macOS guide
Source to responsebuild, boot and first HTTP answer: 859 ms
< 1 s
HTTP requests per secondagainst Docker on macOS, Go server
1.9×
Random disk readsagainst Docker on macOS, fio 4k
6.3×
How these were measured, losses included

A recorded session

Build a Go web server, start it as a VM and request a page. Recorded on an Apple M5; the transcript is unedited.

~/web
$ jerboa build . --name web  Building project...  ✓ Build complete  Assembling image on daemon...  ✓ web:latest  ·  10.4MB  ·  built in 659ms$ jerboa run -d -p 8080:8080 --name web webe6cf1bf78d40Started in 27ms$ curl localhost:8080hello from a linux/arm64 unikernel$ jerboa psID            NAME  STATE    HEALTH  IMAGEe6cf1bf78d40  web   running          sha256:8e36de256043…$ jerboa stats webState   runningCPU     0.0%Memory  59.4 MiBDisk    3.4 MiB
Recorded on an Apple M5 with jerboa 0.54.3. Pauses match the measured command times; typing is sped up.
Elapsed time, to scale
  1. Image built659 ms
  2. VM launched686 ms
  3. First response859 ms

One kernel per app

A container shares the host’s kernel with every other container. A jerboa VM carries its own Nanos kernel behind the hypervisor, with no shell, no init and no other process.

Containers
apiuserland, shellworkeruserland, shellredisuserland, shell
container runtime · namespaces, cgroups
host Linux kernel shared by all three
hardware
jerboa
apithe only processworkerthe only processredisthe only process
Nanos kernelNanos kernelNanos kernel
Firecracker / QEMUFirecracker / QEMUFirecracker / QEMU
KVM on Linux · Hypervisor.framework on macOS
hardware

Commands

The workflow follows containers: build, run, publish, network, mount. Every command below comes from the documentation.

~/web
# Go, Node.js, Python and Rust projects are detected
jerboa build . --name web

# Drop the boot code and the second kernel copy
jerboa build . --name web --layout compact

# See which programs and packages fill the image
jerboa build . --name web --size-report
  • Language drivers compile the project into the image
  • lang = "raw" packages any prebuilt Linux binary
  • A compact Go web server image weighs 7.5 MB
Read the build docs

Against Docker

Same binaries on both sides, runs interleaved, medians of at least three. jerboa is ahead at start-up, random disk reads and, on macOS, request-heavy apps. Docker is ahead at sequential writes, at sending from a VM to the host on macOS and, on Linux, for clients on the LAN.

macOS Apple M5, 10 cores, 16 GB, macOS 26

Startup run --rm echo hello Wall time of a one-shot run, mean of 10 · lower is better
22 % faster
Disk fio random read 4k 4 jobs × 1 GiB, 60 s
6.3× faster
Disk fio sequential write + fsync 1 MiB blocks, 1000 MB
47 % slower
Network iperf3 VM → host TCP through a published port
40 % slower
Apps Redis SET redis-benchmark through a published port
38 % faster
Apps HTTP, Go server wrk, 4 threads, 100 connections
91 % faster

Docker Desktop runs all containers inside one Linux VM; jerboa boots one VM per app on Hypervisor.framework.

Linux Xeon E5-2620 (2012), nested KVM guest with 2 vCPU and 4 GB

Startup run --rm echo hello Wall time of a one-shot run, mean of 10 · lower is better
2.1× faster
Disk fio random read 4k 4 jobs × 1 GiB, 60 s
2.5× faster
Disk fio sequential write + fsync 1 MiB blocks, 1000 MB
15 % slower
Apps Redis SET, client on the host Published port, kernel NAT
15 % faster
Apps Redis SET, client on the LAN Published port, --port-publish nat-lan
37 % slower
Apps HTTP, Go server wrk, 4 threads, 100 connections
7 % slower

This host is itself a VM without APICv, so every guest exit costs 50–120 µs instead of 1–2 µs. That penalizes jerboa’s VMs and not Docker’s containers.

All results, test machines and exclusions

Trade-offs

A unikernel trades flexibility for isolation and size. These are the limits you hit first.

One process per VM
Nanos has no fork, no exec and no shell. Entry-point scripts must point at the real binary; tools that spawn helpers, like PostgreSQL’s initdb, run at build time.
No shell into a running VM
There is nothing to exec into. jerboa exec sends a signal; debugging goes through logs, stats and the serial console.
macOS is a development preview
It needs Apple Silicon and macOS 26 or newer, and the app is not yet signed by Apple.
Windows runs through WSL2
The daemon lives in a dedicated WSL2 distro. There is no native Windows virtualization.
Read about the one-process model

Install

One installer ships the CLI and the daemon. Then build any Go, Node.js, Python or Rust project.

curl -fsSL 'https://jerboa.dev/install.sh' | sudo bash
Download for Windows Installs the CLI and a dedicated WSL2 distro for the daemon.
Download for macOS Development preview: Apple Silicon, macOS 26+, not yet signed. Read the macOS guide
Read the getting started guide