Skip to content

2026.10.12 Release v0.7.3 ​

32 commits from 15 contributors.

⭐ Highlights ​

  • No more random connection resets on port-mapped services. Fixed several long-standing port-mapping bugs: intermittent 502s when accessing a sandbox from another node, idle connections reset after 60 s, a reused port resetting its next new connection, and two sandboxes on the same port breaking each other.
  • Cross-node restore reads directly from S3. Restoring a sandbox no longer copies the whole disk from S3 to the node first; the sandbox reads the data it needs from the snapshot as it runs, so a restore comes up faster and the node no longer needs space for a full disk copy.
  • S3lvol hot upgrade: I/O pause drops from ~40 s to ~8 s, with volumes staying attached.
  • Fixed rare block-I/O data corruption and hangs on short I/O.

🎯 Major Features ​

MCP support ​

Sandboxes can now run an MCP (Model Context Protocol) gateway, matching the E2B SDK's mcp create option:

  • Pass mcp when creating a sandbox; once it is running, the Python / Node / Go SDKs start mcp-gateway inside it and return the MCP URL and token. The sandbox is destroyed if the gateway fails to start.
  • The SDKs look for a template aliased mcp-gateway, falling back to CUBE_TEMPLATE_ID. The default sandbox image has no gateway; build one from the reference implementation under examples/mcp-gateway, and see the MCP Gateway Guide for the setup.

✨ Enhancements ​

Templates & Storage ​

  • S3lvol hot upgrade: the I/O pause during an upgrade drops from about 40 s to about 8 s, and volumes stay attached throughout (#1822).
  • Cross-node restore no longer copies the whole disk to the node: a restored sandbox reads its disk from the S3 snapshot on demand, and an explicit decouple still makes a standalone copy. Deleting a source snapshot now waits until restored volumes still reading it are gone (#1898).
  • Creating a template from an image now fails in 0.08 s when target nodes are offline or missing, instead of after minutes of pulling (#1829).
  • S3 volumes can authenticate with the node's instance role instead of a long-lived access key: set CREDENTIALS=instance_role and drop both keys. This applies to manual installs whose endpoint is an AWS one, and the role must be attached to every CubeMaster and Cubelet host, not just the node running the sandbox. See the S3 Volume Guide (#1751).

Lifecycle & Control Plane ​

  • Pause is faster: the VM teardown at the end of a pause now runs in the background. A single pause is ~41% faster (150 ms → 88 ms for a 2 GiB sandbox), ~20% faster under concurrency 50; resume is unchanged (#1731).

Deployment & Runtime ​

  • PVM host / guest kernel updated from 6.6.69 to 6.6.117 (#1852).

Web UI / CubeOps / Other ​

  • Template cards in the Web UI now show the template alias (#1876).
  • New blog posts: global hiring, and an enterprise secure execution plane for OpenClaw / DSH (#1884).

🐛 Bug Fixes ​

Lifecycle & Sandbox ​

  • Fixed Info omitting metadata (labels, template, specs, volume mounts) for paused sandboxes, broken since v0.7.0; callers identifying sandboxes by label could no longer resume them (#1861).
  • Fixed clones failing with no more resource right after a snapshot was created, while the node heartbeat had not caught up yet (#1909).
  • Fixed the template list hanging once the cluster had many templates (#1899); the list API and cubemastercli tpl ls also gained paging (limit / offset).
  • Fixed network tap, IP, and volumes being reclaimed while the sandbox process may still be running, which could break a live sandbox's network. A cleanup that keeps failing now alerts once and retries at a low rate; the new cubecli diag tap-holders / cubecli diag reclaim commands help find and clear a stuck holder (#1810).
  • Fixed rare block-I/O data corruption or hangs when an I/O returned short (#1825).
  • Fixed the lifecycle service hanging on shutdown while waiting on an event subscriber (#1825).
  • Fixed create-from-snapshot rejecting re-sent volumeMounts with "must have exactly one declaration"; the official E2B SDK re-sends them on every create (#1894).

Networking & Security ​

  • Fixed two sandboxes listening on the same port and talking to the same remote peer overwriting each other's port-mapping session, breaking one of them (#1915).
  • Fixed expired port-mapping sessions occasionally surviving cleanup and inflating session counts (#1914).
  • Fixed a leftover session on a port resetting the next new connection on that port; the new connection now replaces it (#1919).
  • Fixed the port-mapping TCP state machine stuck in SYN_RECV: established connections idle for 60 s were deleted and the next packet got a TCP RST; the state machine now advances on packets in both directions (#1918).
  • Fixed IPv6 never working in sandboxes on arm64: the kernel shipped it as a module, but the guest kernel is a single image without modules. PSI is now enabled too, matching x86_64; Android (redroid) sandboxes need both, and this also removes intermittent port-binding failures (#1879).

Deployment & Upgrade ​

  • Fixed Cubelet logging one error per sandbox on every metrics scrape on cgroup v2 hosts; the unused legacy containerd cgroup monitor is off by default now, and per-sandbox resource metrics are unaffected (#1869).
  • Fixed cubemastercli accumulating zombie processes (6500+ observed in one pod over three weeks); a one-time pod restart clears existing zombies (#1860).

Other ​

  • Fixed creating a sandbox from a deleted snapshot returning HTTP 500, which SDKs kept retrying forever; it now returns 404 naming the missing template / snapshot (#1868).
  • Fixed the Go SDK Watcher closing its response body twice under concurrency (#1405).
  • The quickstart example pins the e2b Python SDK below 2.51: that version calls an endpoint CubeAPI does not provide and fails with 405 (#1909).
  • Removed the agent-platform freeze / resume guide and an outdated snapshot timing note from the docs (#1913).