unikernels, without the ceremony

Ship apps as single binaries. Not containers.

kern compiles your app into a unikernel — a minimal OS image that boots in milliseconds, uses a fraction of the memory, and exposes a tiny attack surface. No Docker daemon. No kraft. Just QEMU.

kern — zsh
~10ms
boot time
Docker: 800ms–2s
~50
syscalls exposed
Docker: ~400
4
runtimes
Node · Go · Rust · Python
0
Docker daemons needed
nothing to run

$ kern build

Six deterministic steps. One binary out.

kern orchestrates standard, battle-tested tools instead of a proprietary daemon. Every stage is inspectable and reproducible.

  1. skopeo01

    Download kernel

    Pulls the Unikraft kernel from the unikraft.org OCI registry. Cached after the first build.

  2. buildah02

    Build rootfs

    Assembles the root filesystem with no Docker daemon. Runs rootless and is CI-safe.

  3. cpio03

    Pack initramfs

    Bundles the rootfs into an initramfs archive the kernel can mount at boot.

  4. objcopy04

    Generate .uki

    Unified Kernel Image — kernel + initramfs + cmdline fused into a single binary.

  5. ed2551905

    Sign image

    Every build is signed automatically. No opt-in, no external tooling.

  6. QEMU KVM06

    Run direct

    Boots the image straight on QEMU with KVM. No kraft at runtime.

$ kern vs docker

The same app. A different order of magnitude.

MetrickernDocker
Boot time5–12ms800ms–2s
Image size20–110MB150–800MB
Memory usage8–40MB50–150MB
Attack surface~50 syscalls~400 syscalls
Image signinged25519 built inoptional, external
SBOM generationSPDX-2.3 built inoptional, external
Daemon requirednoneDocker daemon
Shared kernelno — each app isolatedyes — host kernel

$ kern init

Zero config. kern reads your project.

Drop into any repo and run kern init. The runtime is detected from the files already in your tree.

Node.js 21

Stable

detected from package.json

memory
512Mi
boot
~10ms

Go 1.22

Stable

detected from go.mod

memory
128Mi
boot
~8ms

Rust

Stable

detected from Cargo.toml

memory
128Mi
boot
~8ms

Python 3.12

Stable

detected from requirements.txt

memory
384Mi
boot
~11ms

$ install

Install in one line.

One script pulls the CLI, verifies your host, and gets you to your first booted unikernel in seconds.

Requirements

  • Linux
  • KVM
  • x86_64
install.sh
$ bash <(curl -fsSL https://raw.githubusercontent.com/Kern-Unikernel/Kern-Unikernel/main/install.sh)
first run
$ cd my-app
$ kern init
$ kern build
$ kern run -d

$ ci

Build unikernels in CI with one line.

Drop the official GitHub Action into your workflow. It builds, signs, and pushes a unikernel image to your container registry on every commit — rootless, no daemon.

.github/workflows/build.yml
uses: Kern-Unikernel/action@v1
with:
push: ghcr.io/${{ github.repository }}:${{ github.sha }}
registry-user: ${{ github.actor }}
registry-token: ${{ secrets.GITHUB_TOKEN }}