Docker Sandboxes release notes
This page lists changes in recent stable releases of Docker Sandboxes. For the full release history, including pre-releases and downloads, see the Docker Sandboxes releases on GitHub.
0.45.0
2026-09-21Highlights
Compose reusable environments with v3 kits
Docker Sandboxes now supports v3 kits: OCI-based packages that combine an agent workload with reusable mixins for tools, configuration, credentials, network access, and agent instructions. Compose compatible kits directly when creating a sandbox, or publish the combination as a kit set that your team can run from a single reference.
V2 kits remain supported for built-in agents and existing customizations. V3 workloads and mixins must be used together; they can't be combined with v1 or v2 kits. Learn more about kits.
What's new
Breaking changes
sbx mcp cataloghas been removed. To authorize a remote MCP server, register it withsbx mcp addbefore runningsbx mcp auth.sbx secret rmnow returns an error on stderr when the requested secret doesn't exist.sbx mcp rmnow returns an error when the requested MCP server isn't registered.
Security
- Fixed an issue where revoking a sandbox's OAuth or API-key credential could leave its running proxy authorized until the sandbox was recreated.
Kits
- V3 kits introduce separate workload and mixin roles. A workload supplies the base environment and command to run; mixins add tools, configuration, and runtime behavior. Dependencies and compatibility declarations determine composition order.
- Kit sets let authors combine a workload and mixins, pin their component versions, and publish the result as a single OCI reference. Sets can also add capabilities, lifecycle hooks, instructions, and arguments of their own.
- V3 kits can scope network access by HTTP method and path, declare install-phase network access and credential use, and specify where an agent reads shared skills.
- Multiple OAuth-backed agents can be composed in the same sandbox with credentials scoped to the kits that request them.
- HTTP Basic credentials declared by a kit now produce the expected
Authorization: Basicheader. Composition fails when kits declare conflicting ownership of a Basic-auth service instead of silently dropping the username. sbx kit validatenow rejects malformed API-key declarations, including invalid names, missing injection domains, invalid format placeholders, and Basic-auth usernames containing a colon. It also warns about declarations that have no effect or target domains outside the kit's network allowlist.- Reusing an unchanged local kit no longer rebuilds its composed image.
- Adding a mixin to an existing sandbox through the daemon API now writes the mixin's agent instructions as expected.
Agents and models
sbx run --modelcan use any OpenAI- or Anthropic-compatible endpoint configured in the newmodel.providerssetting.sbx run opencode --modelnow exposes the model's supported thinking levels as OpenCode variants, selectable with Ctrl+T.- The OpenCode kit now configures GitHub Copilot from the account's stored GitHub credential, so Copilot models work without a separate device login.
- Codex sandboxes now install Codex with its native installer instead of npm.
CLI and output
- MCP server, secret, skill, template, volume, and policy-profile list commands now support
--quiet(-q) for name-only output. - List commands now use consistent table formatting, and errors use a consistent format with clearer recovery guidance.
- Commands that remove resources now ask for confirmation. Use
--force, or--yes/-yforsbx kit builder history rm, in non-interactive workflows. Declining a destructive-action or required-restart prompt now returns a non-zero exit code. - Running
sbx secret rmwithout a service opens a picker showing existing local secrets and their scope, type, and name. - Unsupported detached execution with
sbx exec -dor--detachnow fails immediately instead of running in the foreground. sbx settingsnow appears insbx --helpand the CLI reference.sbx ls --jsonnow includescreated_at.sbx ls --jsonandsbx inspect --jsonalso report recorded CPU and memory limits for local sandboxes.- The updater no longer asks to switch channels when the requested version is already installed.
sbx env rmnow warns about data loss for a cloned workspace before asking for confirmation.sbx logoutno longer warns about stopped sandboxes when the daemon isn't running.
Sandbox lifecycle and workspaces
- Sandboxes now recover when the guest kernel crashes instead of becoming permanently unusable. If a guest stops responding, affected operations fail with an explanation, held proxy connections are released, and
sbx lsandsbx inspectreport the unresponsive state. - Dynamic mounts are restored after a sandbox restart. Startup fails clearly if a saved mount can't be restored, and
sbx umountcan remove a saved mount while the sandbox is stopped. A missing unmount target no longer disrupts existing mounts. - Clone-mode sandboxes restore their host Git remotes on every restart, preserve complete remote configuration during concurrent lifecycle operations, and provide recovery instructions if configuration fails.
- Newly created or recreated sandboxes have a writable
/etc/hostsfile. - Image pulls retry transient registry network failures before sandbox creation fails.
- Cached-image recovery is reported as successful without also showing a registry error, and mount-policy evaluation failures are distinguished from access denials.
- Container swaps remove obsolete registry-mirror allowances even if saving the previous swap state fails.
- Updated containerd to fix image layers being dropped.
Authentication and credentials
- Adding, updating, or removing global service secrets now updates existing local sandboxes without a restart while preserving sandbox-specific credentials. Sandbox-scoped command and reference secrets also take effect immediately.
- Registry and service-secret revocation failures are now reported and can be retried, including after a stored OAuth token has been deleted.
- OAuth refreshes are coordinated across sandboxes that share credentials, preventing simultaneous refreshes from forcing another sign-in.
Networking and policy
- Network policy now treats hostnames with a trailing dot the same as their canonical form for routing, interception, credential injection, and
host.docker.internalhandling. The policy log also records cleartext HTTP requests whoseHostheader differs from the connection destination. - Experimental outbound UDP now follows sandbox network policy. New local allow rules cover TCP by default; select UDP explicitly with
--protocolin the CLI or the TCP+UDP option in the TUI. UDP is refused when the destination requires an HTTP, SOCKS5, system, or PAC-selected proxy, because those proxies can't carry it. - Reverse-DNS lookups are now allowed only for destination IPs already authorized by policy, including IP, CIDR, and allow-all rules. This closes the previous policy bypass without blocking PTR lookups for permitted addresses.
- DNS resolution is no longer allowed when no network rule permits it.
- Connections allowed only by a CIDR rule no longer wait for hostname detection before connecting, improving protocols such as SSH where the server speaks first.
- Network and filesystem access now fail closed with accurate errors when policy evaluation fails, governance can't be resolved, a policy snapshot is stale, or a request is malformed.
sbx policy allow network,sbx policy deny network,--allow-network, and--deny-networknow reject malformed patterns before saving them.sbx policy lsnow shows how each rule was created and supports filtering with--created-via.- Fixed excessive daemon CPU use caused by reading the settings file for every blocked UDP packet.
- The governance-rules table no longer reserves space for a hidden profile column, keeping host values readable in narrow terminals.
MCP
- Fixed gateway creation failures caused by parentheses or other sandbox-ID punctuation in generated gateway names.
- MCP gateways now recover correctly after a daemon restart when using
sbx execorsbx env run. - Internal MCP discovery and OAuth informational logs no longer appear in normal command output.
- OAuth authorization errors now suggest explicit scopes when the authorization server rejects a request without scopes.
- OAuth metadata discovery for private addresses now warns and continues by default.
--skip-ssrf-checkremains available to suppress the warning for trusted providers and their discovery destinations. sbx mcp add --disable-http2disables HTTP/2 for a remote MCP transport, providing a workaround for servers whose HTTP/2 handling stalls long-lived streams.
Packaging and installation
- macOS distributions now contain a single signed
Sbx.appbundle. Homebrew and tarball PATH installs continue to work through a symlink into the bundle.
0.43.0
2026-09-15What's New
Breaking changes
shareSkillsinsbxenv.yaml(experimental feature) has been replaced withskills,skillsmay be set tooff|readonly|readwrite.MCP OAuth client secrets are renamed to
mcp:<server>:client_secret(wasmcp:<server>.client_secret), matching the header-secret naming; a secret stored under the old name is no longer read and must be re-set withsbx secret set mcp:<server>:client_secret.
Environment files
- Environment files can reference
${{ env.projectDir }}and${{ env.fileDir }}, the user-level~/.sbxenv.yamlcan mount each project's own directory by declaringworkspace: ${{ env.projectDir }}, relative workspace paths now resolve against the file that declares them, and everysbx envsubcommand accepts--nameto override the sandbox name. sbx env run,sbx env create, andsbx env rmdetect name conflicts with sandboxes created outsidesbx envand provide guidance instead of treating them as environment-managed sandboxes.
Agents and models
- Formerly built-in agents that moved to public kits (kiro, copilot, droid) can be launched by name again —
sbx run kiroresolves the pinned replacement kit and its stored credentials work without extra approval steps. sbx run --providernow accepts hosted models.dev providers, served through llmman.sbx run --modelgains--overflow-provider/--overflow-modelto pair a local model with a hosted one for oversized requests;--providernow works with codex for providers lacking the Responses API; codex sandboxes no longer spend seconds retrying WebSocket connections to the local model server.- Claude Code sandboxes started with
sbx run --modelnow use the model you selected instead of the harness's own default model. - A slow first launch of the bundled llmman no longer fails
sbx run --model.
Kits and skills
sbx create/sbx runnow share skills read-only by default via a new tri-state--skills=off|readonly|readwriteflag; the retired--no-share-skillsflag still works as a deprecated alias for--skills=off. There is also a newskills.defaultModeto set the desired default behaviour.- Commit-pinned git kits now resolve offline from a local content-addressed cache, and every cache hit verifies the checkout against a per-file manifest, so a tampered cache entry is quarantined and refetched instead of being served.
- Signed git kits now verify on every host: a kit checkout is materialized from the commit's blobs alone, so smudge filters, line-ending conversion, LFS, hooks, and other host git configuration can no longer alter the checked-out bytes.
- Fixed kit-argument (
${{ kit.args.* }}) substitution silently not applying when a kit reference is a symlinked directory. - Kits can now be installed through registry mirrors configured with an explicit port.
- Hardened git kit cloning against command-line config injection (
GIT_CONFIG_PARAMETERSand its numbered counterparts) carried in the inherited environment.
Sandbox lifecycle and workspaces
- Add a last-used timestamp to
sbx ls --jsonand Docker-styleuntilfiltering tosbx prune. - Sandboxes created with
sbx createnow stop automatically after becoming idle. - The minimum memory for a sandbox has been decreased to 512 MiB. Note: This is only suitable for shell use cases.
- Sandbox names are now validated to reject names longer than 63 characters or ending in a hyphen or period.
daemon inspectandinspectwill now show mount information.- Clone-mode sandboxes now support shallow Git repositories.
- Fixed an issue where the
sbxCLI could select the wrong repository during Git-related setup tasks, such as loading kits or configuring workspaces, when Git environment variables were set on the host. - Fix UNC path resolution on Windows so that the same folder is identified correctly.
- SSH connections now remain bound to the original sandbox identity while preserving existing sandboxes during UUID migration.
- Windows clients can now connect to
sandboxdthrough filesystemAF_UNIXsockets. - The local daemon now verifies connecting operating-system users on Unix sockets and Windows named pipes.
Authentication and credentials
- Docker sign-in now explains how to recover when macOS Keychain denies access to stored credentials.
- Fixed a bug where a single Docker Hub sign-in timeout could permanently lock the daemon out of Docker Hub, requiring a manual sign-in to recover.
- Concurrent sandbox creates now reuse one Docker Hub authentication request.
- Private registries can use an explicitly trusted cross-host authentication endpoint for sandbox pulls.
sbx secret rm --sandboxnow immediately revokes the removed credential from the sandbox proxy.- Prevent
sbx execfrom synchronizing credentials that were not configured for the sandbox. - Credential-binding consent now defaults to decline and clearly identifies when API-key secrets will be sent to new domains.
- Fixed the OAuth credential gate so a third-party kit re-declaring a built-in agent's OAuth service can no longer inherit that agent's trust and receive a real token without an explicit binding; sandboxes created before this fix now self-heal on the next daemon restart or kit add instead of requiring a manual recreate.
- Unrelated credentials no longer switch Claude sandboxes into Anthropic API-key mode.
sbx secret importandsbx secret lsnow list copilot's GitHub credential correctly.
Networking and policy
- The CLI honors configured proxy settings for host-side HTTP requests, including login, diagnostic uploads, and update checks.
- Fix HTTP/2 upstream responses without bodies being incorrectly framed as chunked by the sandbox proxy.
- Hardened credential handling in the sandbox egress proxy so a client-supplied credential the proxy did not issue is not forwarded to managed provider hosts.
- Network allow rules for IP-literal targets (for example
sbx policy allow network [::1]:8080or CIDR rules such as10.0.0.0/8) are enforced correctly again; the proxy no longer blocks them with a default-deny after the governance approval-callback migration. - Fixed: agents no longer suggest
sbx policy allowfor a host blocked by an org-governed default-deny policy — it now reads asBlocked by org policy, same as an explicit org deny rule. - The
balancedpolicy preset now allows access to the NodeSource APT repository. - Claude sandboxes can now access the Claude Code documentation.
MCP
sbx mcp addcan now send custom request headers to remote MCP servers via--header, with header values substituted from the local secret vault.- MCP authorization supports private OAuth discovery with
--skip-ssrf-check, falls back to advertised common OIDC scopes, and honors--no-scopefor local OAuth registrations.
CLI, diagnostics, and updates
- Local
sbxcommands no longer wait on slow or unreachable update services before exiting. - Plain
sbx versioninvocations now return embedded version information without full CLI startup. sbx diagnosechecks whethermkfs.erofsis usable and warns if its default block size exceeds the sandbox kernel's page size.sbx diagnoseno longer reports a missing SSHProxyCommandin Git Bash when the Windows OpenSSH configuration is healthy.- The
tls.allowNegativeSerialsetting no longer prints an informational log line on everysbxcommand while remaining visible in daemon diagnostics. - Terminal output now uses default text colors when the background theme cannot be detected.
- Fix terminal cursor flickering issue on Windows.
- Nightly and development builds now report a version based on the latest stable release instead of a release-candidate tag.
sbx@rcbrew users on macOS will be updated to the latest stable build when it is released.
0.42.1
2026-09-07What's New
Bug Fixes
- Fix HTTP/2 upstream responses without bodies being incorrectly framed as chunked by the sandbox proxy.
0.42.0
2026-09-07Highlights
- 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.
Security
- Fixed CVE-2026-77179, a symlink vulnerability in the virtio-fs host server on macOS that could let a malicious guest read or modify arbitrary host files outside the shared workspace, potentially leading to code execution on the host.
- Fixed CVE-2026-79994, a symlink race in the guest-to-host Unix domain socket relay that could let a malicious guest connect to arbitrary host Unix sockets outside the shared workspace, exposing data or host-side capabilities.
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.yamlfrom a project directory and no longer falls back to a hidden.sbxenv.yamlthere; it merges a.sbxenv.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
DOCKER_SANDBOXES_DOCKER_SIZEto change it.
Agents
- Added Devin as a built-in agent.
Kits
- Kits can now declare their arguments in an
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. - 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. - Fixed 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.
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 colors 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.
Earlier releases
For older versions, see the Docker Sandboxes releases on GitHub.