Repository navigation
Integrations E2B
Experimental: this works and is tested, but may change and gets less hardening than the stable core.
E2B runs each sandbox as a Firecracker microVM on its nodes. With network.egressProxy ("bring your
own proxy"), E2B sends a sandbox's outbound TCP through a SOCKS5 proxy you run. The tunnelling happens on the host,
after E2B's allowOut and denyOut filtering. In the words of E2B's SDK, "code running there can neither see the
proxy nor route around it", and connections fail rather than go direct when the proxy can't be reached
(E2B SDK). Point it at the
egress observer and the run gets a signed record of every host its sandbox reached, made outside the
sandbox.
| E2B | Tracekit's egress observer | |
|---|---|---|
| What it does | Runs the agent's code in a microVM; filters its traffic, then opens each TCP connection through the proxy | Attributes each connection to a run, checks the host, relays the bytes, and reports per-minute totals to the signer |
| Where | E2B's nodes |
tracekit egress serve on an address E2B can reach |
| What a third party can check later | Nothing: it keeps no signed record |
effect.observed records in the run's signed bundle |
Where it works: E2B Cloud and BYOC deployments, for teams that have egressProxy enabled. Without it, E2B's API
refuses the sandbox ("Egress proxy (network.egressProxy) is not enabled for this team"). Deployments built from the
open-source e2b-dev/runtime reject it as unsupported. E2B's proxy client isn't
open source, so Tracekit is tested against E2B's API description (SOCKS5 with RFC 1929 credentials, a host name for a
flow allowOut matched by domain, the option of TLS), not against E2B itself.
Without egressProxy, E2B documents no other way to send a sandbox's traffic through your proxy. An HTTPS_PROXY set
in the sandbox's environment (envs) is up to the code in the sandbox, which the agent controls: it can ignore or unset
it, so its traffic can bypass the observer.
-
Run the observer on an address E2B's infrastructure can reach: E2B rejects a proxy address that resolves to a private or internal range. Off loopback the observer takes SOCKS5 only inside TLS, on its
httplistener:# egress.yaml http: listen: 0.0.0.0:1080 cert: tls/egress.pem # a certificate for egress.example.com key: tls/egress.key authenticators: [token] # bearer tokens for HTTP clients; E2B's connections carry run tokens token_file: egress-bearer signer: https://signer.internal:8443 # the observer's identity: TRACEKIT_SIGNER_TOKEN_FILE or _CERT/_KEY
In
signer.yaml, grant that identityobserve_effectand nothing else, and never give it to the agent (egress). -
Create each sandbox with its run's id and token as the SOCKS5 credentials, inside TLS. E2B's API takes
tlsinnetwork.egressProxy(API spec). The JS and Python SDKs send only the address, username and password, so create the sandbox through the API (POST https://api.e2b.app/sandboxes, headerX-API-Key):{ "templateID": "base", "network": { "egressProxy": { "address": "egress.example.com:1080", "username": "<run id>", "password": "<run token>", "tls": {"enabled": true} } } }The run id and token are
run.run_idandrun.run_tokenof a run registered with the Python SDK (Client().run(...)). Addtls.serverNameortls.caCertwhen the observer's certificate doesn't match its address or comes from a private CA. Withouttlsthe TLS handshake fails, and E2B fails closed: the sandbox has no network. -
Keep the E2B API key away from the agent. Whoever holds it can create a sandbox without the proxy, or change the proxy on a running sandbox (
PUT /sandboxes/{sandboxID}/network).
For a flow its allowOut matched by domain, E2B sends the host name. The observer resolves and checks it as it does
for CONNECT (public addresses only, no DNS-over-HTTPS endpoints, unless allow lists them), and the connection's TLS
server name must be that name. For any other flow E2B sends an address. The observer names that host by the
connection's TLS server name, and only when the name resolves to that address on the observer's host. Anything else is
closed before it reaches the host, and the observer says why on stderr.
Each minute, per run, host and port, the signer writes a signed record naming the observer's identity:
effect.observed {observer, kind: net, host, port, bytes_out, bytes_in, connections, first_ts, last_ts,
attribution: token}
A host none of the run's calls or the policy's explains covers is also a reconcile.unexplained_effect; an observer
that stops is a signed observer_lost gap (egress).
- Content: paths, headers and bodies. It doesn't intercept TLS.
- UDP: E2B tunnels TCP only. DNS and QUIC/HTTP3 leave the sandbox directly.
-
Plain HTTP and other non-TLS TCP: they reach only hosts and addresses
allowlists. - The sandbox: nothing about processes or files inside the microVM.
Limits lists each with what to do.
Generated from docs/ at v1.4.1. Edit the docs in the repository, not here.
Get started
- Quickstart: the v2 signer
- Quickstarts
- Quickstart: Claude Agent SDK
- Quickstart: a custom agent
- Quickstart: LangChain and LangGraph
- Quickstart: MCP client
- Quickstart: OpenAI Agents SDK
- Coding agents other than Claude Code
- tracekit doctor
- Walkthrough: Tracekit end to end
How it works
- How Tracekit works
- Overview
- The life of a tool call
- The evidence format
- Verification and assurance
- Witnesses and monitoring
- Policy
- Approvals
- Detection and containment
- Capture and completeness
- Custody
- Provenance and tracekit why
- Deployment and isolation
- Storage, durability and performance
- Integrations
- Security model
- Architecture
- tracekit why: architecture
Integrations
- Integrations
- Adapters
- OpenTelemetry
- Remote clients
- Kubernetes agent-sandbox
- agentgateway
- agentsh and Tracekit
- Browser Use
- Claude Agent SDK
- Claude Code's sandbox
- Codex's sandbox
- CrewAI
- Docker MCP Gateway
- E2B
- Falco
- Gemini CLI's sandbox
- Google ADK
- Haystack
- LangChain v1
- LiteLLM
- LlamaIndex
- MCP client
- microsandbox
- Microsoft Agent Framework
- OpenAI Agents SDK
- NVIDIA OpenShell
- Pydantic AI
- sandbox-runtime's proxy on its own
- Strands Agents
- Tetragon
- Vercel AI SDK
- Wassette
Policy and approvals
- Policy reference
- Approvals
- Findings
- Reading the model's reasoning
- Incidents and containment
- Webhooks
Deploy and operate
- Deploying the signer
- The signer as a container
- The signer on Kubernetes
- The compose stack
- Identity
- Tool executor
- MCP gateway
- LLM gateway
- Egress observation
- Witnesses
- Log monitor
- Record-key issuer
- Signer observability
- Viewer
- tracekit why: causal investigation and replay
- Migrating
- Platforms
Verify the evidence
- Reading a v2 verify report
- Evidence format v2
- Auditor guide
- Sample evidence bundle
- Signing
- What Tracekit guarantees
Security and privacy
- Threat model: the v2 signer
- Threat model: the v1 laptop signer
- HTTP security checklist
- Threat-model review packet
- Privacy
- Known limits and trade-offs
- What's stable
Compliance
- Compliance mapping
- EU AI Act
- ISO/IEC 42001
- NIST AI RMF and the Generative AI Profile
- OWASP Top 10 lists for LLM and agentic applications
Evaluation
Demos
- Demos
- Agent approvers within bounds
- Completeness and tamper evidence
- Detection and containment
- Network coverage: an egress observer
- Guardrails: allow, deny, or ask a person
- MCP tools, gated and recorded
- Prompt injection held by provenance
- Why: which input caused the action
Help