Managoat is the hosted Fountain. Fountain is the open-source engine, and its name is on the CLI, the API, the SDK and this manual. Everything here applies to Managoat unless a page says it is for a self-hosted server.
E2B
E2B is one of the four
sandbox providers. E2B_API_KEY turns it on, and
SANDBOX_PROVIDER=e2b makes it the default for a new sandbox. One agent can
also pin it with sandbox_provider. A sandbox that already exists always
stays on the provider Fountain made it on.
E2B_API_KEY=e2b_... # enables the provider
E2B_TEMPLATE=fountain # a template built from images/e2b/ (see below)
# E2B_BASE_URL=https://api.e2b.app
# SANDBOX_PROVIDER=e2b # make it the instance default
At a glance
| Role | Sandbox provider. |
| Turned on by | E2B_API_KEY |
| Env vars | E2B_API_KEY, E2B_TEMPLATE, E2B_BASE_URL |
| Suspend | An explicit pause, with a snapshot of filesystem and memory. |
| Capabilities advertised | :suspend, :network_policy, :attach |
| Needs first | A template built from images/e2b/. The stock base has no agent CLIs. |
Template
The stock base template carries no agent CLI. Build the reference template
once for each account.
E2B_API_KEY=... scripts/sandbox-image/build-e2b.sh
The script runs e2b template create fountain against images/e2b/. Then it
creates one sandbox from the new template. It checks the shape that the
provision pipeline assumes, then it destroys the sandbox. E2B_TEMPLATE
selects a different template name.
e2b template create takes the name and rebuilds that template in place. So
the template id that an instance points at stays the same. Sandboxes that
already run keep the copy that they started from.
CI runs the same script. The Sandbox images workflow rebuilds the template
when images/e2b/ changes, once each week for the agent CLI versions, and on
request. It needs an E2B_API_KEY repository secret. That key must belong to
the account the instance uses. A template that another account builds is not
visible to the instance.
The image recreates the sandbox shape that the provision pipeline assumes. That is a
sprite user with passwordless sudo, /home/sprite, node, npm, bun, git and
the four agent CLIs. So no provision code exists for one provider alone.
How the contract maps
| Fountain operation | E2B mechanics |
|---|---|
| Create or adopt by name | E2B assigns the ids. The minted name rides in sandbox metadata, and a lookup filters on it server-side. A create race leaves a duplicate, and the reaper converges it. |
| Suspend and resume | Real calls. pause snapshots filesystem and memory, keeps them without a time limit, and costs storage alone. connect restores. The idle bound truly parks. |
| TTL | Each E2B sandbox that runs has one. A live command heartbeats it. Fountain creates a sandbox with autoPause: true. A heartbeat that arrives late then pauses the sandbox and keeps its state, and does not kill it. An operation that finds the sandbox auto-paused resumes it first. |
| Exec and streams | envd, the daemon in the sandbox, over Connect-RPC with the JSON codec. That is plain HTTPS, and not gRPC. |
| Reattach after a deploy | envd does not replay the output of a process you reconnect to. So a detachable command runs under a shim that journals, with tee to /tmp/fountain/<tag>.*. A reattach replays the journal from byte zero through a tail streamer, and reads the real exit code from the shim's exit file. |
| Network policy | Native default-deny. denyOut 0.0.0.0/0 plus the allowlist, and you can update it on a sandbox that runs. The provision-open-then-lock flow works unchanged. |
| Checkpoints | Not supported. E2B does not advertise :checkpoint. |
Operational notes
- Plans. An agent turn can take more than one hour. E2B's Hobby tier caps continuous runtime at 1h, so you need Pro.
- Reaper. Reconciliation lists both
runningandpausedsandboxes, filtered to metadata that Fountain stamped. It never touches another sandbox on the account. - Egress. The callback host,
PUBLIC_URL, must be reachable from inside the sandbox. Alimitedenvironment gets it through the same allowlist mechanics that Sprites uses.
Verify
Create a conversation on an agent pinned to e2b, and watch it reach its
first turn. A run that stops short of that is a failure to provision, and the
stage events name the step.