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