spreadFrom keeps a new sandbox off its peers' servers
POST /v1/sandboxes accepts spreadFrom again: 1 to 16 IDs of your own sandboxes. The new sandbox starts on a server that none of them is running on, and stays apart from them each time it is placed again. When no other server has room, the create returns 503 capacity_unavailable immediately and nothing is made or charged. An ID this key cannot read returns 400 invalid_request. Snapshot IDs are not accepted in spreadFrom, and a create that copies a snapshot returns 501 feature_unavailable when it sets spreadFrom.
Same day.
- Sandboxes: browser, desktop and MCP on every new sandbox/v1/sandboxes/{id}/browser (:start, GET, :stop), /desktop:start, /desktop:act, /desktop/screenshot, /desktop:stop and /mcp (POST, GET, DE…
- Sandboxes: network rules work for every sandboxGET /v1/sandboxes/{id}/network and PUT /v1/sandboxes/{id}/network now work for every sandbox.
- Sandboxes: a verb the API key does not allow returns 403, and older keys can wake, extend, update, set retention and restartA request for a sandbox operation that the API key's grant does not include now returns 403 forbidden; previously some of these requests…
- Sandboxes: a fork returns 409 fork_unsafe when a copy would repeat the source's random numbersA fork (forkOf, or POST /v1/sandboxes/{id}:fork) copies every process's memory, including the state of each language runtime's own random…
- Sandboxes: a fork with count above 1 makes its copies in parallelPOST /v1/sandboxes/{id}:fork with {"count": 4} previously made each copy after the one before it; it now makes them at the same time and…
- Tailscale: new sandboxes can join a tailnet againPOST /v1/sandboxes/{id}/tailscale, GET /v1/sandboxes/{id}/tailscale, DELETE /v1/sandboxes/{id}/tailscale, and the tailscale field on POST…
- API: keep-alive connections stay open across Runtime releasesWhen a server's API process was replaced during a release, a request in progress on a keep-alive connection could be answered with connec…
- Jobs: a vouch is no longer cleared by secrets scoped to other sandboxes by IDAny change to an egress secret's scope, including a list of other sandboxes' IDs, cleared every vouch in the organization, and the job's…
- Keys: POST /v1/keys no longer slows down or returns 502 keys_unavailable in accounts with many keysIn an account holding tens of thousands of keys, creating a key could take 15 seconds or more and return 502 keys_unavailable, and other…
- Sandboxes use included free usage before credit in every regionA sandbox's running time is charged to the month's included free usage first, then to credit, in every region where the account runs sand…
- API keys: keys Runtime creates for your builds, CI/CD checks, app versions, agent sessions and Actions runners no longer count toward the limit of 1,000 live keys per memberPreviously, a busy CI/CD repository could fill the limit with its checks' short-lived keys, and POST /v1/keys returned 409 limit_reached…
- Sandbox creates in a full region fail immediately and name the sizeWhen no server in the region has room for a new sandbox, POST /v1/sandboxes now returns 503 capacity_unavailable immediately, before any…
- Sandboxes: creates from an existing image no longer return 404 image_not_found for some accountsPOST /v1/sandboxes could return 404 image_not_found (or snapshot_not_found, volume_not_found) for an image, snapshot or volume that exist…
- Sandboxes: creates no longer return 501 or an immediate 503 for some accountsPOST /v1/sandboxes could return 501 (for example env_unavailable or feature_unavailable) or an immediate 503 for request bodies the API s…
- Correct clock after a restoreA sandbox created from a template, forked, or woken from a pause now reads the correct wall-clock time from its first instruction.
- Creates from an image that cannot boot return 404POST /v1/sandboxes now returns 404 image_not_found, naming the image and the reason, when the image is not the organization's or was dele…
- Requests that carry a secret's placeholder are never sent unreplacedIf the server running a sandbox has not received secret updates in the last 15 seconds, a request that carries a secret's placeholder, or…
- Files: watches work in sandboxes created from the default imagePOST /v1/sandboxes/{id}/files/watches (and files.watch() in the SDKs) returned 500 watch_failed ("The watch exited while starting") in sa…
- Sandbox creates move off a failed host immediatelyWhen the host chosen for a new sandbox has failed and refuses connections, POST /v1/sandboxes now places the sandbox on another host imme…
- A Function with no running copy starts one for its next requestA request to a Function that has scaled to zero waits at the router while a copy is started from the version's saved copy, then is answer…
- A crashed process restarts immediatelyWhen the process of an App, a Function or a container exits, its first restart now happens immediately instead of after 1 second; an App'…
- CI/CD: always run a pull request's own testsA split step with own: true (split: { files: "/*.test.{ts,tsx}", own: true }) runs the test files a change adds or changes that no other…
- Parallel forks no longer return 503 busy while a snapshot copy arrivesWhen a snapshot's own server was full, creating many sandboxes from that snapshot at once could return 503 busy ("Cloud is busy; retry").
- CI/CD checks every push of the branches you listAdd pushes: [{ branch: next, steps: [...] }] to the production branch's .runtime/checks.yml to check each push of a branch that has no pu…
- Slack triggers in the v2 Agents APIPOST /v2/agents/slack/installs returns a link that adds Runtime's Slack app to a workspace, valid for 15 minutes; POST /v2/agents/slack/i…