Highlights
- BREAKING:
sbx ports --publishand kit-declared ports now default totcp4instead of dual-stacktcp, so a published port no longer listens on::1unless you name the protocol explicitly (--publish 8080:3000/tcp); this makeshttp://localhost:<port>/reach a sandbox service that listens only on IPv4. sbx runandsbx createnow accept sandbox kit references as the agent positional:sbx run <sandbox-kit-ref>. The old formsbx run <sandbox-kit-name> --kit <sandbox-kit-ref>is deprecated; use the--kitflag for mixins.- Sandboxes can now be created without a workspace bind mount by omitting the path in
sbx create. Note that this only affects thecreatecommand;sbx runstill defaults to mounting the current directory as the primary workspace.
What's New
CLI
- Read-only
sbxcommands includingsecret ls,version,mcp ls,skills ls,policy inspectand thekitverification commands now accept--jsonfor machine-readable output. - Clipboard commands inside local sandboxes can now copy text to the host clipboard.
- Add, update, list, and remove sandbox skills directly from Git repositories with
sbx skills.
Environment files
sbx envnow reads a non-hiddensbxenv.yamlin preference to.sbxenv.yamlwhen a directory holds both, and merges ansbxenv.yamlfrom your home directory beneath the project file as defaults shared across projects.sbx envnow shows a plan of everything an environment file changes on the host — hostlifecycle:commands, credentials, bindings, MCP servers, workspaces, kits, ports and the sandbox itself — asks before applying it and asks again for every run of a command on this machine unlessenv.rememberHostCommandsis set, binds the environment file read-only into the sandbox it describes, and reads a directory forsbxenv.yamlalone with~/.sbxenv.yamlas the user-level base beneath it.sbx env: an environment file that declares noworkspace:now creates a sandbox with no workspace bind mount instead of mounting the directory holding the file; writeworkspace: .to mount the project directory.- Environment files can now declare their own arguments in an
args:block, referenced as${{ env.args.NAME }}and supplied withsbx env --env-arg;${VAR}interpolation in.sbxenv.yamlis no longer expanded. - Relative kit paths in an environment file now resolve against the file's directory instead of the directory
sbxwas run from. sbx env createnow shares imported skills by default and accepts display, GPU, and USB options insbxenv.yaml.
Daemon
- Sandboxes now get a 10 GB Docker volume instead of 50 GB, which significantly reduces host disk usage; set the
sandbox.disk.dockerVolumesetting orDOCKER_SANDBOXES_DOCKER_SIZEto change it.
Agents
- The built-in
droidagent has been removed — run it as a community kit withsbx run docker.io/sbx/droid-kit:latest. - The built-in
copilotagent has been removed — run it as a community kit withsbx run docker.io/sbx/copilot-kit:latest. - The built-in
kiroagent has been removed — run it as a community kit withsbx run docker.io/sbx/kiro-kit:latest.
Kits
- Kits can now declare their arguments in a
args:block and receive values with--kit-arg name=value, or--kit-arg kit.name=valueto target a single kit. - A
kits:entry in sbxenv.yaml carries the arguments for that kit underkits[].args.
Bug fixes
- Docker Sandboxes no longer opens the setup wizard automatically; run
sbx setupto launch it explicitly. - Fixed a vulnerability where a sandboxed process could get the daemon to open a host D-Bus transport and execute an arbitrary command on the host.
- On macOS, sbx now accepts a workspace path whose casing differs from the spelling on disk instead of failing to create the sandbox.
- Fixed a rare case where a spotty network right after your computer woke
from sleep could cause an unexpected Docker Hub sign-out. - Agent crashes now identify the terminating signal and provide scoped recovery guidance.
- Fixed a vulnerability where a malicious sandbox could hijack another sandbox's OAuth login by pre-claiming its callback port.
- Removing or pruning a local sandbox now also deletes its sandbox-scoped secrets.
sbx secret lsno longer prints a stored secret unmasked when its value happens to match one of the status labels the listing displays.sbxnow warns when a stored credential is not sent to a sandbox because no binding authorizes it, instead of starting the sandbox and failing later with an authentication error.- Fixed several MCP-related bugs.
- Standardized error message formatting for
sbx rm,sbx stop, MCP authorization, andsbx reset. - Sandbox and agent not-found errors now use one sentence pattern and quote style across commands: sandbox '' not found.
- Fixed an egress policy bypass where a sandbox could reach a disallowed domain co-hosted on an allowlisted host's CDN by sending a different TLS SNI inside an HTTPS CONNECT tunnel; the proxy now enforces the network policy against the tunneled SNI.
- Docker Hub template pulls created through the TUI now use your Docker Sandboxes login credentials.
sbx ports --publishnow automatically starts stopped local sandboxes before publishing ports.- Docker volume sizes below 512 MiB are now rejected before sandbox creation.
- Creating a sandbox from a Docker Hardened Image template no longer results in a delay.
- Fixed OAuth authentication for custom agent kits that declare resource hosts without a fallback API key.
- Kits can now set a sandbox's CPU and memory limits through the
sandbox.resourcesblock in their spec. - Fix SSH connections from editors by keeping non-interactive probes quiet and delivering their exit status before closing the channel.
- Deleting a sandbox now reliably reclaims its disk volumes, and creating a new sandbox that reuses a deleted sandbox's name no longer inherits its files, Docker images or agent session history.
- Running
sbx setupexplicitly no longer causes the setup screen to appear again on the next interactive command. - Fixed sandbox connections to a server that sends data first — including passive FTP transfers and a serial console relayed to the host — failing with a timeout instead of receiving the server's output.
sbx kit pushno longer uploads an empty payload layer for kits that ship no files.sbx kit pushnow authenticates from the sbx credential store, so a singlesbx loginordocker loginis enough for pushing, signing, and attaching provenance.- Kits using
extends:now inherit the parent's setup commands, credentials, network allowlist, volumes, and environment variables instead of replacing them when the child declares its own. - Fixed Docker Hub credential refresh retrying without backoff after a rate limit, and a non-interactive login discarding the stored OAuth refresh token.
- Nightly Homebrew installs no longer fail with checksum mismatches while a nightly publish is in flight: the sbx@nightly cask now downloads from immutable per-build release URLs.
- Fixed an issue with streamed response bodies in the sandbox's HTTP proxy that affected the Cursor agent.
Other
- Docker Sandboxes now provides a machine-wide Windows MSI for administrator-managed installations.
- A declined
@requireApprovalprompt on a local MCP server now gets its own audit record, with policy attribution and a context digest, instead of leaving the original approval-required decision as the only trace of the exchange. - A registry mirror configured with
platform.images.registryMirroris now also used by Docker running inside a sandbox, when the value is a bare host (no path prefix) that is not a loopback or wildcard address. sbx version --jsonnow reports aserver.stateofrunningorunavailable, so scripts can check whether the backend was reachable without parsing the error text.- SSH agent forwarding can be explicitly disabled and use either each client's current agent socket or a fixed socket path.
sbxterminal output now adapts colours for light terminal backgrounds and
uses a distinct pink spinner glyph; CJK and combining-mark column widths in
table output are now measured correctly; piped and JSON output is unchanged
for ASCII-only content.sbx mcp addnow accepts--skip-auth(the old--skip_authstill works), and a--urlon a private, loopback, or cloud-metadata address is resolved and registered with a warning instead of being rejected.- On Linux hosts without an available OS keychain, newly stored secrets are now read and written much faster; secrets already on disk keep their previous cost until they are next written.
- Fixed a gateway defect where a remote MCP server's reconnect could silently wipe its tool routing, causing the server's tools to disappear from agents and be denied by organization MCP policy as unrecognized built-in tools until the daemon was restarted.
- Docker Sandboxes can now upload a diagnostics bundle automatically when the daemon hits an error, after you opt in.
- Governance resolution issues are now shown in sbx policy output and the dashboard
sbx mcp authnow requests only the scopes you chose (or the set the resource itself requires, suppressible with the new--no-scopeflag) instead of every scope a server advertises, explains which scopes a server refused along with a narrower retry command, and reports the scope sets of an existing grant insbx mcp auth status: what was granted, what was requested, and what the server supports — with scopes sorted, duplicates collapsed, and differences such as unrequested or no-longer-advertised grants called out.- Sandbox listing and creation output now share one rendering package; on a terminal,
sbx lscolumn headers are now styled bold. - Sandbox agent instruction files no longer include generic language-specific development guidance.
- The sandboxd runtime state directory left behind by versions before v0.25.0 is now migrated to its current name instead of being used in place.