π₯ Firecracker microVM sandbox toolkit
Create, manage, and connect to isolated Firecracker microVMs from the command line. Boot a sandboxed VM in milliseconds, run commands, transfer files β no SSH required.
- β‘ Millisecond boot β Firecracker microVMs start in < 200ms
- π Security isolation β jailer, seccomp, cgroups, and per-VM network namespaces
- π₯οΈ Interactive shell β WebSocket PTY with full terminal support
- π File transfer β upload and download without SSH
- π³ Docker images β build rootfs from any OCI image with
--from-image - π Command execution β run commands with streaming output, env injection, and sudo
- π§© Multiple runtimes β
base,node22,python3.13 - πΈ VM snapshots β save and restore VM state
- π JSON output β
--jsonflag for scripting and automation
- Linux (x86_64 or aarch64) with KVM support
- Bun >= 1.2
- Go >= 1.22 (to build the in-VM agent)
- Root/sudo access (required for TAP device networking and jailer)
squashfs-tools(for rootfs conversion during install)
curl -fsSL https://vmsan.dev/install | bashUninstall
curl -fsSL https://vmsan.dev/install | bash -s -- --uninstallThis downloads and installs into ~/.vmsan/:
- Firecracker + Jailer (latest release)
- Linux kernel (vmlinux 6.1)
- Ubuntu 24.04 rootfs (converted from squashfs to ext4)
# β¨ Auto-detect
npx nypm install vmsan
# npm
npm install vmsan
# yarn
yarn add vmsan
# pnpm
pnpm add vmsan
# bun
bun install vmsan
# deno
deno install npm:vmsancd agent
make install
cd ..bun linkThis makes the vmsan command available system-wide.
# Create and start a VM
vmsan create --runtime node22 --memory 512 --cpus 2
# Create a VM from a Docker image
vmsan create --from-image node:22-alpine
# List all VMs
vmsan list
# Execute a command inside a VM
vmsan exec <vm-id> ls -la
# Interactive exec with PTY
vmsan exec -i <vm-id> bash
# Connect to a running VM shell
vmsan connect <vm-id>
# Upload a file to a VM
vmsan upload <vm-id> ./local-file.txt /remote/path/file.txt
# Download a file from a VM
vmsan download <vm-id> /remote/path/file.txt ./local-file.txt
# Stop a VM
vmsan stop <vm-id>
# Remove a VM
vmsan remove <vm-id>| Flag | Description |
|---|---|
--json |
Output structured JSON |
--verbose |
Show detailed debug output |
| Command | Alias | Description |
|---|---|---|
create |
Create and start a new microVM | |
list |
ls |
List all VMs |
start |
Start a stopped VM | |
stop |
Stop a running VM | |
remove |
rm |
Remove a VM |
exec |
Execute a command inside a running VM | |
connect |
Open an interactive shell to a VM | |
upload |
Upload files to a VM | |
download |
Download files from a VM | |
network |
Update network policy on a running VM |
# Build
bun run build
# Link local build
ln -sf "$(pwd)/dist/bin/cli.mjs" ~/.vmsan/bin/vmsan
# Dev mode (watch)
bun run dev
# Run tests
bun run test
# Type check
bun run typecheck
# Lint & format
bun run lint
bun run fmtbin/ CLI entry point
src/
commands/ CLI subcommands
services/ Firecracker client, agent client, VM service
lib/ Utilities (jailer, networking, shell, logging)
errors/ Typed error system
generated/ Firecracker API type definitions
agent/ Go agent that runs inside the VM
docs/ Documentation site (vmsan.dev)
- vmsan uses Firecracker to create lightweight microVMs with a jailer for security isolation
- Each VM gets a TAP network device with its own
/30subnet (172.16.{slot}.0/30) - A Go-based agent runs inside the VM, exposing an HTTP API for command execution, file operations, and shell access
- The CLI communicates with the agent over the host-guest network
State is persisted in ~/.vmsan/:
~/.vmsan/
vms/ VM state files (JSON)
jailer/ Chroot directories
bin/ Agent binary
kernels/ VM kernel images
rootfs/ Base root filesystems
registry/ Docker image rootfs cache
snapshots/ VM snapshots
| vmsan | Docker | gVisor | Kata Containers | Vagrant | |
|---|---|---|---|---|---|
| Isolation level | β Hardware (KVM) | β Shared kernel | β Hardware (QEMU/CH) | β Hardware (VBox/VMware) | |
| Boot time | β ~125ms | β ~50ms | β ~5ms | β 30-60s | |
| Setup complexity | β One command | β Low | β High | ||
| Security model | β Jailer + seccomp + cgroups + dedicated kernel | β Full VM + nested containers | β Full VM | ||
| Network isolation | β Built-in policies (allow/deny/custom) | β Manual (iptables) | β Manual | ||
| Docker image support | β
--from-image |
β Native | β Via runsc | β Via containerd | β |
| Interactive shell | β WebSocket PTY | β exec | β exec | β exec | β SSH |
| File transfer | β Built-in upload/download | β cp | β cp | β cp | |
| JSON output | β All commands | β | β | ||
| Memory overhead | β ~5 MiB per VM | β ~1 MiB | β ~30 MiB+ | β 512 MiB+ | |
| Best for | π AI sandboxing, untrusted code, multi-tenant | General workloads | K8s hardening | K8s compliance | Dev environments |
Why vmsan? Docker shares the host kernel β a container escape means game over. gVisor intercepts syscalls in user-space, reducing attack surface but not eliminating it. Kata Containers provides real VM isolation but requires complex orchestration (containerd, shimv2, K8s). Vagrant boots full VMs that take 30+ seconds and hundreds of MBs.
vmsan gives you hardware-level isolation with Firecracker's minimal attack surface (< 50k lines of code), boots in milliseconds, and requires zero configuration β install and go.
Published under the APACHE-2.0 license.
Made by @angelorc and community π
π€ auto updated with automd
