boxkite
Your cluster. Your data. No escapes.

Give your agent a sandbox, not your servers.

Your agent gets its own Kubernetes pod — no network access by default, sealed off from the rest of your infrastructure. Self-host it on your cluster, or start on the hosted API in minutes.

Free during the beta — no credit card. Self-hosting is free forever under the MIT license.

1 podper agent session
0network access by default
15 toolsbash, python_interpreter, file/process ops, ls/glob/grep — plus an opt-in 8-tool git set
~0.9smedian warm session-start latency (measured)
Bring your own cloud

Agent execution, on infrastructure you already control

No vendor lock-in

Stop routing agent code through a third-party sandbox API. Run the exact same execution layer on your own Kubernetes cluster — your data never has to leave your network.

Enterprise-grade isolation

Real Kubernetes pod isolation, not a shared container. If the agent hallucinates and runs rm -rf /, it destroys a temporary pod — not your host machine, not your cloud network.

Batteries included

Four native SDKs (Python, TypeScript, Go, Rust) and an MCP server, out of the box — a clean install path whether your stack is Python-first or not.

See the whole platform

Architecture, SDKs, and self-hosting — in one watch

Not a mockup — the real request path through the control-plane and SandboxManager into an isolated pod, the four native SDKs, and every self-hosting option. Try the exec path yourself in the playground below.

Handing an LLM a shell is handing it your infrastructure — unless that shell has nowhere else to go.

Why this exists

Agent frameworks are increasingly comfortable letting an LLM write and execute its own code. Running that in a subprocess on the same box as everything else isn't a security boundary — it's a hope. boxkite's answer is structural: every session gets its own Kubernetes pod, a fresh network namespace per executed command, a non-root user with every Linux capability dropped, and a read-only root filesystem.

Pod-per-session isolation isn't novel — projects like kubernetes-sigs/agent-sandboxalready do it well. What's been missing is the layer on top: a complete, already-hardened tool surface wired to that pod, framework-agnostic, that you hand to your agent today instead of building it yourself over the next few weeks.

Architecture

One request, four hardened layers

Click a layer to see what it actually does.

Your agent

Any framework, or plain HTTP/MCP — boxkite doesn't require a dependency on any of them. The adapters convert the same tool specs for whichever one you use.

Performance — measured, not marketing

Real numbers off the live API, not a spec sheet

boxkite isn't the fastest cold start on the market — microVM platforms win that on raw spin-up. What it is: a warm session in about nine-tenths of a second and sub-half-second in-sandbox ops, on infrastructure you own. Every figure below was measured against our own hosted API, and we publish the methodology.

Warm session start

~0.9s p50 / ~1.3s p95

p50 877 ms · p95 1289 ms · min 836 ms

POST /v1/sandboxes · n=10

In-sandbox exec

~0.4s

p50 419 ms · p95 509 ms

POST /exec · n=12

File operations

~0.4s

create, view, str_replace, grep

all ~0.4s p50 · n=6

Session destroy

~0.6s

p50 560 ms

session teardown · n=10

Per-tier memory budget

small1 GiB
medium2 GiB
large4 GiB

Enforced on the sidecar cgroup where agent code runs — a hard ceiling, not a best-effort request.

Measured against our hosted API on 2026-07-21; sample size shown per metric, client-side wall-clock around each REST call, cluster warm and image cached. Methodology: /blog/measuring-session-start-latency.

Drop-in tools

Wire a hardened sandbox into your agent in a few lines

create_sandbox_tool_specshands back 15 tools already bound to a live session — bash, a persistent Python interpreter, file and search ops, process control. They're framework-agnostic: call a handler directly, or convert the list for LangChain or OpenAI-style function calling. No LangChain dependency required.

agent_setup.py
from uuid import uuid4
from boxkite import SandboxManager
from boxkite.tools import create_sandbox_tool_specs

manager = SandboxManager()
session_id = str(uuid4())
await manager.create_session(organization_id=uuid4(), session_id=session_id)

specs = create_sandbox_tool_specs(sandbox_manager=manager, session_id=session_id)
# specs = [ToolSpec(name="bash_tool", ...), ToolSpec(name="file_create", ...), ...]
# Framework-agnostic: no LangChain/LangGraph dependency. Call spec.handler(**kwargs)
# directly, wire into CrewAI/AutoGen/a hand-rolled loop, or convert the list:
#   boxkite.tools.adapters.to_openai_functions(specs)   # stdlib, no extra dep
#   boxkite.tools.adapters.to_langchain_tools(specs)    # needs the [langchain] extra
Try it live

