Skip to main content

Daytona vs E2B for Self-Hosted AI Sandboxes: The Helm Chart Doesn't Do What You Think

9 min readDora NodaDora Noda
Share
On this page

Every 2026 roundup of AI-agent code-execution sandboxes says the same thing: three contenders worth taking seriously — E2B on Firecracker microVMs, Modal on gVisor with GPU access, and Daytona on hardened containers — and only one of them, Daytona, gives you a real self-hosting path, because it ships Helm charts you can point at your own Kubernetes cluster. Modal is proprietary end to end, so it's out of the self-hosting conversation entirely: there's no self-host tier, no open-source runtime to fork, just an API you rent.

That leaves a two-way race, and the popular framing hands it to Daytona before it's even started. We read the Helm chart's own README to check. It doesn't hold up.

The chart deploys a runner, a proxy, and a snapshot manager into your AWS account. It does not deploy the thing that actually makes Daytona Daytona — the control plane, the API, the org and auth layer — which the chart's own architecture diagram shows staying on app.daytona.io permanently. Meanwhile, the fully independent, run-it-yourself Daytona codebase — the one that doesn't call home — carries a banner as of this writing: development moved to a private repo in June 2026, and the public version gets no further updates, fixes, or releases. Its self-hosting chart is a still-supported live product, but the fully independent stack behind it is now a frozen artifact.

E2B, less advertised as "the open one," turns out to be the more literal fit for that description: its infrastructure repo is genuinely Apache-2.0, control plane included, with complete Terraform automation for two clouds. Neither one is a helm install away from running on a Cluster API–managed Hetzner fleet with zero vendor dependency — but they fail that test in different ways, and the difference determines which one is worth bex's engineering time.

What "self-hosted" actually means for each platform​

Start with what each vendor's own documentation says it deploys, not what the marketing implies.

