Ordinary Linux programs, each in its own micro‑VM.
hyperlight-unikraft runs Python, Node.js, .NET, Go, Rust and more on a Unikraft kernel inside Hyperlight. The guest reaches nothing on the host unless you allow it, and a warmed guest comes back from a snapshot in milliseconds.
curl -fsSL https://raw.githubusercontent.com/hyperlight-dev/hyperlight-unikraft/main/install.sh | sh
irm https://raw.githubusercontent.com/hyperlight-dev/hyperlight-unikraft/main/install.ps1 | iex
cargo install hyperlight-unikraft
Then hluk init hello --template python, cd hello, hluk run. The CLI is hluk, pronounced "hulk".
Boot once. Restore in milliseconds.
Booting a guest and starting CPython takes a couple of hundred milliseconds. Restoring a snapshot of the booted guest takes under ten, and a guest already in memory resets in about one. The bars play ten times slower than real time.
Loading the latest results from CI…
A thousand Python sandboxes in under 3 GiB
Guests restored from one snapshot share it, so each sandbox adds only the memory it changes. One hluk process ran 1,000 Python micro-VMs at once, each running a script in a loop, and peaked at 2.7 GiB of private memory: about 2.8 MiB per sandbox.
- 1,000
- Python micro-VMs running at once, in one process
- 2.8 MiB
- private host memory per sandbox, 2.7 GiB for all of them at the peak
- 74 MiB
- the one snapshot all of them start from
Measured with hluk bench parallel --vms 1000 (hluk 0.17.0) on Linux/KVM, an 8-vCPU Xeon Platinum 8370C. Peak RssAnon of the process; site/tools/density.sh repeats it.
One command for every runtime
hluk init starts a project from a template and pulls the runtime's image. Interpreted languages run as scripts; compiled ones are built on the host by hluk build and mounted into the guest.
Add packages with a Dockerfile
Every runtime image is published as a base to build FROM. Install packages in a normal Linux stage, copy them onto the rootfs, and hluk build exports the result as the guest's filesystem. The http-python, http-node and http-dotnet templates follow this pattern.
The guest gets what the manifest grants
A guest starts with no host files, no network and no listening ports. Each capability is a line in hluk.toml or a flag to hluk run.
# hluk.toml
[run]
script = "main.py"
mounts = ["./data:/mnt/data:ro"]
[run.net]
allow = ["pypi.org", "files.pythonhosted.org"]
ports = [8080]
- Files
mountspreopens a host directory, read-only with:ro. Nothing else on the host filesystem is visible. fs.md- Network
- No
[run.net]table means no sockets.alloworblocklists name hosts or addresses. net.md - Listening
portslists what the guest may listen on. A guest socket is a host socket at the address the guest binds, so0.0.0.0listens on every host interface.- Isolation
- Each sandbox is a hardware-virtualized VM with its own kernel. A compromised interpreter is still inside the VM.
Runs where Hyperlight runs
| Host | Hypervisor | Guests |
|---|---|---|
| Linux | KVM, or MSHV with --features mshv | x86_64, arm64 |
| Windows | Windows Hypervisor Platform | x86_64, arm64 |
| macOS on Apple silicon | Hypervisor.framework | arm64 |