Secure code execution for AI agents

Run untrusted code,
without the risk.

Your LLM writes the code. We run it inside fully isolated, ephemeral containers — no network, hard resource limits, instant cleanup — behind one clean API.

network = noneread-only rootfscgroup limitsCapDrop ALLno-new-privilegesephemeral containersPythonNode.jsGoinstant cleanuprate limitednon-rootnetwork = noneread-only rootfscgroup limitsCapDrop ALLno-new-privilegesephemeral containersPythonNode.jsGoinstant cleanuprate limitednon-root

How it works

Three steps from prompt to safe output

A clean request in, a structured result out — with an airtight isolation boundary in between.

01

Submit

Your agent POSTs code and a language to the orchestrator. It authenticates, rate-limits, validates, and clamps every resource limit server-side.

02

Isolate

The runner spins up a throwaway container with no network, a read-only rootfs, dropped capabilities, and hard cgroup limits on memory, CPU, and processes.

03

Reap

Output and telemetry are captured, the container is force-removed, and a reaper guarantees nothing leaks — every single run, no exceptions.

Defense in depth

Six layers between untrusted code and your host

Security isn't one switch. Every job is wrapped in independent, overlapping controls.

01

Network boundary

Only the orchestrator is public. The runner is private; every container runs with network = none.

02

Kernel isolation

Linux namespaces isolate PID, mount, IPC, and network. cgroups bound every resource per job.

03

Capability reduction

CapDrop ALL, no-new-privileges, a non-root user, and a read-only root filesystem.

04

Resource bounding

Server-side hard caps on memory, CPU, pids, and wall-clock time clamp every request.

05

Access control

API-key auth, per-client rate limiting, restricted CORS, and strict payload size limits.

06

No persistence

A tmpfs-only workspace. The container and all of its state are force-removed after each run.

Developer experience

One request. Full execution telemetry.

No SDK lock-in. Send code, get stdout, stderr, exit code, duration, and peak memory back.

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

print([fib(i) for i in range(10)])
response · 213ms · 1.3 MB
{
  "stdout": "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]",
  "exit_code": 0,
  "status": "completed",
  "duration_ms": 213,
  "timed_out": false
}

Give your agent a safe place to run.

Spin up the playground, or wire the API into your pipeline in a single request.