Every AI-agent sandbox vendor converged on the same answer: Firecracker microVMs, booting in roughly 150 milliseconds from snapshot, wrapped in an SDK shaped around the agent loop. E2B proved the model, and the rest of the market followed it. But operating Firecracker yourself has never been a single binary. It is a kernel image you build, a root filesystem you craft, a jailer configuration you get right, and a snapshot-pool orchestration layer you write from scratch. A Rust project called smolvm asks what happens if you delete all of that: one binary, any OCI image as input, a hardware-isolated microVM out, in under 200 milliseconds.
The verdict, up front: smolvm is the most interesting embeddable per-invocation sandbox runtime to evaluate right now if you self-host agent infrastructure — not because it beats Firecracker's boot time (it doesn't, on paper), but because it collapses weeks of integration work into smolvm machine run --image. Treat it as a complement to a Firecracker or Kata story — dev inner loop, burst fan-out, laptop-to-node parity — not as a hardened multi-tenant replacement today.
One note before you search: two unrelated projects share the name "SmolVM" (more on that below). This post is about smol-machines/smolvm, the Rust, libkrun-based one.
What Firecracker-only actually costs you
Firecracker's headline numbers are genuinely excellent: sub-125ms boot, single-digit megabytes of memory overhead per microVM, a minimal device model purpose-built for multi-tenant density. That is why E2B, Fly Machines, and half the sandbox market sit on it. The cost was never the boot time. It is everything around the boot:
- Image pipeline. Firecracker boots a kernel plus a rootfs you supply. Turning "the tenant's OCI image" into that pair means extraction, init wiring, and agent injection you own forever.
- Jailer and host hardening. The jailer, cgroup setup, seccomp posture, and
/dev/kvmaccess model are configuration you write, audit, and re-audit after every CVE. - Snapshot and pool orchestration. The famous ~150ms number is a snapshot-resume number. Somebody builds the snapshot pipeline, the warm pool, the placement logic, and the pause/resume billing semantics. E2B's moat is substantially this layer, not the hypervisor.
- Linux plus KVM, always. Firecracker runs on Linux with KVM. Your developers' MacBooks can't run the same artifact they ship, so the inner loop is "push and pray" or a remote dev box.
None of this is a reason to abandon Firecracker. It is the reason a "Firecracker-only isolation story" quietly becomes a second platform team. Anything that shrinks the surrounding work without giving up hardware isolation deserves a serious look.
What smolvm actually is
smolvm (smol-machines/smolvm, Apache-2.0) is a Rust CLI and SDK for ephemeral and persistent Linux microVMs. Its architecture makes one big bet: instead of being a standalone VMM process like Firecracker or QEMU, it builds on libkrun — the library VMM from the containers ecosystem — with the guest kernel supplied by libkrunfw. The hypervisor backend is per-OS native: Hypervisor.framework on macOS, KVM on Linux (x86_64 and aarch64), and the Windows Hypervisor Platform on Windows. Each workload gets its own guest kernel behind a real hypervisor boundary; volume mounts, networking, and credentials stay on the host side of it.
Four primitives carry most of the value:
1. Boot any OCI image directly. No kernel/rootfs crafting step:
smolvm machine run --net --image alpine -- sh -c "uname -a"Point --image at a registry image, a docker save archive, or an unpacked rootfs directory. Image work is delegated to your existing container tooling; smolvm boots the result.
2. Declare machines in a Smolfile. A TOML file — image, CPUs, memory, network policy with per-host allowlists, mounts, ports, setup commands — checked in next to the code, Dockerfile-style:
image = "python:3.12-alpine"
net = true
cpus = 4
memory = 4096
[network]
allow_hosts = ["api.stripe.com", "pypi.org"]Unknown keys are rejected rather than silently ignored, so a typo fails at create time.
3. Pack a stateful VM into a single file. smolvm pack create freezes a machine into a self-contained .smolmachine file that rehydrates on any supported platform with zero dependencies and boots in under 200ms — no image pull at resume. Packed files push and pull through normal OCI registries, so your existing registry is suddenly a VM artifact store.
4. Branch a running machine. This is the primitive Firecracker never gave you for free: a live copy-on-write fork that resumes with the source's running processes, memory, and disk. Warm up one golden machine, park it at a branch point, then fan out:
smolvm machine start --name source --branchable
smolvm machine branch --from source --count 8 --name-prefix worker --parallel 8Each child wakes with its own identity in the environment and runs its episode. For parallel agent rollouts — eight candidate patches, eight sandboxes, one warmup — this is the shape you otherwise hand-build on top of Firecracker snapshots.
The project's own comparison table (project-reported, not an independent benchmark) puts smolvm under 200ms against Firecracker's sub-125ms, Kata's ~500ms, and QEMU's 15–30 seconds. Memory is elastic via virtio balloon, idle vCPU threads sleep in the hypervisor, and there is a Kubernetes path through a RuntimeClass — the same integration point Kata uses. GPU arrives via virtio-gpu/Venus, though it needs a libkrun built with GPU support plus host Vulkan drivers.
Head-to-head: where smolvm sits in the sandbox stack
| smolvm | Firecracker (self-operated) | Kata Containers | gVisor (Modal-style) | E2B (hosted) | Daytona | |
|---|---|---|---|---|---|---|
| Isolation | Hardware (libkrun microVM) | Hardware (microVM) | Hardware (lightweight VM per pod) | User-space kernel | Hardware (Firecracker) | Containers (+ optional Kata) |
| Cold start (reported) | Sub-second; packed boots under 200ms | Sub-125ms boot; ~150ms from snapshot | ~500ms | Sub-second to seconds | ~150ms | Sub-90ms claimed |
| Input artifact | Any OCI image, rootfs dir, or save archive | Kernel + rootfs you build | OCI via Kubernetes | OCI via platform | SDK-driven runtimes | OCI / workspaces |
| Packaging story | .smolmachine single file, registry push/pull | Snapshots + pools you build | K8s-native, no packing | None (platform-managed) | Templates + snapshots (managed) | Stateful workspaces |
| Host requirements | KVM on Linux; HVF on macOS; WHP on Windows | Linux + /dev/kvm | Linux + KVM, K8s RuntimeClass | KVM for best perf | None (SaaS) | Docker host |
| Dev-laptop parity | Yes — same file on macOS and Linux | No (Linux-only) | No | Via platform | Via cloud | Yes (local runner) |
| Per-invocation fan-out | Built-in branch (CoW fork) | You build it on snapshots | Pod-scale, not fork | Platform autoscale | API-driven scale | Workspace-per-task |
| Maturity | Young (v1.x, single org) | Battle-tested (AWS Lambda/Fargate lineage) | CNCF, production-proven | Production-proven | Production SaaS | Production, AGPL core |
Read the table carefully and the honest summary is: smolvm doesn't win on raw boot time or battle-testing. It wins on integration surface. Everything in the Firecracker column marked "you build" is a shipped subcommand in the smolvm column.
Where it fits a self-hosted PaaS sandbox roadmap
If you run agent sandboxes on machines you own — a Cluster API fleet, a bare-metal pool, even one beefy build box — three slots fit smolvm well:
Per-invocation burst fan-out. The branch primitive maps directly onto the parallel-agent pattern: one golden warmup, N copy-on-write children per task batch, teardown after the episode. Standing this up on raw Firecracker means a snapshot service, a pool manager, and identity injection; here it is one command with --count and --parallel.
Dev-inner-loop parity. The .smolmachine file runs on a developer's MacBook and on your Linux nodes unchanged. "Works on my machine" stops being a joke when the machine is the artifact. Firecracker can't offer this at all; Kata can't leave Kubernetes.
Kubernetes-adjacent, not Kubernetes-required. The RuntimeClass path means a CAPI fleet can schedule smolvm-backed pods through the same mechanism as Kata, while non-Kubernetes hosts — CI runners, edge boxes, agent worker pools — run the same CLI without a cluster.
The incumbents still win three slots: hardened multi-tenant production at scale, where Firecracker's minimal device model and AWS lineage remain the safest bet; standard Kubernetes pod isolation, where Kata's CNCF maturity and operator ecosystem lead; and "don't operate anything," where hosted E2B, Modal, and Daytona win by default. smolvm is worth evaluating against the second, a strong pick for the inner loop — and not a drop-in replacement for any of them today.
Evaluation checklist: six things to verify before you commit
- KVM is still required on Linux. This is the most common misconception: smolvm removes Firecracker's integration tax, not the hardware-virtualization requirement. Linux nodes need
/dev/kvm— bare metal or nested-virt-capable virtualization, exactly like Firecracker. Audit your node pool the same way. - Branch semantics under your workload. Fork a golden machine running your actual agent image (not alpine), verify memory/disk CoW behavior, and measure resume latency at your target fan-out. Watch for the young-project edges the issue tracker already shows: ready-probe stalls, exec-concurrency limits.
- Supply chain for packed files.
.smolmachineartifacts in your registry need the same treatment as container images: signing, provenance, and pull-through caching. Decide whetherpack pushtoghcr.iofits your artifact policy before developers invent their own. - Network policy enforcement. Smolfiles declare
allow_hosts, but verify the enforcement point (host-side filtering vs guest cooperation) against your threat model for untrusted generated code. Egress control is where sandbox escapes go to become incidents. - GPU needs. If your roadmap includes GPU-backed agent sandboxes, note that smolvm's virtio-gpu path needs a GPU-enabled libkrun build and host Vulkan drivers — real setup work, plus macOS/Windows gaps (no branch/checkpoint on Windows yet). Firecracker-plus-DRA or Kata may be further along for your accelerator mix.
- Project risk. smolvm is a v1.x project from a single organization with an active but short track record. Pin versions, vendor the binary, and keep your Firecracker/Kata path warm. Re-evaluate in six months; the velocity (hundreds of PRs, full test suite, rapid releases) cuts both ways.
One more practical note: searching "SmolVM" also surfaces CelestoAI/SmolVM, an unrelated Python SDK/CLI sandbox with Firecracker/QEMU/libkrun backends whose April 2026 Show HN drew modest attention. Same name, different project, different architecture. Check the repo URL before you curl | bash anything.
The real shift: sandboxes as artifacts, not infrastructure
Firecracker taught the industry that hardware isolation could boot in milliseconds. The projects that turned that into products — E2B, Fly, the whole sandbox wave — all built the same missing layer on top: images, snapshots, pools, SDKs. smolvm's contribution is making that layer portable: a sandbox you can pack into a file, check into a registry, branch into eight copies, and run on a laptop or a cluster node without changing anything. That doesn't dethrone Firecracker for the multi-tenant core. It does mean the next self-hosted agent sandbox might start as a file in a repo, not a platform project.
Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Star the repo on GitHub or deploy your first app today.



