Everything below is measured on macOS (Apple Silicon) on 2026-06-10, not
projected. The slim engine was booted as a real VZ microVM (isolated
NEBULA_HOME) and driven by the unmodified Docker CLI 27.5 through
nebula's normal socket-proxy → vsock path.
Full (Nebula.app) |
Slim (Nebula-Slim.app) |
|
|---|---|---|
| On disk | 311 MB | 54 MB |
| Compressed download (.zip/.dmg) | 207 MB (dmg) | 34 MB |
5.7× smaller on disk, 6× smaller to download. The slim app is the full Tauri UI + nebula/nebulad sidecars + kernel + slim rootfs + slim CLIs.
What an app actually bundles to embed the engine:
| component | size |
|---|---|
| kernel (gz) | 15.5 MB |
| rootfs-slim (gz) | 9.0 MB |
| nebula + nebulad (host sidecars) | 4.9 MB |
| docker-slim + kubectl-slim + helm-slim | 2.5 MB |
| embed core (engine + CLIs) | 31.9 MB |
| + libkrun (only for sandbox/GPU sidecars) | 45.7 MB |
~32 MB to embed a working container + Kubernetes(-facade) + Helm engine — versus ~140 MB+ for the Go stack the full flavor ships. Comfortably under the 50 MB goal; the original "≈35 MB reachable" pitch is beaten.
Biggest remaining chunks if we ever want smaller: kernel (15.5 MB — a slim-specific kernel-config trim is the S11 stretch), libkrun (14 MB, droppable if you don't need ephemeral sandbox/GPU sidecars), and the UI binary (8 MB, irrelevant to non-UI embedders).
On the booted slim microVM, DOCKER_HOST=unix://…/run/docker.sock docker …:
pull(Docker Hub),images,load,run -d,run -t,runforeground (stdout/stderr streamed via attach), exit-code propagation,logs,exec,cp,ps,create/start/stop -t/rm,inspect -f, volumes.- Host bind mounts (
-v,--mount type=bind) of directories and files, read-only and read-write, from paths containing spaces; named + anonymous + imageVOLUMEs; container-to-container DNS on user networks; published ports scoped to a host address (-p 127.0.0.1:…). Covered byslim/test/appstack.shand corpus cases 105/115/155. docker build(multi-step, layer commit, run-the-built-image).- The slim CLIs (
docker-slim/kubectl-slim/helm-slim) — and the k8s-facade / helm flows (apply/get/scale/delete, helm install/template/ list/uninstall) — validated 32/32 in the engine microVM.
The same engine API is also cross-checked against real dockerd (docker-slim as client) as the compatibility oracle.
docker buildneedsDOCKER_BUILDKIT=0. slim implements the classic builder (/build); it does not speak the BuildKit gRPC session protocol the modern CLI defaults to.docker-slim buildalways uses the classic path, so it needs no flag — only the realdockerCLI does.- k8s/helm: facade only — CRDs/operators/RBAC are skipped (use
--strictto fail loudly). Seeslim-k8s-shim.md/slim-k8s-roadmap.md. - Engine is one-request-per-connection (
Connection: close) — fine for a single local client; not tuned for thousands of concurrent API callers.
slimd is Linux-native (it is the guest). The portability surface is the clients and the VMM host integration:
- macOS (arm64): done — VZ backend; booted as a real microVM and driven by the real Docker CLI. 32/32 (docker 18 + kube/helm 14). (x86_64 macOS should be a rebuild; untested.)
- Linux (x86_64): done — slimd + the three CLIs cross-built to
x86_64-unknown-linux-musland validated on an Ubuntu 24 / kernel 6.8 box (Docker 29, KVM present): 32/32 (docker 18 + kube/helm 14), same suites as macOS.aarch64-muslalso builds. So slimd is arch-portable; the remaining Linux work is just choosing host integration (KVM microVM via the krun backend, or slimd-direct for embedding). - Windows: the real target is Hyper-V (not WSL2 nested virt). Work
needed: a Hyper-V backend in nebula-core,
docker-slim/kubectl-slim/helm-slimbuilt forx86_64-pc-windows-msvc(the clients are pure Rust + a unix-socket transport that must become a named pipe on Windows — the one place the client code needs a platform branch), and named-pipe ↔ vsock proxying. slimd itself is unchanged (Linux guest). Deferred, but no architectural blocker.