Firecracker microVM leases

Spoond

Fast, isolated, ephemeral compute for people and agents.

Spoond is a lease API in front of Firecracker microVMs run by E2B's orchestrator. Ask for a sandbox, run work in it, release it. Sandboxes start as memory-snapshot restores, so starts are warm, and fork, pause/resume and checkpoint are native. On top of that: an SSH gateway, an HTTP proxy, an LLM gateway, an MCP server, a Forgejo Actions runner and a live dashboard, all in one Go binary.

New in 3.10 Spoond resumes the leases it paused once there is room again

A sandbox in three lines

Lease one over HTTP, run a command over SSH, hand it back. Or skip the API entirely: ssh new@sandbox.example.com creates a persistent dev sandbox and drops you into tmux.

# lease a sandbox for ten minutes
$ curl -s -X POST https://sandbox.example.com/api/leases \
    -H "Authorization: Bearer $TOKEN" \
    -d '{"image":"dev-base","size":"medium","ttl":600}'
# → {"id":"…","address":"10.11.0.7","expires_at":"…"}

$ ssh <id>@sandbox.example.com "uname -a"   # run something
$ ssh ctl@sandbox.example.com "rm <id>"    # release it

New in 3.0

Fair shares

One rule replaces guaranteed and burst classes, preemption, holds and per-owner caps. Every owner, person or agent, gets an equal slice of the box and may borrow past it while there's room. When a request doesn't fit, Spoond takes room back from whoever is furthest over their slice. Nobody has to set a quota, and nobody can crowd out everyone else.

  • honey 1.8× biggest borrower: its least recently used unpinned lease is paused
  • ci 0.9×
  • alice 0.6×
  • bob 0.25× asks for a lease that doesn't fit, and gets the room
Four owners, so each slice is a quarter of the box. bob is well inside its slice and honey is furthest over, so the room comes from honey. Snapshot disk works the same way. An illustration, not a live host.
  1. An equal, floating slice

    With N active owners, each gets 1/N of memory and of snapshot disk. An owner counts while it holds a running or paused lease: its first lease shrinks every slice, and its last one gives its slice back. GET /api/usage shows yours, with 7 days of history.

  2. Take back from the biggest borrower

    For memory, the owner furthest over their slice loses their least recently used unpinned lease to a pause. For disk, their oldest unpinned paused lease is deleted. A paused lease resumes on its next work call.

  3. Pins and one clock

    A pinned lease is never paused or deleted before its own expiry. Every paused lease, whatever paused it, is released 30 days after its pause date, with a warning a day before.

  4. Two answers, one shape

    A shortage is 503 capacity_wait with Retry-After: wait and try again. When nothing can be taken back, because everything is pinned or you are the biggest borrower, it's 429 box_full.

Moving a client from 2.9? Read Upgrading to 3.0.

How it fits together

Spoond owns leases, identity and every way in. A patch-queue fork of E2B's orchestrator owns the microVMs.

Spoond

one Go binary

  • lease API :8890
  • HTTP proxy, LLM gateway :8891
  • SSH gateway + ctl :2222
  • dashboard :8893
  • MCP server, Actions runner
  • SQLite: leases, catalog

e2b-orchestrator

fork of e2b-dev/runtime

  • Firecracker microVM lifecycle
  • memory snapshots (UFFD)
  • NBD rootfs, netns per sandbox
  • egress firewall
  • envd in every guest :49983

Images are one Dockerfile per capability, built into E2B templates with spoond images build.

Watching it run

spoond dash is a read-only, live view of the host: capacity, host meters, throughput, every lease and what holds it, the images in order of use, the systemd units, all-time records and the newest lease events, with a notifications panel when something on the host needs a person. It counts the leases taken back for fair shares and shows how much snapshot disk is reserved and usable. A long image catalog folds into a link to its own live page. spoond top draws the same grid in a terminal, and on a private network the web dashboard can go without a login.

The Spoond 3.9.1 dashboard: 8 of 100 leases running and none taken back, host CPU, I/O stall, memory, hugepage, snapshot disk and root disk meters with vCPU and memory allocated, five-minute throughput sparklines, a table of live leases with each one's size, state and network policy, held by agent worker pools, the 14 images sorted by use with live and lifetime counts and six more folded into a link, eight active services, a records panel with the busiest moment of 15 leases, the longest run, a fastest start of 85 ms and 864 leases over 1.3 thousand hours in all, a refusals and failures line and recent lease events.
The dashboard on a live host, refreshing every two seconds.

What you get

