Adapters are named <harness>_<substrate>. Each wraps a vendor CLI, by subprocess on the host or through the E2B SDK in a sandbox. The default kind is claude_cli.
The four runtimes
| Adapter | CLI | Where it runs | Containment | Interactive terminal | Interrupt / resume | MCP servers | Image inputs | Served preview | Read-only inspect |
|---|---|---|---|---|---|---|---|---|---|
| claude_cli | claude | Host, a git worktree under local_root | None beyond path checks. Runs with bypassPermissions; an accepted risk. |
yes | yes | yes | yes | no | yes |
| codex_cli | codex | Host, a git worktree under local_root | codex's own workspace-write sandbox |
yes | yes | yes | yes | no | yes |
| claude_e2b | claude | E2B, one hosted microVM per run | The sandbox. Each E2B runtime is its own E2B team. | yes* | yes | yes | yes | yes | yes |
| codex_e2b | codex | E2B, one hosted microVM per run | The sandbox. Each E2B runtime is its own E2B team. | yes* | yes | yes | yes | yes | yes |
* An E2B runtime serves an interactive terminal only when its template build passed the interactive test. The API serves a step page preview (a file an agent pushes to a page branch), and it works with every adapter.
Select a runtime for a process
A process names its runtime in the runtime field. The value is the slug of a runtime that an operator created in the dashboard.
runtime: team-e2b
A slug has lowercase letters, digits and dashes. It starts with a letter or a digit and has at most 63 characters. If the field is absent, the process uses the default runtime of the deployment.
The file selects a runtime and never creates one. Sync refuses a process that names a slug nobody created, and the message says which slug to create. The family of the runtime must match the agents: a Codex runtime runs Codex agents, and a Claude runtime runs Claude agents.
Register a runtime
An operator registers runtimes on the Runtimes page of the dashboard. Select Create runtime and fill in the form:
- Name is a label for people.
- Slug is the name that a process writes after
runtime:. You cannot change it later. - Type is Codex or Claude, signed in with an API key or with a subscription.
- Sandboxing isolation is a local CLI on the host or an E2B sandbox.
The type picks the CLI, and the isolation picks the host or E2B. Together they give one of the four runtimes in the table above. For example, a Claude type with E2B isolation runs as claude_e2b.
Then open the runtime and give it its credential: an API key, a token, or a device login for a subscription. The runtime holds the agent credential. A process that names a runtime takes the vendor key from that runtime alone. A project secret of the same name is not read. An E2B runtime also needs the key of its E2B team and a template build from that team.
No page shows a stored value again. A value leaves the store once, into a run at the start. A runtime that holds no credential stops the lanes that name it, and their Runtime row shows Cannot run. It does not block the activation of the project. To remove a runtime, use Delete runtime on its page.
Allowlists
An operator sets two lists in the project settings. The Permits section of the project configuration page edits both.
runtime_allowlist- An E2B runtime sends the code of the repository to E2B. A project runs on one only when this list names its slug. Host runtimes need no entry.
egress_allowlist- Hosts that E2B runs may reach, in addition to GitHub, the model API and the MCP servers of the run. An example is a package registry such as
registry.npmjs.org. Write the host only, with no scheme and no path.
Set the project settings shows how to set both lists. Factorial refuses a malformed entry. It does not ignore it.
Host runtimes
A host runtime runs the agent on the machine of the worker. Each run gets a git worktree under the local_root of the adapter, and the adapter refuses any path that leaves that root.
claude_cliruns withbypassPermissions. This is an accepted risk. Use an E2B runtime when you need containment.codex_clidoes not run in the container. Its sandbox does not start in Docker. The container refuses to start if you set it as the runtime.