2026.09.23 Release v0.7.2
CubeSandbox 0.7.2 introduces 3 major features along with multiple enhancements and bug fixes. 56 commits from 29 contributors.
🎯 Major Features
Much faster cross-node restore reads
Sandboxes restored cross-node on the S3 backend read disk data from S3 on demand; this release optimizes that read path systematically:
- New whole-object local cache: immutable data objects on S3 are kept on the local node, so repeated reads after a restore — and re-importing the same snapshot — hit the local cache instead of going back to S3.
- Reduced read amplification during restore: scattered small reads are coalesced into whole-object GETs, and the concurrent fetch budget is capped.
- With the default MinIO setup, cross-node restore / create-from-snapshot reaches running in under 1 second.
New JuiceFS volume plugin
New JuiceFS storage plugin: sandboxes can mount a JuiceFS filesystem as a persistent volume, with full POSIX semantics.
Automatic reclaim of idle guest memory
Idle memory inside sandboxes is reclaimed back to the host: node memory usage falls back dynamically with the real usage of the sandboxes, so a single node can host more sandboxes.
✨ Enhancements
Templates & Storage
- S3lvol hot upgrade: fixes the EIO errors seen inside sandboxes when upgrading the CubeS3lvol storage component.
- Local-filesystem storage for component repositories and template artifacts (#1749): component repositories and template artifacts can be stored on S3 / local disk / PVC / NFS.
- Incremental snapshot fix (#1343): fixed data loss in incremental snapshots.
- Faster virtiofs on the pause / snapshot path (#1748): optimized the state preparation flow before pause.
- Cubelet can configure the template install path, allowing large templates to be moved to the data disk (#1675).
- CubeS3lvol object cache: identical objects read during a cross-node restore are served from the local object cache first, and the object cache and dest cache share the same local cache storage (#1756).
Lifecycle & Control Plane
sandbox.connectsupports atimeoutparameter (#1352).
Deployment & Runtime
- cube-node now runs on the host network by default in K8s deployments (#1815): recreating the cube-node Pod no longer destroys the network namespace, so the network of every sandbox on the node stays up. Switching an existing cluster requires draining compute nodes and explicit confirmation (
hostNetworkChangeAck); fresh installs are unaffected. - Faster sandbox cold start (#1694): disabled the RAID6 PQ startup benchmark in the guest kernel, which is unrelated to workloads.
Web UI / CubeOps / Other
- Removed the legacy E2B SDK reference; Python SDK command execution now goes through the
envdConnect RPC (#1786). - The Python SDK's
run_code(E2B-compatible code-interpreter interface) can now read environment variables injected at sandbox creation (#1323), matching the behavior ofcommands.run; the new sandbox-code example image is required.
🐛 Bug Fixes
Lifecycle & Sandbox
- Fixed inconsistent memory-snapshot and image-snapshot state when building a template (#1760).
- Fixed existing snapshots becoming unusable after a template was deleted (#1763).
- Fixed a race where concurrent image builds left tasks stuck in
BUILTwith database connection timeouts (#1802). - Fixed snapshot creation retries being rejected as a changed request body (#1253).
- Fixed paused sandboxes not returning a timeout (
end_at=0) in Info / List queries (#1801). - Fixed an explicit timeout passed to Connect not taking effect for already-running sandboxes; a shorter timeout no longer shortens an existing longer deadline, and the Python SDK now passes the parameter through (#1352).
- Fixed PVM detection: the upstream PVM ABI removed the CPUID signature, so detection now relies on the MSR list supported by KVM, compatible with both old and new ABIs (#1781).
- Fixed a kernel panic when PVM guests booted on Intel hosts because GMI sm3/sm4 probing was misdetected (#1725).
- Fixed resume failing after pause on ARM (
Could not restore GICv3ITS state): the vgic state save was incorrectly optimized to all zeros by the compiler (#1658).
Networking & Security
- Fixed sandboxes having a guest MTU larger than the node uplink NIC under overlay CNI, which left the network broken out of the box: guest MTU now follows the node NIC automatically (it only decreases), and can be pinned with
cubeNode.network.mtu(#1674).
Deployment & Upgrade
- Fixed the
CUBE_SANDBOX_CUBE_EGRESS_IMAGEenvironment variable not being updated in.one-click.envfor one-click deployments (#1788). - Fixed CubeOps failing to connect when the MySQL password contains special characters; invalid configuration now fails at startup (#1617).
- Fixed one-click install failing silently on snap-packaged Docker; it now tells users to switch to
docker-ce(#1789). - Fixed inconsistent Redis logical-DB configuration across components in one-click deployments, which made CubeOps write metrics to the wrong database (#1705).
- Fixed PVM installation failing on Ubuntu (#1770).
- Fixed the template artifact cache not being movable to the data disk on its own (#1675).
- Fixed CubeS3lvol being pinned to CPU0/CPU1 by default; another CPU is now picked automatically when unconfigured (#1713).
Other
- Fixed PostgreSQL template-alias duplicate errors being misclassified by error text and occasional template status publish failures; classification now uses SQLSTATE (#1724).
- Fixed compatibility issues in the cubebench CPU topology report (#1757).
- Added an Ubuntu desktop sandbox example and integration guide (#1746).
- Added an OpenCode integration: a plugin hook redirects bash into the sandbox so commands no longer run directly on the developer's machine (#1238).
- Added a CI status page (#1737).
- Corrected the PVM expansion: Pagetable-based, not Parallel (#1772).
- Added a documentation security warning: injecting credentials over HTTP is unsafe, limited to controlled internal networks; prefer HTTPS (#1818).