DaytonaE2B
LicenseNo OSI license on the main repo; Helm chart repo carries a custom "Other/NOASSERTION" licenseApache-2.0 on e2b-dev/infra, confirmed via GitHub
What self-hosting actually deploysRunner (DaemonSet), proxy, snapshot manager — a "Bring Your Own Compute" regionFull stack: API, orchestrator, control plane, Nomad/Consul cluster
Where the control plane livesAlways on Daytona Cloud (app.daytona.io) — the chart's own README states sandbox data stays in your account but "the Daytona control plane only sees control metadata"In your infrastructure; no vendor callback required
Independent full-stack repodaytonaio/daytona — public but frozen since June 2026 ("no longer maintained... core development has moved to a private codebase")e2b-dev/infra — actively pushed, no archival notice
Documented cloud targetsAWS/EKS (the BYOC chart's worked example; scripts exist for other clouds but the walkthrough is AWS-first)GCP and AWS, both with complete, working Terraform paths in self-host.md

The BYOC chart's own README is explicit about the tradeoff it's making: you get "lower latency access to sandboxes" and data residency for snapshot storage, in exchange for the control plane — auth, org management, the API surface your code actually talks to — staying vendor-hosted. That's a reasonable product for a team that wants EU data residency inside an otherwise-managed relationship with Daytona. It is not the same thing as "self-hosting Daytona," and treating it as such means bex would be building a dependency on Daytona Cloud's uptime and pricing into its own AI-agent sandbox story — the exact vendor coupling a self-hosted PaaS exists to remove.

E2B's repo, by contrast, doesn't have a hosted-control-plane escape hatch to fall back on. Self-hosting means standing up the whole thing: API, Nomad/Consul orchestration, and the Firecracker fleet. That's more work up front. It's also the only one of the two that actually matches the "fully open-source player" label the market keeps assigning to Daytona.

Standing each one up on a CAPI-managed Hetzner cluster​

Neither vendor documents Hetzner. Here's what each path concretely requires once you go looking.

Daytona's BYOC chart wants Kubernetes 1.19+ (EKS is the tested target), Helm 3.2+, a Daytona organization and API key, an S3-compatible bucket for snapshots, and IAM credentials with read/write access to it. Installation is a real helm install with a values file — genuinely the easiest afternoon of the two. But step one of the chart's own registration flow is a pre-install hook that calls the Daytona API to register the region and receive back a proxyApiKey. There is no offline mode. If app.daytona.io is unreachable, or Daytona changes API pricing or terms, your "self-hosted" sandbox layer inherits that risk on day one — before you've provisioned a single sandbox.

E2B's infra repo wants Packer and Terraform (pinned to 1.7.5), your own Cloudflare account and domain, and your own PostgreSQL instance — none of that is optional. For AWS specifically, the Terraform module provisions five EC2 node pools by role: Control (Nomad/Consul servers), API (ingress, proxy, otel, logs), Client (the Firecracker orchestrator nodes — m8i.4xlarge by default, chosen because it supports nested virtualization), Build (template builds), and ClickHouse (analytics). None of those node pools are Hetzner-flavored; the repo's Terraform providers are google and aws, full stop. Getting this onto a CAPI-managed Hetzner fleet means writing the Hetzner equivalent of that AWS module — new node-pool definitions, your own Firecracker-capable image build via Packer, and either running Nomad/Consul as their own control plane alongside Kubernetes, or carving out a dedicated node pool for it.

The one piece of good news for that adaptation: Firecracker's hard requirement is KVM, either bare metal or nested-virtualization-enabled cloud instances. Most hyperscaler VM tiers don't offer that by default — E2B's own AWS troubleshooting section warns to check instance-type support before you provision. Hetzner's dedicated (bare metal) line supports KVM natively, no nested-virt workaround required. That's not a Hetzner-specific favor from E2B — it's just a property of Firecracker needing a hypervisor-capable kernel — but it means the hardest infrastructure constraint in E2B's AWS module (nested virtualization) is a non-issue on Hetzner dedicated hardware, where it's a solved problem by default.

The tradeoff each makes against its own hosted product​

Neither platform's self-hosting story is free of a technical cost relative to using the vendor's cloud directly — this is the tradeoff a reasonable reader actually wants sized up, separate from the licensing question above.

Daytona (hardened containers)E2B (Firecracker microVMs)
Cold start~27–90ms~125–200ms cold boot; ~5–30ms with snapshot-restore
Isolation boundaryShared host kernel, hardened via seccomp/network policy (optional Kata/Sysbox for stronger isolation)Dedicated kernel per sandbox
GPU passthroughNoNo

Daytona's container-based approach wins on raw cold-start latency because it only needs to initialize namespaces and mount filesystems — no kernel to boot. E2B's Firecracker microVMs pay a real latency cost for a real isolation upgrade: each sandbox gets its own kernel, which is the stronger security boundary if your agents are executing arbitrary, untrusted, LLM-generated code — the actual threat model this whole category exists to handle. Neither self-hostable option supports GPU passthrough in the sandbox itself; that capability currently belongs to Modal's gVisor-based runtime, which is precisely why Modal isn't in this comparison at all — there's no self-host tier to evaluate.

For a platform whose sandboxes will run arbitrary agent-authored code rather than a single trusted workload, the isolation gap is the more consequential number of the two, even though the latency gap is the more visible one.

The verdict for bex: build vs adapt, decided now​

The instinct to reach for whichever SDK is easiest to bolt on first would point at Daytona — better documented Kubernetes story, faster cold starts, a Helm chart that installs in an afternoon. That instinct is wrong for a platform whose entire pitch is "no vendor calls the shots on your infrastructure." Wiring Daytona's BYOC chart into bex's roadmap doesn't remove a dependency, it adds one: a permanent, API-key-gated relationship with app.daytona.io sitting underneath a product built to argue against exactly that kind of coupling. And the fully independent alternative — the actual open Daytona stack — is a codebase Daytona itself stopped maintaining in June 2026.

E2B is the harder path and the correct one. Concretely, that means:

  • Fork the AWS Terraform module's node-pool structure (Control/API/Client/Build) as the template for a Hetzner equivalent, rather than starting from a blank Terraform config.
  • Target Hetzner dedicated (bare metal) instances for the Client node pool specifically — that's where Firecracker's KVM requirement is a non-issue rather than a quota request.
  • Budget for the parts E2B doesn't provide: a Postgres instance, a Cloudflare-managed domain, and either a standalone Nomad/Consul control plane or a dedicated node pool for it inside the existing CAPI-managed cluster.
  • Treat this as a Q3 2026 infrastructure project, not a Q3 2026 SDK integration — the honest scope is closer to "add a new orchestrator" than "add a dependency."

That's a real build. It's also the only one of the two paths that ends with bex's AI-agent sandboxes running on infrastructure bex actually owns.

Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own, no control plane that calls home to someone else's cloud. Star the repo on GitHub or deploy your first app today.

Sources​

Related articles

Run this on infrastructure you own

bex is the open-source, AI-native Render alternative — push a git repo and get a running HTTPS service on your own machines.

Get started with bex