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
mcpwhen creating a sandbox; once it is running, the Python / Node / Go SDKs startmcp-gatewayinside 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 toCUBE_TEMPLATE_ID. The default sandbox image has no gateway; build one from the reference implementation underexamples/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_roleand 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 resourceright 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 lsalso 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 reclaimcommands 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
cubemastercliaccumulating 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
Watcherclosing its response body twice under concurrency (#1405). - The quickstart example pins the
e2bPython 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).