Recent releases

  1. v3.10

    Give-back

    A lease spoond paused to protect itself, for a fair-share take-back or the memory floor, now comes back by itself once the host has room, longest-paused first and never at another lease's expense. The Forgejo Actions runner waits out a box_full refusal instead of failing the job. No breaking changes.

  2. v3.9

    Self-protection

    Below a free-memory floor, spoond pauses one lease of the owner furthest over their share instead of letting a VM crash, and the lease resumes on its next use. Fair shares count active owners only, and a box_full refusal lists the caller's own running leases. 3.9.1 counts warm-pool VMs toward the memory cap, sheds idle pool VMs before pausing anyone's lease, and answers a host out of memory with a retryable 503 instead of a 500. No breaking changes.

  3. v3.8

    Lease history

    Every ended lease is kept in a durable history, and the dashboard gains a panel of all-time records. The images panel sorts by use and folds a long catalog into a link to a full images page. elixir-base moves to Elixir 1.19 and OTP 28 with PostgreSQL 17 running in the guest. 3.8.1 stops admission from lending out memory a running VM handed back and may need again, which could crash it on a full host. No breaking changes.

  4. v3.7

    Self-description

    GET /api/capabilities describes everything a host offers. A released lease's event names its peak memory, CI jobs show up on the dashboard as jobs, and the old /api/sandboxes path and keyless LLM access, both going in 4.0, answer with deprecation headers. /readyz watches the root disk as well (3.7.1), and image builds clean up their cache and local copies so they no longer fill it (3.7.2). No breaking changes.

  5. v3.6

    Secrets from files

    Any secret setting can name a 0600 file instead of holding its value in the environment, and the size hint keeps a lease's vCPUs, with a memory-only hint beside it. 3.6.1 fixes file writes into /tmp on Arch-based images. No breaking changes.

  6. v3.5

    Measured memory

    Each running lease reports its VM's current and peak memory, and a size hint names the smallest preset that would hold its peak with headroom. Owners see their measured memory in /api/usage. The backend checks every setting's type at startup and refuses to start on a bad value, naming each one. No breaking changes.

  7. v3.4

    Config at a glance

    spoond config show lists a unit's settings with their source, secrets masked, and flags any the running backend doesn't have yet, so a change waiting for a restart stands out. Image builds prune old Docker build cache.

  8. v3.3

    One authorization model

    Users and admin users, two read-only service tokens and the host's break-glass token. Admin users reach the admin routes with their own token, users mint named tokens that can expire and be revoked, and root on the host can mint a short-lived token for any user during a maintenance window.

  9. v3.2

    Shared snapshots and saturation

    New work waits while the host's CPU or I/O is saturated, without holding running leases. An owner can grant a secret-free named snapshot to another user, a create that will expire says so, and the dashboard shows each lease's size.

  10. v3.1

    Sizes and usage

    A create chooses its lease's size by preset or by vCPU and memory, starting warm where an image has a build for that size and booting cold in about a second otherwise. Clone, fork, restore and recovery now charge the size the VM really runs. Owners see their lease counts, waiting creates, recent refusals and 7 days of usage history. No breaking changes.

  11. v3.0

    Fair shares

    Every owner gets an equal, floating slice of memory and snapshot disk, and room comes back from the biggest borrower. Pins replace holds, one 30-day clock releases every paused lease, and every capacity refusal is 503 capacity_wait or 429 box_full. Classes, preemption and per-owner caps are gone; the Go module path is now /v3. Upgrading from 2.9.

  12. v2.9

    Resume on use

    A suspended lease comes back on its holder's next call, whatever suspended it, and a resume that can't happen yet says when to retry instead of losing the lease. CI jobs wait for room on a full host, deleting a user cleans up everything they held, and a lease journal records every lease's life. 2.9.3 lets a dashboard on a private network go without a login.

  13. v2.8

    No loose ends

    A lost lease's guest is always stopped, sandboxes nothing claims are swept away, and a late checkpoint or restore can no longer bring a released lease back. Drain and undrain recover on their own, and guests resolve through both LAN resolvers.

  14. v2.7

    Named snapshots

    Save a lease as a named, versioned snapshot and start new leases from it. Snapshot writes are paced, a guest whose root disk dies is recovered, and built-in defaults are now generic settings.

  15. v2.6

    Background jobs

    Detached exec jobs that survive a restart or suspend, an on-demand crash test for recovery suites, a GC for orphaned builds, and hot-reloaded TLS certificates.

  16. v2.5

    Waiting and idle reclamation

    Creates can wait for room in a fair-share queue instead of failing on a full host, and persistent leases can suspend themselves when idle and resume on the next call.

  17. v2.4

    Capacity on shared hosts

    Memory quotas per user, guaranteed and burst leases, and preemption of burst leases by suspend, with an automatic resume queue. BSD-3-Clause from this release.

  18. v2.3

    Checkpoints on the lease's terms

    Opt-in periodic checkpoints, kept checkpoints with in-place restore, and cold restarts that keep the lease id.

  19. v2.2

    Driving work inside a lease

    Lease files, guest port dial, secrets as files, the event stream and generations; /readyz and webhook notifications.

  20. v2.1

    A plain microVM utility

    Agent workflow moved to the separate Honey project; the character-grid dashboard and lease holders arrived.

  21. v2.0

    The E2B substrate

    Warm memory-snapshot starts, native fork and checkpoint, SQLite state and a template-based image pipeline.

Read more