Run a real command in a real sandbox — no signup

A throwaway pod spins up just for you, times out on its own in a few minutes, and never touches anything but itself.

demo-sandbox

Spin up a real, throwaway sandbox and run a command in it — right from this page.

Isolation

Every session is structurally sealed off

One pod, two containers. Defense in depth — each control below is an independent boundary, so getting past one still leaves agent code trapped by the rest.

sandbox containersidecar container
RunsAgent-generated codeThe HTTP API + storage sync
UserNon-root (UID 1001), runAsNonRoot: trueRoot (needed for nsenter)
CapabilitiesAll dropped (capabilities.drop: [ALL])Only SYS_PTRACE/SYS_ADMIN — never inherited by agent code
FilesystemRead-only root filesystemRead-write (owns the shared volumes)
NetworkDenied by default — NetworkPolicy + a fresh network namespace per execOnly what storage sync needs
Priv. escalationallowPrivilegeEscalation: falseSame
  • Sidecar auth fails closed. Every route but /health requires an X-Sidecar-Auth-Token generated fresh per pod at creation time — never a static, repo-wide value. If the token isn't set, protected routes return 503 instead of running unauthenticated.
  • Per-exec network isolation is the real boundary, not NetworkPolicy alone. In Kubernetes mode, every /exec runs inside a freshly created, empty network namespace — no interfaces at all, so it structurally can't reach the network or the sidecar's own port.
  • Manager-to-sidecar traffic is encrypted,over TLS pinned per pod to a self-signed cert minted at creation — the auth token and every command cross the pod network verified against that one pod's cert and no other.

We publish the full threat model — every layer, its residual risk, and what's in and out of scope for security reports. Read the security page →

Compare

Self-hosted, not just self-branded

E2B, Modal, and Daytona run your agent's code on their infrastructure. boxkite runs on yours — that's the whole bet, so it's the axis this comparison is built around.

boxkiteE2B / Modal / Daytona
Self-hostableYes — your own clusterNo — hosted-first (Daytona's core is reportedly privatized)
Data stays in your infraNever leaves your clusterRuns on their infrastructure — see each vendor
Open sourceYes — MITNo
Vendor lock-inNone — you own the whole stackHosted dependency

See the full comparison →

Use cases

Built for agents that actually do things

The image ships with real tooling pre-installed, so an agent can get to work the moment its sandbox comes up — no runtime installs, no network required.

Data analysis

pandas, numpy, polars, matplotlib and scikit-learn are pre-installed — hand your agent a dataset and let it compute, plot, and hand results back.

Document processing

pandoc, LibreOffice, poppler, Tesseract OCR and the python-docx/pptx/pdf stack are baked in for agents that parse, convert, and generate documents.

Coding agents

The opt-in git tools plus file editing, grep, and a persistent Python interpreter let an agent clone a repo, change it, run the tests, and commit.

Long-running services

Start a dev server or watcher as a tracked background process and expose it through a signed preview URL — stream its output, send it input, stop it.

See everything that's pre-installed →

Quickstart

Two ways to run it

Point the CLI at the hosted control-plane to try it in minutes, or self-host the whole stack — same control-plane/ code either way.

Fastest — hosted API

terminal
pip install boxkite-sandbox  # ships the `boxkite` CLI

# signs up, mints an API key, and saves both — one command
boxkite signup --url https://your-control-plane.example.com

# create a sandbox and run something in it
boxkite session create --label demo
boxkite exec "python3 -c 'print(1 + 1)'"

Create a free account →

Self-host — docker compose up

A real cluster (or a local kind one) is only needed once you want the full pod isolation model above; compose mode is for kicking the tires.

1
Clone and configure.

Copy the env template and generate a sidecar auth secret — this is required, not optional, since every sidecar route but /health checks it.

2
Build and start.

Brings up the sandbox container, the sidecar HTTP API, and a local MinIO for S3-compatible storage.

3
Check it's healthy, then wire up an agent.

Hit /health, then exercise /exec and /file-create directly before wiring it into any agent framework — see the code sample above.

terminal
# 1. clone + configure
git clone https://github.com/EvAlssment/boxkite.git && cd boxkite
cp .env.example .env
echo "SIDECAR_AUTH_TOKEN=$(openssl rand -hex 32)" >> .env

# 2. build + start
docker compose -f deploy/docker-compose.yml up -d --build

# 3. check it's healthy
curl http://localhost:8080/health