An isolated computer for every session

Each agent works on its own cloud machine: your repos cloned in, credentials scoped below any developer, and nothing left behind at teardown. Give it exactly the tools and access the job needs, and no more.

Install on GitHub
Documentation
01

A fresh machine for every session

Every session starts in its own Linux container with the repos already cloned and gh authenticated, and the container is destroyed when the session ends. Size it up to 16 vCPU, 64 GiB of memory, and 24 hours when the job needs it.

Sandboxsession #314
bootisolated container · 1 vCPU · 4 GiB
clonesplitshift-web, splitshift-api · gh authenticated
run158 steps · 4m02s · PR #314 opened
teardownfilesystem destroyed · credentials revoked
Nothing this session installed, wrote, or broke reaches the next one

One sandbox per session, destroyed at the end

02

Agents can open PRs, not rewrite history

Agents never hold a developer's identity. They act through the Ellipsis GitHub App with the repos and permissions you granted at install, and repo administration is not one of them. Your branch protections apply with no bypass, and an agent cannot edit protections, settings, or collaborators, no matter what its prompt says.

agent sandbox · splitshift-apiGitHub App token
$ git push --force origin main
remote: error: GH006: Protected branch update failed
! [remote rejected] main -> main (protected branch hook declined)
$ gh pr create --fill
https://github.com/splitshift-hq/splitshift-api/pull/1842
No admin permissions, so an agent can never change the rules it works under

Branch protections hold, with no bypass for agents

03

Hand agents exactly the access they need

Sandbox secrets inject credentials you mint, so you choose the blast radius: give a debugging agent read-only AWS keys and it can tail production logs but never touch a resource. Values are stored write-only. Nothing lands in the config file, and nothing can be read back out.

agents/oncall-assistant.yamlread-only IAM user
sandbox:  variables:    - name: AWS_ACCESS_KEY_ID    - name: AWS_SECRET_ACCESS_KEY
$ aws logs tail /aws/lambda/trade-engine --since 1h
2026-07-03T09:14:22 ERROR TradeExpiryWorker: lock not released
$ aws rds delete-db-instance --db-instance-identifier prod-db
An error occurred (AccessDenied) when calling the DeleteDBInstance operation

Write-only secrets, injected only where named

04

Agents only get the access you grant

Each sandbox gets a GitHub token narrowed to the permissions and repositories in the agent's config, enforced by GitHub when the token is minted. Anything not granted, the agent cannot reach, no matter what its prompt says.

Tool callsmerge-referee
Bash
pytest -k auth · passed
Allowed
Edit
tests/test_auth.py
Allowed
gh pr merge
GH_TOKEN is read-only
Blocked
Grep
"flaky" · 3 matches
Allowed
Read
tests/test_auth.py
Allowed

A per-session token, narrowed in YAML

05

Bake your environment into the image

A setup script runs once at image build, after your repos are checked out, and the result is snapshotted. Dependency installs happen on the first session; every session after boots the warm image. Per-session lifecycle hooks cover whatever should not be cached.

agents/issue-to-pr.yamlruns at image build
sandbox:  image:    setup: |      poetry install      pnpm install --frozen-lockfile
first session · builds the image3m40s
every session after · boots the snapshot8s

Setup runs once, every session after boots warm

What every sandbox comes with

The full environment, from the tooling in the image to the credentials that die at teardown.

Per-session isolation

Every session gets its own Linux machine, destroyed when the session ends, so nothing an agent installs or breaks leaks into the next one.

Repositories pre-cloned

Repos are checked out before the agent starts, with gh already authenticated against them.

Base tooling

Python 3.13, Node.js 22 with npm, git, the GitHub CLI, curl, and a C/C++ toolchain in every image.

One-hour GitHub token

Minted for that sandbox alone and expiring in one hour, which is also why a session never outlives its credential.

Read-only by construction

A read_only permission map mints a token that can read contents, issues, metadata, and pull requests, and write nothing.

Repository scoping

List repositories in the config and the token reaches exactly those names; the clone itself uses a separate credential that never enters the sandbox.

Write-only secrets

Stored values inject only into agents that name them and are never readable back through the dashboard, API, or CLI.

No provider keys in the box

Model calls route through Ellipsis with a per-session key; a real provider key never enters the sandbox.

Compute sizing

1 vCPU and 4 GiB by default, sized per agent in YAML up to 16 vCPU and 64 GB of memory.

Cached images

Built per repository set, commit, and image definition; a new commit re-runs setup on the latest image, so installs cover only what changed.

Lifecycle hooks

post_start and post_clone run on every session and are never cached; a hook that exits non-zero fails the session loudly.

Browser IDE and ports

Open a live sandbox in a browser IDE or preview any TCP port, gated on org membership. Lock it per agent with ellipsis.ide false.

Frequently asked questions

Your repositories, cloned and checked out with gh already authenticated; base tooling (Python 3.13, Node.js 22, git, the GitHub CLI, curl, a C/C++ toolchain); whatever your image definition and hooks added; and scoped credentials: a one-hour GitHub token minted for that sandbox alone plus the environment variables the config names.

No. Each session runs on its own machine with its own GitHub token, and no session shares a token with another. The token is narrowed to the permissions and repositories the config grants, enforced by GitHub at the mint, and everything is revoked or expires when the sandbox is torn down.

Three fields with different lifetimes: image.dockerfile_append adds RUN instructions to the base image for toolchain installs, image.setup runs after repositories are checked out and its results are captured in the cached image, and hooks (post_start, post_clone) run on every session for anything that should not be cached, like authenticating a CLI.

No. The image is cached per repository set, commit, and image definition. A session at a commit that already has an image starts with everything in place; a session at a new commit starts from the most recent image and re-runs setup on top, so package managers install only what changed.

The default is 1 vCPU, 4096 MiB of memory, and a one-hour timeout. Per agent, environment.compute sets cpu from 0.125 to 16 vCPU, memory from 512 MB to 64 GB, and timeout from 60 seconds up to the one-hour maximum, which matches the GitHub token lifetime.

Store the value once with agent variable set or the dashboard, then name it under environment.variables in the config. Only agents that name a secret receive it, stored values are write-only and never readable back out, and injected values die with the sandbox.

Yes. Open a live session in a browser IDE showing the same working tree the agent is editing, with a terminal, and preview any TCP port a dev server listens on. Access is gated on org membership, so links are safe to share internally, and ellipsis.ide: false locks a sensitive agent shut.

Explore the platform