Changelog
What shipped in Runtime Cloud, newest first.
Runtime ships every day. Each entry is something you can use or see; the guides hold the current terms, and pricing holds the current rates. Each day, and each entry, also has a page of its own at withruntime.com/changelog, and every entry arrives in the RSS feed.
Updated
On this page
4 November 2026#
- Console: the Sandboxes, Browsers and Desktops lists show every sandbox, wherever it runs. For many accounts the lists showed only sandboxes made before the account moved to Runtime's new servers, and none made since. The lists now include them for every account. A sandbox that moved while paused shows its current state; before, it showed paused, and a woken one was missing from the Running tab. "Stop all long-running" reads the same list.
3 November 2026#
- Speed page: daily history charts and provider comparison. The speed page now charts each listed operation's median own time for each of the last 90 days, against its physical floor. Hover over a day to see its p95, p99 and sample count. When another provider has been measured the same way and Runtime is faster, the page also lists it beside the matching Runtime operation, comparing total times.
- CI/CD: a job that fails because its machine ran out of disk says so in its reason.
When a job's machine runs out of disk, the error is often never written to
the job's log, because the log is on the same full disk. Such a job's
reason was the log's last error, for example
error: build failed, waiting for other jobs to finish.... The job's log now ends with a line that says the machine ran out of disk (error: No space left on device: ...), and its reason names that line. - Speed: browser create time and rival providers, measured the same way.
browsers.createis now measured every five minutes. The time runs fromPOST /v1/browsersuntil the browser's CDP WebSocket answersBrowser.getVersion, which is the point where Playwright or Puppeteer can connect. The CDP exchange carries noServer-Timing, so all of its time is counted as Runtime's own.speed.jsonalso includes arivalsarray. Each rival is timed from the same location as Runtime, through the provider's own public API, to the same outcome as the Runtime operation it is compared with (compares). Browserbase, Steel, Hyperbrowser and Browser Use are timed until CDP answers. E2B, Daytona and Vercel Sandbox are timed until the sandbox is running. Rivals return noServer-Timing, so each line reports total time only. A rival is listed only after it has been measured with its own API key; nothing is estimated. Each rival's history is available fromspeed/history.json?op=rivals.<name>.<operation>(speed). - Speed history by the hour and by the day. Each listed operation's
hourly and daily p50, p95 and p99 (Runtime's own time, the network's part
and the total), sample count and failure count are now kept indefinitely
and returned by
https://status.withruntime.com/speed/history.json?op=<id>&step=hour|day&from=&to=.fromandtotake a date (2026-11-03) or an ISO 8601 time and are rounded down to the step; by default a request returns the last 48 hours, or the last 365 days withstep=day. A request returns at most 744 hourly or 3,660 daily points, and returns 400 for an unknown operation or an invalid range. Percentiles are computed from each hour's or day's own samples. Responses are cached for one minute (speed). - Sandboxes: upload links replace files in root-owned folders. A
PUTlink fromPOST /v1/sandboxes/{id}/files:linkto a path under/workspacewhose folder is owned by root (for example, a tarball extracted withsudo) returned404withThis upload is not open in the sandbox.The upload now replaces the file atomically, asfiles_writedoes, and the new file is owned by the sandbox user. When the sandbox user cannot write the folder (outside/workspace), the link returns403 permission_deniedwith the folder named, instead of404.
2 November 2026#
- CI/CD: a failed job's reason names its first error. The reason shown for a failed job, in the console and on its GitHub check run, was the last line of its log, which for a build is often a line such as
error: build failed, waiting for other jobs to finish.... It is now the first error line that names a cause (for exampleerror[E0308]: mismatched types), or aNo space left on deviceline when the machine ran out of disk. When a long log is shortened, every error line is kept, includingerror:lines without a code, and a compiler's quoted source lines are no longer taken for an error.
1 November 2026#
- Jobs: a vouch is no longer cleared by secrets scoped to other sandboxes by ID. Any change to an egress secret's scope, including a list of other sandboxes' IDs, cleared every vouch in the organization, and the job's runs carried no
job_vouched_byclaim in their identity tokens. Scopes by sandbox ID no longer affect a vouch, except for a run whose own sandbox ID is added to one, which carries nojob_vouched_byclaim. A change to a secret with no scope, a label or App scope, a secret's policy, or the upstream proxy still clears the vouch until an owner or admin vouches again. Vouches that were in effect when this change was released remain in effect. - Keys:
POST /v1/keysno longer slows down or returns 502keys_unavailablein accounts with many keys. In an account holding tens of thousands of keys, creating a key could take 15 seconds or more and return502 keys_unavailable, and other requests in the account waited while it ran. Creating a key now reads only the chain of keys that made the calling key and the keys under a maker with a daily limit, and completes in under 100 ms in an account with 50,000 keys. - 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 member. Previously, a busy CI/CD repository could fill the limit with its checks' short-lived keys, and
POST /v1/keysreturned409 limit_reachedto the member who connected it. Those keys are still bounded by the work that uses them and expire with it. - Sandboxes: creates from an existing image no longer return 404
image_not_foundfor some accounts.POST /v1/sandboxescould return404 image_not_found(orsnapshot_not_found,volume_not_found) for an image, snapshot or volume that exists in the account. The create now succeeds in the same request, and a retry with the sameIdempotency-Keyreturns the same sandbox. - Sandboxes: creates no longer return 501 or an immediate 503 for some accounts.
POST /v1/sandboxescould return501(for exampleenv_unavailableorfeature_unavailable) or an immediate503for request bodies the API supports. A create rejected before anything was applied now succeeds in the same request, and a retry with the sameIdempotency-Keyreturns the same sandbox. A503 busywhose create may have been applied is still returned, so a retry never creates a second sandbox. - Files: watches work in sandboxes created from the default image.
POST /v1/sandboxes/{id}/files/watches(andfiles.watch()in the SDKs) returned500 watch_failed("The watch exited while starting") in sandboxes created from the default image. A watch now runs in every image, and when one fails to start, the error message includes the exit code and the reason the sandbox reported. - CI/CD: always run a pull request's own tests. A split step with
own: true(split: { files: "**/*.test.{ts,tsx}", own: true }) runs the test files a change adds or changes that no other step'ssplitnames. With such a step inruntime.yml, a pull request that adds or changes a test file no step runs (any language: TypeScript and JavaScript, Python, Go, or a Rust crate's files) fails with atests not runjob that lists each file and the reason. Configs without anownstep are unchanged. - Parallel forks no longer return
503 busywhile a snapshot copy arrives. When a snapshot's own server was full, creating many sandboxes from that snapshot at once could return503 busy("Cloud is busy; retry"). It happened when a create joined a copy of the snapshot that was arriving on another server. These creates now succeed, and the copy finishes arriving alongside them. - CI/CD checks every push of the branches you list. Add
pushes: [{ branch: next, steps: [...] }]to the production branch's.runtime/checks.ymlto check each push of a branch that has no pull request of its own, such as a staging branch. Each such check runs only the named steps, appears on GitHub asruntime @ <branch>rather thanruntime, and once started it runs to its own verdict instead of being replaced by a newer push.
31 October 2026#
- Stopping a sandbox always completes. A stop that could not be recorded used to leave the sandbox in
stoppingpermanently, and every request on it returned500 operation_failed. The stop is now retried automatically every 5 minutes until the sandbox isstopped; meanwhile requests on it still return500 operation_failedimmediately, its files are kept, and nothing is charged. Sandboxes already stuck instoppingare stopped by the same retry. - Previews wait for a server that is still starting. Within 60 seconds after a sandbox is created or wakes, a preview or TCP port request to a port that is not listening yet now waits up to 10 seconds for the port to open, and is forwarded as soon as it does. Previously it returned
502withx-runtime-preview-error: port_closedimmediately, so a health check sent right after create failed until the server started. After 10 seconds the request still returns502 port_closed. Requests to a port that is already listening are not delayed. - Forks of a sandbox in use no longer fail with
sandbox_not_paused. If a command or other request woke the source between the fork's pause and the start of its copy,POST /v1/sandboxes/{id}:forkreturned409 sandbox_not_paused. Requests that wake a sandbox automatically now wait until the copy has started, up to one minute, and then proceed as before. - Forks succeed when the source is woken during the fork.
POST /v1/sandboxes/{id}:forkpauses the source while it copies it. If another request woke the source during that time (for example, a command run on it), the fork returned409 not_paused, said the source stayed paused, and left its copies running. The fork now returns its copies, and the source keeps running. - A failed fork deletes the copies it started. When
POST /v1/sandboxes/{id}:forkfails after some copies have started, the copies that started are now deleted and no longer appear inGET /v1/sandboxes. The error'sdetails.startedSandboxIdsstill names them, anddetails.copiesDeletedistrue. When the error is a 5xx, a failure on Runtime's side (for example, no capacity for a later copy, a copy that does not reachrunningin time, or the source cannot be woken), none of their running time is billed anddetails.copiesBilledisfalse. When it is a 4xx, caused by the request or the account (a limit or quota, or a copy or the source deleted or changed during the fork), the time they ran is billed. A copy whose create completed after the fork had already failed is deleted too. A copy that could not be deleted at once is named outsidedetails.deletedSandboxIds,details.copiesDeletedisfalse, and it is deleted within 15 minutes. If the server handling the fork stops before it returns, the fork is marked failed with a 500 once it has run longer than any fork can (15 minutes, plus about 20 seconds for each GiB of the source's memory), and its copies are deleted unbilled within 15 minutes after that. A fork that does not answer within the request deadline is a failure on Runtime's side, and its copies are not billed; if your client closes the connection before the fork answers, the copies are deleted and billed for the time they ran. Previously these copies kept running, and were billed, until you stopped them. getOrCreatealways returns the one sandbox that holds a name. ConcurrentPOST /v1/sandboxesrequests withgetOrCreate: trueand the samenamenow return the same sandbox, including when that sandbox is paused, stopped with its disk kept, or being moved between regions. Previously, under load, a second sandbox could be created under the same name, and later calls by that name could return either one. A create with anamethat cannot be placed at that moment, for example while capacity is short, returns 503busywithRetry-Afterand creates nothing; retry it. In the Vercel-compatible TypeScript SDK,Sandbox.getOrCreatenow creates a missing sandbox withgetOrCreate, and so doesget_or_create_sandboxin the Vercel-compatible Python SDK. Concurrent calls for the same name return the same sandbox instead of failing with 409name_taken.resume: falsestill leaves a found sandbox paused.- Sandbox list pagination returns every page.
GET /v1/sandboxesno longer returns400 invalid_request(cursor) on the second or later page for organizations whose sandboxes run in more than one cell. Each sandbox is returned exactly once, oldest first, andnextCursorstays an opaque string to pass back unchanged.withruntime sandboxes lsand every SDK's list iterator page through the full list. - Pull request checks into non-default branches use at most half of an account's CI/CD machines. Checks of pull requests whose base is a branch other than the repository's production branch now hold at most half of the machines the account can run at once, combined. The other half stays available for checks of the production branch and of pull requests into it, so those start immediately even when many pull requests into another branch are being checked. A check waiting on this limit shows the reason in its jobs: how many machines checks into other branches hold and the most they may hold.
- Requests that a secret's rules do not allow now return 403 from Runtime. A request that carries an egress secret's placeholder in a credential header, to a method and path that none of the secret's
rulesallows, is no longer sent to the destination with the placeholder. It returns403 ForbiddenwithX-Runtime-Egress: secret-rule-not-matched, and the body names the secret, the method and the path. Previously the destination received the placeholder and typically returned401with no explanation. Thesandbox.secret_not_appliedevent with reasonrule_not_matchedis still sent. - Commands start faster in new sandboxes.
POST /v1/sandboxes/{id}:execand process starts no longer wait for the API to look up the organization's egress secret placeholders. The sandbox supplies them from its host before every command, so each command still receives them. A command in a sandbox seconds old previously waited about 1.4 s for that lookup. - Egress secrets reach every new sandbox. A sandbox whose start carried no organization in its network rules trusted the egress CA but received none of its organization's secrets: their variables were missing from commands, and requests to the secrets' hosts were sent without credentials. Such a sandbox now gets its secrets like any other.
- CI/CD setup can be a list of layers.
setup:inruntime.ymlnow also accepts a list of up to 16 commands, run in order. A push to the production branch keeps each finished layer as a snapshot, keyed to that layer, the layers before it, the machine size and thecachefiles. A later setup starts from the deepest layer that is ready and runs only the layers after it, so a change to the last layer does not run the earlier ones again, and a setup that is stopped or fails partway keeps the layers it finished. Pull request checks start from these snapshots but never write them. Asetup:of one command works as before. - CI/CD: checks a release waits on get machines first. When an account's checks are short of machines, a pull request from the repository's own branches into the production branch gets them first, then a push to the production branch, each oldest first, then every other check. While one of these waits, the account's lower checks hand it machines as their running tasks end. A pull request from a fork is ordered with every other check. To skip pull requests into a branch whose commits are tested another way, such as a staging branch, list the branches to check in the production branch's config:
pull_requests: { branches: [main] }.
30 October 2026#
- CI/CD checks that run their setup start jobs immediately. When a check runs its
setup(its key has no warm snapshot yet), its first job now starts on that set-up machine as soon as the setup ends. Before, the machine was deleted once it was copied, and every job waited for machines started from the copy, which only one server held: when that server was full, a check could wait minutes with no job running. Machines for the rest of its work still start from the copy. - Usage export shows the carry on each outbound traffic row. In
GET /v1/usage/export, each sandboxegressrow'soutboundmeasurements now includecarried: the fraction of a microdollar the row started from, carried in from earlier outbound traffic in the same month, in bytes times microdollars per decimal GB. The row's charge pluswritten_off_microsequalsfloor((carried + billable bytes × rate) / 1,000,000,000). Charges are unchanged. - Agent sessions keep their task in the console after their history is archived. A session's history moves to cold storage a week after the session ends. The console now still shows what the session was asked to do: the opening words of its first input. Before, the console showed no task for these sessions. Sessions archived before this change still show no task in the console; their full history is still available through the API.
- The MCP server accepts newer protocol versions. A client that requests an MCP protocol version newer than the server supports, such as
2026-07-28, now gets a working session at the server's newest version (2025-11-25). This applies toinitializeand to theMCP-Protocol-Versionheader on later requests. Before, those later requests returned400 Bad Request: Unsupported protocol version, so clients such as Claude's connectors could not connect. A malformed version, or one older than the server supports, still returns 400. - A job is no longer failed when its machine is paused by its host. When a check's machine stops responding because its host paused it, the tasks it held now run on the check's other machines and do not count toward the three losses that end a job with "Lost 3 times, never reported".
- A check that times out while jobs wait for a machine reports "Could not run". When a check's
timeout:expires while every job that has not finished is still waiting for a machine that was refused for lack of capacity, those jobs now end with the reasonno machine came for its jobs in N minutes (...); re-run it once there is room, and the check's GitHub run is titled "Could not run". Before, those jobs were reported as "Ran past its time limit", as if the code under test had hung. - A sandbox's lease counts from when it first runs. A paid sandbox that waits in
startingfor its server to have room now has its lease renewed while it waits, so it is no longer stopped withtime_limitbefore it ever runs, and its server no longer refuses the start asinvalid_leaseonce the wait used up its lease. No compute is charged for the time spent waiting.diskKepton a stopped sandbox is nowtrueonly whenPOST /v1/sandboxes/{id}:restartstarts it from its disk: a stopped sandbox whose server was lost now returnsdiskKept: false. - Evictable sandboxes. A create or update can now set
evictable: true. Runtime may then delete the sandbox once it has been paused or stopped for at least 15 minutes and its server needs the disk, the sandbox idle longest first. It is deleted as byDELETE; a running sandbox is never deleted for it. Use it for work you can recreate, such as build caches and CI machines. Sandboxes return the setting inevictable, and every SDK accepts it on create.
29 October 2026#
- A sandbox waiting on its disk is no longer paused as idle. Idle pause now counts time a sandbox spends blocked on disk I/O as activity, alongside CPU, network traffic and open calls. Before, a sandbox whose processes were blocked on slow disk writes could use no CPU and be paused in the middle of its work.
- Sandboxes:
wakeOnTimersturns off timer wakes. A sandbox that pauses because it is idle wakes by itself when a process in it is due on a timer, such as asleep 600loop or an agent that polls every ten minutes. This is on by default for every sandbox, and a timer wake is billed as ordinary use from the moment the sandbox runs. To keep request wakes and turn off timer wakes, setwakeOnTimers: falseat create or withPOST /v1/sandboxes/{id}:update; turning it off also cancels a timer wake already planned. The setting is in the TypeScript, Python, Go, Java and Ruby SDKs, the CLI (--no-wake-on-timers,--wake-on-timers on|off) and the MCP tools, and sandbox responses include it. See timers wake an idle sandbox. - Free machine time in
GET /v1/usagematches what a create is admitted on.trial.availableMsnow counts what running sandboxes hold and the free-usage rules, so a create without credit is refused withincluded_usage_used_upexactly when it is 0. The newfreeUsageHoldfield says why an account has no free machine time (hosting,region,card,withheld,no-sourceorunknown) and what starts it; the refusal'sdetails.reasonnames the same rule, andnpx withruntime usageshows the message. Before, an account could read free time left while every create was refused. - A wake that its server has no room for no longer stays in
resuming. If the sandbox's server refuses a wake for memory or disk room, the sandbox returns topausedwithin 30 seconds with its memory intact, and the wake operation reportshost_capacityorhost_memory_pressurewith the reason. The sandbox can be woken again immediately, including by an automatic wake from a command. Previously the sandbox could stay inresuminguntil its lease ended, and every command returned 409sandbox_not_ready. - Accounts with credit keep their remaining trial hours. An account that has paid or holds credit uses its remaining free trial hours before credit again, wherever it was opened and whether or not a card is saved. Since earlier today, such an account opened outside the 41 advanced economies, or opened by email with no card saved for auto top-up, was charged credit while it still had trial hours.
- Sandboxes: a timer wakes a sandbox that paused while idle. When a sandbox pauses because it is idle, Runtime records when the next timer of a process in it is due (a
sleep, a wait with a timeout, atimerfd,alarmor a POSIX timer) and wakes the sandbox about one second before then. Only timers due within 29 minutes of the pause, and pending for the whole idle time, count, so a process that wakes every few seconds does not keep waking it. A sandbox with no pending timer stays paused. A pause you request, a pause at the end of a time limit or of credit, and a sandbox withautoWake: falseare not woken by timers. See timers wake an idle sandbox. - CI/CD: test only the packages and crates a pull request touches. Add
pull_requests: { tests: touched }to the production branch'sruntime.yml. A pull request into the production branch then runs only the tests of the packages (nearestpackage.json) and crates (nearestCargo.toml) that hold its changed files, plus steps whoseinputsit changes and steps that read every file. The other tests its change reaches are listed on theleft to mainjob, and the production branch's check runs them after the merge. Turn on undo with it so that a commit that breaks the production branch is reverted automatically. A change to a root file other than Markdown, a file in a dot folder, a lockfile or toolchain file, a script a step runs, or the config file runs every test it reaches. The default,tests: reached, is unchanged. - CI/CD: check only pull requests into the branches you list. Add
pull_requests: { branches: [main] }to the production branch'sruntime.yml. A pull request into any other branch ends immediately, uses no machine, and itsruntimerun reads "Not checked" (action required, which never passes a required check). A pull request whose base branch changes is checked again. Without the list, every pull request is checked, as before. - Free usage for accounts opened by email starts with a card. An account opened by email, in the regions with free usage, starts its free usage once its owner adds a card under Auto top-up on Usage & billing. The card is checked by your bank and is not charged unless you turn on auto top-up. Each card starts free usage for one account. Accounts opened with Google and accounts that have bought credit are unchanged. See free usage by region.
- Stricter checks on new email sign-ups. A sign-up code is not sent to an address at a domain registered less than 90 days ago, or to a fourth new address at the same domain within a day, unless the domain is a major email provider. Addresses that already have an account are not affected. Sign up with Google, or ask a teammate to invite you.
- One account per inbox when signing up by email. A new address that is another form of an inbox that already has an account, such as a
+tagor dotted Gmail address, is not sent a sign-up code. Sign in with the address the account was opened with, or with Google. - Free machine time outside the listed regions starts with credit. An account opened from a region outside the 41 countries in free usage by region has no free machine time until it buys credit; buying credit provides the full monthly free usage in every region. Accounts opened from the 41 countries are unchanged.
- Free usage depends on the region an account was opened from. An account that has never bought credit and was opened from one of 41 countries, including the United States, Canada, the United Kingdom, most of Western Europe, Japan and Australia, receives the full free machine time. An account opened from any other region receives 15 minutes of a default sandbox (2 vCPU, 4 GiB): 1 GiB-hour of machine memory and 0.5 vCPU-hours of active CPU. Buying credit provides the full monthly free usage in every region. Free saved copies and disks are the same in every region. See free usage by region.
- Lower network limits for sandboxes without credit. A sandbox of an account without credit now uploads at up to 10 Mbit/s (was 50 Mbit/s) and transfers up to 1 GiB a day, inbound and outbound combined (was 5 GiB). Connections to cryptocurrency mining pools are blocked on every port. Downloads have no speed limit, and paid sandboxes are not affected. See included usage.
- A wake of a sandbox moving to another server returns 409
sandbox_moving; terminals reattach without errors. A wake, or a call that wakes a paused sandbox, while the sandbox's paused memory and disk are still being copied to another server now returns409 sandbox_movingwithRetry-After, instead of503 no_capacity. The sandbox is unchanged and stays paused. The JavaScript, Python, Go, Java and Ruby SDKs wait and retry it as they dono_capacity. A terminal opened withprocessIdon a shell that another terminal already typed into no longer closes with502 guest_failed("invalid input offset") on its first keystroke. Its input now starts where the shell's input is. - Accounts that have never paid are suspended for mining, port scans or internet sweeps. A sandbox of an account that has never paid that connects to a mining pool, scans ports, or connects to a large number of distinct destinations within a few minutes now has its network cut, and the account is suspended. Accounts that have paid are not affected. See included usage.
- Forks start on another server when the source's server is full.
POST /v1/sandboxes/{id}:forknow returns503 no_capacityonly when no server in the region has room for the copies. When the source's server is full, each copy starts on another server in the region, and the snapshot is copied there first, including large snapshots. The fork's memory limit (a quarter of a server's free memory per fork) now applies to each server the copies can start on, not to the source's server alone. - A sandbox that stops responding is reported within 5 seconds, and a restart no longer reports a kept disk as deleted.
A running sandbox that stops responding now returns
unreachable, withsinceandreason(agent_not_answering,disk_stalledorhost_quarantined), fromGET /v1/sandboxes/{id}, and the new eventssandbox.unreachableandsandbox.reachableare sent to webhooks. Previously such a sandbox returnedrunningwith no indication. When the sandbox's server cannot finish writing to its disk, a new command now returnssandbox_unreachable(503, retryable) after 5 seconds, withdetails.reasonset todisk_stalled. Previously the request waited about 30 seconds and returnedguest_busy(429). The request runs nothing, and commands already running continue.POST /v1/sandboxes/{id}:restarton a running sandbox whose server has not confirmed the reboot's stop now returnssandbox_unreachable(503, retryable) and keeps the disk. Previously it returnednot_resumable(409) withdiskKept: false. A retry with the sameIdempotency-Keywaits for the stop, then starts the sandbox from its disk. A command sent to a stopping sandbox now returnssandbox_stoppedwith "is stopping" instead of "is stopped (ended earlier)". When the server could not pause a sandbox to free disk space, the sandbox keeps running instead of refusing every call. See troubleshooting.
28 October 2026#
- Usage export lists every running-disk charge, including amounts written off. In
GET /v1/usage/export, each sandboxdisk_usedrow now covers all disk usage since the previous row, and its measurements includecarried, the fraction of a microdollar carried in from the previous row. A running-disk charge that your balance, cost cap or spending limits could not cover now appears as a row withchargedMicrosof0and itswritten_off_micros. Charges are unchanged. - Woken sandboxes now end at their time limit. A sandbox woken with
timeoutSecondsnow pauses or stops (asonTimeoutspecifies) exactly when that time limit ends. Previously, a sandbox woken this way and left to reach its limit could be woken again by Runtime and run, billed, up to one moretimeoutSecondspast the limit. - Go, Java and Ruby SDKs: terminals and tunnels stay open when the API restarts. When the API closes a terminal or tunnel WebSocket with code 1012 (Service Restart), the Go, Java and Ruby SDKs now reconnect with the resume token immediately and continue from the exact byte where they stopped, with nothing lost or sent twice; input written during the hand-off is held and sent after the reconnect. Previously, these SDKs ended the terminal or tunnel. See Resuming terminals and tunnels after a restart.
- Terminals, SSH sessions and port forwards stay open when the API restarts. Previously, an API release closed every open terminal and tunnel. The API now moves each one to the instance that serves next: the server sends
{"type":"restart"}, then a resume token, and closes the WebSocket with code 1012 (Service Restart). The JavaScript and Python SDKs, the CLI and the console reconnect with the token immediately and continue from the exact byte where they stopped, with nothing lost or sent twice. Clients that speak the WebSocket protocol directly can follow the same steps; see Resuming terminals and tunnels after a restart. - A request whose egress secret cannot be added returns 503 instead of sending the placeholder. When a sandbox's server has not heard from Runtime's API within the last minute (for example, in the first seconds after a server update), it holds secret values back. Previously, an HTTPS connection opened during that time went to the destination without the secret, and every request on that connection carried the placeholder for as long as the connection stayed open, even after the server heard from the API again. Connections to a secret's host are now always handled by the step that adds the secret. A request that carries the placeholder while its value is held back returns
503 Service UnavailablewithX-Runtime-Egress: secret-not-currentandRetry-After: 1, and the connection closes; the value is added again from the first request after the server hears from the API. Server updates also no longer hold secret values back. - Commands keep running while a server prepares to pause a sandbox. When a server paused a busy sandbox on its own (for example, when its disk ran short), it refused every command from the moment it decided to pause, which could be minutes before the sandbox stopped running, and
GET /v1/sandboxes/{id}still returnedrunningmeanwhile. Commands are now accepted until the sandbox is paused, the pause is reported immediately, and the next command wakes the sandbox. If the server stops running a sandbox without reporting why,execand file calls now return503 sandbox_unreachable(retryable, nothing ran) with a hint to restart it withPOST /v1/sandboxes/{id}:restart, instead of409 not_runningfor a sandbox whose state isrunning. - The audit log records your account's backup encryption key. Each
account's backups, snapshot copies and paused sandboxes stored off the
server are encrypted with a key of its own. The audit log now records when
Runtime creates that key, rotates it (the old key becomes read-only: it
still opens existing backups and encrypts no new ones) and destroys an old
key. A key is destroyed only after no backup, copy or replica still uses it.
Entries are
account.storage_key_created,account.storage_key_rotatedandaccount.storage_key_destroyed. - A command's output stream continues when its server pauses the sandbox. When a server paused a sandbox on its own (to make room for another sandbox, or at the end of the sandbox's time limit) while a streamed
execor a process output read was in progress, the call returned409 sandbox_pausedand the command's output was lost to the caller. The API now wakes the sandbox and resumes the call, and the command runs to its exit. This also applies to anexecsent with anIdempotency-Key(every SDK sends one), which is never run twice. A sandbox withautoWake: falsestill returns409 sandbox_paused. - Sandboxes paused for more than an hour resume in under a second. A paused sandbox's memory and disk now stay on its server until that server needs the room. Before, they were moved to off-site storage one hour after the pause, and a resume after that took 20 to 50 seconds while they were copied back. A sandbox whose server does need the room still resumes from its off-site copy, with its files and running programs intact.
- Stopping a sandbox keeps writes made just before the stop, even when its agent is busy. When a sandbox whose disk is kept (or that has a volume attached read-write) is stopped, Runtime asks the guest to write its pending data to disk before the machine ends. If the guest's agent was briefly unable to take that request, for example while the sandbox was out of memory, the request was not retried, and data written in the last few seconds before the stop could be missing from the disk. The request is now retried until the guest takes it, for up to 12 seconds. The stop itself still returns immediately.
- Sites that block by address are paced per outbound address. Each
outbound address shared by more than one account now opens at most 150 new
connections an hour to Google, Bing, Amazon and the other
sites that block by address, for all
accounts together, and at most 100 an hour for any one account. This
includes the addresses kept for scrapers, which had no limit, so one
account's traffic could get such an address blocked for every account sent
from it. Past a limit, a connection returns
429 Too Many RequestswithX-Runtime-Egress: rate-limited:guarded-siteandRetry-After. Before, one account could open 300 an hour from a shared address. A dedicated outbound address is not limited. - A create whose sandbox is deleted while it starts returns 410
deleted. If a sandbox is deleted before its ownPOST /v1/sandboxesreturns, that create now returns 410deletedwithdetails.sandboxId. It previously returned 404not_found. A create withgetOrCreate: truewhose name's holder is deleted while the create waits for it now creates a new sandbox instead of returning 404. See names.
27 October 2026#
- Connections between your sandboxes are no longer reset in bursts.
Connections by name (
<name>.sandbox.internal) were refused past 100 new connections a second across the whole account, so a sandbox opening several at once saw some of them reset (about 17% with 8 at once). The limit is now 1,000 a second per account and 500 a second per target sandbox, and a connection over it waits for its turn instead of being refused. A sandbox created moments ago is also reachable within about a second; before, it could be refused withprivate-network-offorprivate-network-no-sandboxfor up to 15 seconds. See networking. - Run virtual machines inside a sandbox with
/dev/kvm. New sandboxes on current-generation hosts boot a guest kernel with KVM and expose/dev/kvmto every user in the sandbox, so QEMU, Firecracker or an Android emulator runs with hardware acceleration instead of emulation. A VM inside a sandbox keeps running through pause and resume, and is carried into snapshots and forks. To check whether a sandbox has it, runtest -c /dev/kvm && echo yes. Sandboxes created before this change keep their kernel until they are recreated. - Waking a sandbox keeps the egress CA its running processes trust.
A sandbox started before 26 October 2026 and woken afterwards was given a
new egress CA, and processes that were already running (Node.js with
NODE_EXTRA_CA_CERTS, Bun, Python, Go) failed HTTPS requests that use egress secrets withSELF_SIGNED_CERT_IN_CHAINuntil they were restarted. A wake now keeps the CA the sandbox already trusts and writes nothing to its trust store. See security. - Accepting an invitation adds you only to the account that invited you. A person whose first sign-in was through an invitation link was also given a separate account in their own name. Opening an invitation now creates nothing; you join the inviting account when you select Join. See teams.
- A sandbox at its memory limit stays reachable, and every process killed for memory is recorded.
Linux's out-of-memory killer now never ends Runtime's agent or the
sandbox's network relay, so commands keep running after a kill. Each
process it ends, inside a command or not, is recorded as the event
sandbox.oom_killwith its name, process ID and memory. The event is shown on the sandbox's page in the console and sent to webhooks. When the agent does not answer, the API returnssandbox_unreachable(503, retryable), and names a recent out-of-memory kill when there was one. When the sandbox cannot read its environment, the API returnssandbox_environment_unavailable(503, retryable). Both replaceguest_busy, which now means only that the sandbox is running as many commands as it can.POST /v1/sandboxes/{id}:restarton a running sandbox now reboots it from its disk instead of returning 409not_resumable. See troubleshooting. - Connections between your sandboxes are no longer held to upload limits.
Connections by name (
<name>.sandbox.internal) were limited to 100 Mbit/s per sandbox, and to 20 Mbit/s after the first 2 GiB, as uploads to the internet are. They are now limited only by each server's share of the private network. They do not count toward a sandbox's upload limits or its daily network amount. Each sandbox can still be reached for 100 GiB a day. See networking. - CI/CD jobs stay
queueduntil a machine begins them. A job is nowrunningonly once one of its machine's tasks starts, andsandboxIdslists each sandbox as soon as it begins the job, not only when the job ends. While a job is queued, itsreasonsays what it waits for (for example, "Waiting for a machine: the check's machines are starting, or running other jobs' tasks"), the console shows how long it has waited, and the check'sruntimerun on GitHub says how many jobs are waiting and for how long. Previously a job could reportrunningfor many minutes while its tasks waited behind other jobs' tasks. - Sandboxes in a compartment reach each other by name. With the private
network on, sandboxes created by keys in the same compartment can now
connect to each other at
<name>.sandbox.internalor<id>.sandbox.internal. Before, every connection from a compartment's sandbox was refused withprivate-network-off. Compartments stay walled: a sandbox reaches only sandboxes of its own compartment, or, outside every compartment, only the account's other sandboxes outside every compartment. A name across the wall returns502withprivate-network-no-sandbox. - Requests through a sandbox's web proxy no longer wait 40 ms on responses.
The sandbox's web proxy relay (
127.0.0.1:10800) andguest-egress.py forwardnow setTCP_NODELAYon the program's connection. Previously the kernel held the last segment of any response longer than one segment until the program acknowledged the one before, and most clients delay that acknowledgement by 40 ms. A call to Runtime's API from a sandbox that returns more than about 1.4 KB (creating, pausing or waking a sandbox, reading a file, listing sandboxes) completes about 40 ms sooner, as does any other request made through the proxy. A sandbox uses the new relay from its next boot, or from the wake after its next pause. The transparent relay, used by programs that ignoreHTTPS_PROXY, gets the same change with the next base image. - Speed figures are published only from live measurements. The speed page, the guides, the website, llms.txt and the MCP server's instructions no longer quote the sandbox timings measured in September 2026. The speed page now lists only operations measured by the outside probe each minute whose own time is within 2× of their physical floor, with p50, p95, p99, sample counts and the raw samples. The disk, network and trace overhead measurements moved to observability.
- Change a key's reach or daily limit over the API.
PATCH /v1/keys/{id}(runtime.keys.updatein the TypeScript SDK,runtime keys updatein the CLI) changes a key'sreach(agentoraccount) ordailyLimitMicros(nullremoves the limit). A key can widen only the keys it made, never past its own reach or daily limit, and returns403 forbiddenotherwise. It can narrow any key it sees, and it never changes itself. Each change is recorded in the audit log. Previously only the website could change an existing key. - CI/CD reports a job lost with its machines as "Could not run". When a
job's task is lost on three machines without reporting a result, the job
now ends as Could not run with the reason (for example, "Lost 3 times,
never reported; the last on
: no answer for 265 s"). Previously it was reported as "Failed in 0.0 s: exit code 1" and annotated on a file it never tested. A test failure in the same job still fails it. Lost runs are no longer recorded as test failures in flaky-test history. - Sandboxes reach each other by name on every server. A sandbox can now
connect to another sandbox in its organization at
<name>.sandbox.internalwhichever server runs either one; before, only sandboxes on one server could. Private networks (WireGuard) are reachable from sandboxes on every server too. Connections by name have a daily allowance of 100 GiB for each target sandbox, separate from the private network's 50 GiB. When the private network is briefly unavailable from a server, connections to it return503withprivate-network-unavailableand are never sent anywhere else; retry after a minute. - The speed page is measured every minute, from outside, with the raw
samples. Runtime now times its operations once a minute (volumes every five minutes)
through the public API, from a fixed location outside Runtime (a Cloudflare
Durable Object in eastern North America), and reports Runtime's own time
and the network's part separately, with p50, p95, p99 and sample counts for
the last 24 hours. An operation is listed once its own time is within 2× of
its physical floor, the least time its work can take on today's hardware.
The summary is at
https://status.withruntime.com/speed.jsonand each day's samples athttps://status.withruntime.com/speed/samples.jsonl?day=YYYY-MM-DD(speed). - Every API response includes a
Server-Timingheader. The header,Server-Timing: app;dur=12.3, gives the time in milliseconds from when the API received the request until its response headers were ready. Subtract it from the time your client measured to get the network's share of each call (the API).
26 October 2026#
The CLI says when a newer version exists after it rejects an option. An installed
withruntimestays at its version until you update it, andnpx withruntimeruns an installed copy before it downloads one, so an older CLI could reject an option the docs list, such assecrets scope --only-label, with no sign that it was out of date. Now, when the CLI rejects an option or a command, it checks npm for the latest version, for at most 1.5 seconds, and prints the installed and latest versions withnpm install -g withruntime@latest. It skips the check in CI and whenRUNTIME_NO_UPDATE_CHECK=1is set (the CLI).Raising a job's timeout no longer requires changing its compute. Previously,
PATCH /v1/jobs/{id}with only a largertimeoutSecondsreturned 400 with "Invalid integer" when the new timeout exceeded the job'scompute.durationSeconds. Now the update extendscompute.durationSecondsto the timeout plus 60 seconds of start time, up to 3,600, as a create does. A timeout that already fits leaves it as it is. Refusals oftimeoutSecondsandcompute.durationSecondsnow name the field and the allowed range.HTTPS through egress secrets and preview links keeps working after a sandbox moves to another server. Previously each server signed with its own certificate authority, so a process started before a wake, a move or a fork onto another server (such as Node with
NODE_EXTRA_CA_CERTS) failed every request to an egress secret's host withSELF_SIGNED_CERT_IN_CHAINuntil it restarted. Now each organization has one certificate authority, the same on every server, and running processes keep working. Each sandbox switches to its organization's certificate authority at its next start or wake; a process started before that switch must be restarted once. See Security.Sandboxes created from older images hold as many outbound connections as their limits allow. Previously a sandbox created from an image or snapshot made before 15 October 2026 kept that image's web proxy relay, which held 64 connections and closed the 65th without a response, even when
GET /v1/sandboxes/{id}/networkreported a higherlimits.connections. Now every sandbox boots with the current relay, so it holds its full limit and a connection past it returns503 Service Unavailablewith the limit inX-Runtime-Egress. A sandbox that resumes saved memory (a wake, or a copy of a memory snapshot) takes the current relay immediately before its next pause, so it holds its full limit from the wake after that. See The network.Agents that start from a repository start their sessions. An agent whose definition sets
from: {"repo": "owner/name"}starts each session from that repository's CI/CD warm snapshot. Previously every session of such an agent ended immediately withsandbox_refused(403forbidden, "a create naming another snapshot"), because the session's key was allowed to create its sandbox only from a snapshot the definition names by id. A session's key may now create its sandbox from any ready warm snapshot of the definition's repository, and from no other snapshot.A secret can now be given to the machine as its real value. Some secrets are not HTTPS headers: a database password, an SSH key, a signing key or a service account's JSON file. Store one with
--exposed(orexposed: truein the API, the MCP tool and the SDKs) and the machines it reaches get the value itself in its variable. It may be any text up to 64 KiB, several lines included. The value is still sealed, and opened only on the server that runs the machine. Code in the machine can read it, so the placeholder kind stays the default and the one to use for HTTPS APIs. For the same reason, it goes only to the sandboxes and Apps you name by id (--only-sandbox,--only-app), never to every sandbox or by label, and only a key that may run commands in each of them can store it. Which machines get it changes only when you store it again with its value. Every secret now has a version too, one more for each change to it: its value, who gets it, its hosts or its variable. Pass it asexpectedVersion(--expected-version) and a write happens only if no one has changed the secret since; otherwise the answer is 409version_conflict.GET /v1/egress-secrets/{name}andruntime secrets getshow one secret's kind and version, never its value. The website's Secrets page offers both kinds and shows each secret's kind and version. See a secret the machine needs itself.A failed agent session shows why in the console. When a session fails because its sandbox could not be created (
sandbox_refused), the session's page in the console now shows the error the API returned, which previously appeared only in the session's events.App deploys report
liveonly when the address serves them. A deploy reachesliveonly after every router serves the new version's route, and an App'sstateiswaitinguntil its first version is served, sowaitFor=live,runtime apps deployand the SDKs return when the address answers from the new version.CI/CD: built-in and light-sandbox steps record their result immediately. An
undoesorhot-spotsstep, a gate, or amachine: lightstep now shows its result in the console as soon as it finishes, instead of when the check's other jobs end. Previously such a step stayed "running" until then, and a check whose other jobs waited more than 40 minutes for capacity failed with "undoes sent nothing for 40 minutes" although the step had passed.GET http://runtime.internal/v1/identity/tokenreturns 401 for a request token that is not the sandbox's current one. It previously returned 403. Read the current token fromhttp://runtime.internal/v1/environmentand retry. The JavaScript and Python SDKs already do this for both statuses.Browsers start with Chromium already running. A headless browser at the default window size (1280 by 800) is now created from a snapshot of Chromium that is already running, instead of starting Chromium in the new sandbox, which took 1 to 3 seconds. Each browser gets its own CDP secret, its own random state, and an empty profile. A server builds the snapshot the first time a browser of that size is created on it, so that first browser starts as before. Other settings start Chromium as before.
An outbound connection that cannot reach Runtime's web proxy returns
503 Service Unavailablewith the reason. Previously the sandbox's relay closed such a connection without a response, which clients reported asConnection reset by peer. Now the response carriesX-Runtime-Egress: proxy unreachable (<reason>)andRetry-After: 1. A sandbox holds about 1,000 outbound connections at the same time, fewer thanlimits.connectionsfor a sandbox with more than one vCPU, until a later release raises it; past that, new connections return this response.A sandbox with no time limit can be funded up to 12 hours ahead. Set
leaseSeconds(from its first lease, 1,800 seconds, to 43,200) on create or:update(--leasein the CLI,lease_seconds=in Python,.leaseSeconds()in Java,LeaseSecondsin Go), and each renewal funds it that far ahead instead of 1,800 seconds. It is renewed when half is left, so it keeps running for at least half ofleaseSecondsif Runtime's control plane cannot renew it. Each renewal holds that much time's credit at the sandbox's rates; what it does not use is released. A sandbox on the free usage renews by 1,800 seconds until the account has credit. Only an owner's, an admin's or an account-wide key may set it, on a sandbox one of those made. If that key or member loses the right, a sandbox funded past its first lease is paused or stopped at once, as its lease's end would. A sandbox's details include itsleaseSeconds.CI/CD: a cancelled check names the key that cancelled it, and your production branch's check gets machines sooner. A check cancelled with
POST /v1/ci/checks/{id}:cancel,runtime ci cancelor the MCP tool now shows the reasonasked through Runtime's API with the key "<label>"in the console, in the API'sreasonfield and on GitHub, where<label>is the calling key's label. The audit log entry also includes the key's id. When your account's machine limit is reached, your production branch's check now takes machines from your pull requests' checks as their running tasks end. Previously it waited for those checks to finish when the limit, rather than the servers, held it back.Slack triggers start agent sessions from a channel. Add Runtime's Slack app to a workspace with
runtime agents slack install(orPOST /v1/agents/slack/installs; the link works only for a signed-in member of the account), invite it to a channel, and add aslacktrigger with the workspace'steamand the channel's id. Each new message in the channel starts a session; a reply in its thread joins that session. The session's replies and result are posted in the thread, its status is one message edited in place, and each ask is posted with a button for each option.GET /v1/agents/slack/teamslists the added workspaces andDELETE /v1/agents/slack/teams/{team}removes one. Available in the JavaScript, Python, Go, Java and Ruby SDKs (agents.slack).SSH to Runtime's own servers counts toward its own limit in the probing check. SSH connections from a sandbox to the public addresses of Runtime's servers are still refused. They now count toward a separate limit of 10 different servers in ten minutes, instead of the limit of 5 internal addresses. Previously, a test suite that tried SSH on five of them within ten minutes could have its sandbox held. Connections to Runtime's servers on other ports still count toward the internal-address limit.
A paid account's sandbox is reviewed by a person before it is halted. When the abuse checks flag a sandbox of an account that has paid, it is held as described above and keeps running, with its processes and files untouched. A person then lifts the hold, which turns the network back on, or confirms it, which pauses the sandbox. Previously, the sandbox was paused immediately.
A sandbox held by the abuse checks keeps its files readable. You can read and download a held sandbox's files with
GET /v1/sandboxes/{id}/files/contentorGET /v1/sandboxes/{id}/files/archive. A read wakes the sandbox if it is paused, and it can also be woken or started. Previously, every wake and start of a held sandbox returnedsandbox_halted(403), so its files could not be read. While the hold is in place, the sandbox's network is off for outbound and inbound traffic (previews, custom domains, TCP ports and private networks), and commands, terminals, file writes, snapshots and forks returnsandbox_halted(403). See Network access.A lease that ends without you never deletes a sandbox's disk. Only a request from you deletes data. Previously a sandbox created with
onTimeout: "delete"had its disk deleted when its lease ended before its time limit (a renewal that did not arrive, or a pause that failed at the lease's end), and a sandbox created withpausable: false, one on a server that stopped responding, or one stopped while moving between servers had its disk deleted when its lease ended or it crashed. Each is now kept: a pausable sandbox as a stopped sandbox you can restart, billed as paused storage; the others at no charge, until you delete them.onTimeout: "delete"still deletes the disk when the time limit you set ends.CI/CD: built-in history checks finish immediately on production pushes. On a push to the production branch, an
undoesorhot-spotsstep now passes as soon as the plan is made, because the pull request was already checked. It no longer waits for a sandbox. On a pull request, these steps still run on the check's light sandbox. While that sandbox, or the one that runs gates, waits for capacity, the console shows "Waiting for room" on each of its jobs, with the elapsed minutes updated every 5 minutes. Previously these jobs showed no update while they waited, and a check whose jobs waited more than 40 minutes failed with "sent nothing for 40 minutes".Commands in sandboxes and App copies can open 65,536 files. The open-file limit is 65,536, previously 4,096, and a process can raise it to 1,048,576 without root (
ulimit -n 1048576), so one server holds tens of thousands of connections. See Limits of one sandbox or one feature.Move scheduled jobs from Trigger.dev, Inngest, Modal, Google Cloud Run and AWS Batch. Change one import, or run one command, and the jobs run on Runtime unchanged, with their schedules, sizes, timeouts and retries.
withruntime/triggerruns Trigger.devschedules.taskandtaskdefinitions, andwithruntime/inngestruns Inngest functions with cron or event triggers;runtime jobs deploybuilds the project and creates one job per task.python -m withruntime.modal deploy app.pycreates a job for each Modal Function with aschedule(modal.Cronormodal.Period).runtime jobs importreads a Cloud Run job's YAML with its Cloud Scheduler job, or an AWS Batch job definition (API JSON,describe-job-definitionsoutput or a CloudFormation template) with its EventBridge schedule or rule, and creates the jobs. Settings with no equivalent, such as a GPU, parallel tasks or a mounted bucket, are listed with the reason. The plan is also available asPOST /v1/job-imports,jobs.importPlanin every SDK and theruntime_jobs_importMCP tool. Requires SDK 0.36.0 (Python 0.34.0). See Move jobs from another platform.OpenTelemetry exports can send traces. Add
"traces"to an export'ssignalsand every API call your account makes, including creates, commands, file calls, pauses, wakes and snapshots, is sent to<endpoint>/v1/tracesas an OTLP span within about a second, with the OpenTelemetry HTTP attributes and the request ID. A call that carries a W3Ctraceparentheader becomes a child of the caller's span; the TypeScript and Python SDKs send that header automatically when OpenTelemetry is set up in your process. Exports now reportexportedSpans, and the span pushes' own health intracesLastSuccessAt,tracesLastErrorandtracesFailures, apart from the logs' and metrics'lastErrorandfailures. The default signals are unchanged (traces).Sandbox metrics include disk and network.
GET /v1/sandboxes/{id}/metricsandsbx.metrics()now returndiskUsedBytes(bytes used on the root file system),diskReadBytesPerSecond,diskWriteBytesPerSecond,diskReadOpsPerSecond,diskWriteOpsPerSecond,networkReceivedBytesPerSecondandnetworkSentBytesPerSecondfor each point and forlatest. Disk figures are counted by the sandbox's own kernel; network figures by the host, for every connection the sandbox opens and every request it serves. A value that was not measured isnull, never zero. The sandbox's Activity tab charts disk used, disk reads and writes, and network in and out;runtime sandboxes metricsprints them; the Python, Go and TypeScript SDKs return them; andgetMetrics()inwithruntime/e2bnow returnsdiskUsed. OpenTelemetry exports send them asruntime.sandbox.disk.usage,runtime.sandbox.disk.limit,runtime.sandbox.disk.io,runtime.sandbox.disk.operationsandruntime.sandbox.network.io(metrics).
25 October 2026#
Waking a sandbox paused moments earlier returns sooner.
POST /v1/sandboxes/{id}:wakenow returns as soon as the sandbox's processes run again. Its clock is corrected immediately after, before any later command for it runs, and the server records the wake with one round of disk writes instead of three. Memory, processes and open files are kept as before.API requests no longer return
controller_standbyduring a controller release. While Runtime switches its API to a new release, a request that reaches the previous release is held and then served by the new one, instead of returning503 controller_standby. Such a request can take up to a few seconds longer during the switch; it no longer needs a retry.App and Function deploys go live, or fail immediately with a clear error. Production now runs the address router and the controller loop that switch an App or Function to a new version and route its address to its copies. Previously a deploy could stay in
switchinguntil the next deploy replaced it, and the App's address returned 404. Where that controller is not running,POST /v1/apps/{id}/deploys,/rollbackand:restart(and the same Function routes) now return 501feature_unavailableimmediately and change nothing.Image deploys that cannot start fail with the reason. When the API refuses an image's start command (for example
cwd_not_found, because the image's start directory does not exist or cannot be entered), the deploy now fails immediately withdeploy_health_failedand that error inlastOutput. Previously it was retried three times and failed with "warming the image stopped 3 times without an answer".Saving an egress secret returns in under half a second.
PUT /v1/egress-secrets/{name},DELETE, the scope and rules changes, and the upstream proxy calls now return as soon as the change is stored. Each server that runs your sandboxes receives the change at the same time and usually applies it within a second. Previously the call waited until every such server confirmed the change, and took 10 to 26 seconds for an organization with sandboxes on many servers.enforcedistruewhen every server confirmed before the response, andfalsewhile one is still applying it.Status page hosted outside Runtime: status.withruntime.com. status.withruntime.com shows the current state of the API, the website and sandbox creation, measured from six regions outside Runtime's own servers, so it remains available when Runtime or withruntime.com is not. The sandbox check creates the smallest sandbox, runs a command in it and deletes it; a
no_capacityresponse counts as a failure. Each check shows up, down since a given time, or no recent reading, with a 24-hour history, uptime and median latency. The same data is available as JSON athttps://status.withruntime.com/status.json. withruntime.com/status links to it.Snapshots and forks of long-paused sandboxes.
POST /v1/sandboxes/{id}:snapshotandPOST /v1/sandboxes/{id}:forkno longer return 409snapshot_unsupportedfor a sandbox paused long enough for its disk to move to cold storage. The sandbox is restored from its stored copy first (up to 120 s) and is paused again afterward, including when the request fails. A paused sandbox's disk now moves to cold storage one hour after its last use, and only once its stored copy is verified.A sandbox can run as root by default. Create it with
user: "root"(--user rootin the CLI,user=in Python,.user("root")in Java,User: "root"in Go), or set it later with:update, and its commands, background processes and terminals run as root, through its passwordlesssudo, with nosudoin front of each one. A call can still nameuser: "sandbox". Forks and copies of its snapshots run as root too; files written through the files API and SSH logins stay the sandbox user's. A sandbox's details include itsuser. See who you are.Pagination for secrets. The
listaction of theruntime_secretsMCP tool now supports pagination withlimit(1 to 100) andafter, as its schema documents. Pagination is also supported byGET /v1/egress-secrets(pass the response'snextvalue asafterto get the next page),secrets.listin every SDK, andruntime secrets ls --limit --after. Theruntime_secretsschema now states which action accepts each field, and a field sent to the wrong action returns an error that names the correct one.Clearer comparison and calculator pages. The pages in the compare and calculators guides use plainer English: shorter sentences and one name for each term. Two figures were corrected: the Blaxel cost in the Daytona vs Blaxel comparison now shows Blaxel's cost instead of Daytona's, and the Runloop vCPU rate on the Runloop alternatives page now shows the published CPU rate instead of a memory rate.
New private networks and dedicated outbound addresses are temporarily unavailable. Creating a private network or reserving a dedicated outbound address returns
503 no_capacityuntil gateway servers and address pools are added on sandbox servers. Existing private networks and addresses are unchanged. When they return, each new private network is assigned to one gateway server, itsendpointis that server's address, and the organization's sandboxes run on that server; networks and addresses are spread evenly across servers.
24 October 2026#
Internet off with an allow list reaches the list. A sandbox created or set with
network: {internet: false, allow: [...]}was refused every connection (X-Runtime-Egress: internet-off), though its rules showed the list. Internet off with anallowlist is now allow-list only: the sandbox reaches the listed destinations and nothing else, and its rules are stored and shown asinternet: truewith that list, on create and onnetwork.setalike, in the API, every SDK, the CLI, MCP and the console. Internet off with noallowlist still reaches nothing. See the network.A command's record says how it ended. A command whose answer was lost on the way back (its connection cut, or its sandbox stopped or paused under it) is kept as "its answer was lost" (outcome
unknown), where it left no record. One still running when its sandbox is stopped or deleted showsended by the sandbox's stop(ordelete), not running for ever. A command that timed out keeps the time limit it ran under. Andbwrap(bubblewrap), which Codex runs its commands under, is in the default image from its next build. See commands and processes.Volume backups go first, and one that can't start says so. A volume backup's copy off its server goes ahead of Runtime's own copies there, never behind one, and
copyStartedAtsays when it began. A backup whose copy hasn't begun 15 minutes after you asked fails witherrorCodebackup_stalledrather than stayingpending, unless other backups on its server are moving up the line. The volume is unchanged; back it up again. See volume backups.Pauses, wakes, restarts and stops are in the audit log. Each pause, wake, restart and stop of a sandbox is an audit log entry (
resource.paused,resource.woken,resource.restarted,resource.stopped) with who asked; one Runtime did itself says why: it sat idle, it reached its time limit, credit ran out or a spending limit was hit. A volume inside the free 10 GiB, and a job on an account without credit, now readfunding: trial, notpaid. See the audit log.Support chat asks you to sign in. The Help chat on withruntime.com is for signed-in accounts: signed out, it asks you to sign in and brings you back to the page, and
POST /api/support/chatanswers401. Without an account, write to support@withruntime.com.runtime_support,npx withruntime supportand Support in the console are unchanged. See get support.A sandbox's page in the console loads again. A sandbox's page could fail to load: the server and the browser wrote its chart's and events' dates differently (
Sep 23 at 10:30againstSep 23, 10:30), and the browser threw the page away. Both now write them the same way.Volume backups on your own schedule. A volume can be backed up every N minutes (15 or more) or on a cron in UTC instead of daily, and keep its backups by counts: the last N, and the newest in each of the newest N hours, days, weeks, months and years. The newest ready backup is always kept. Set it with
scheduleandkeepon the backup policy, in every SDK, the console, MCP,/v1/volumes/{id}:backup-policyand the CLI:runtime volumes backup-policy <id> --every 60 --keep hourly=24,daily=7.schedule: nullgoes back to daily, anddailyandretentionDayswork as before. See volume backups.Sandboxes start from your larger images with no disk to name. A sandbox created from an image of yours larger than the default 4 GiB disk, with no
diskMiB, was refuseddisk_too_small. An image of up to 8 GiB now gets an 8 GiB disk, within the 10 GiB a running sandbox's disk includes, and starts from the image's started copy of that size. A larger image is still refused, now naming thediskMiBto ask for; adiskMiByou name is kept. See images.Upload links take the 5 GiB they say. An upload link (
files:linkwithmethod: "PUT") refused a body over 64 MB as too large; it now takes up to itsmaxBytes, 5 GiB at most, in one request, streamed into the sandbox, with nothing to split. A sandbox can open a file link too, to download or upload with no key. See file links.The usage export says how far it is final, in every SDK and the CLI.
runtime usage exportends by saying on stderr how far the range is final: no more charges will settle before that time. The Python, Go, Ruby and Java SDKs gain the export (usage_export,UsageExport,usageExport), withfinalThroughon each page andfinalon each row. See export settled usage.E2B's client works in the drop-in.
new E2B({ apiKey }).Sandboxin JavaScript, and nowE2B(api_key=...).Sandboxin Python, create and connect with the client's key. The client'sTemplate,VolumeandSecretrefuse before anything happens, naming what to use instead: a Runtime image, Runtime volumes or a Runtime secret. See migrating.
21 October 2026#
Previews are never indexed. Every answer on a preview address, private or public, carries
X-Robots-Tag: noindex, nofollow, and each preview address serves Runtime's ownrobots.txt, so no preview shows up in search. A custom domain serves your site's own headers androbots.txt; use one for a site that should be found. See search engines.First in line by plan when room is short. When a region is short of room, the room that frees goes first to the highest lane waiting for it: Enterprise, then Scale, Pro Max, Pro and Free, from the account's plan, and Runtime's own work after every customer's. Until an account chooses a plan, paying accounts go before trials. A create or wake refused
no_capacitykeeps its place while it is sent again with the sameIdempotency-Key, as the SDKs do, and the refusal says its place, how many wait ahead and its lane, also indetails.line. Nothing already running is stopped for a higher lane. See waiting in line for room.A slow upload is given the time to arrive. A request's 110 seconds to answer now start once its body has arrived, so a chunk of a large upload over a slow or busy link is no longer cut while its bytes are still coming in, and answered
503 api_unavailableas if the API were at fault. A body may take up to about 280 seconds to arrive. One still arriving after that is answered408 request_timeoutwith the bytes received so far; the SDKs and the CLI get503 body_stalledand send it again by themselves. Many uploads at once over one slow link share it: send fewer at once. See files.30 days to top up. When credit runs out in an account that has bought credit or saved a card, its stopped and paused sandboxes' disks are kept 30 days, not seven, with a notice first and a warning the day before, and adding credit in that time keeps them. Other stored items, and every item in an account that has done neither, keep their seven days. See when your balance runs out.
A scheduled job keeps data between runs on a volume. A job's
compute.volumesattaches up to four of your volumes to every run, each at a path, as a sandbox create does: read-write, one run at a time, so each run reads what the last one wrote, or a read-onlysnapshotcopy. In the CLI,runtime jobs create ... --volume <id>:/data, and for a job you already have,runtime jobs update <job> --volume <id>:/dataor--no-volumes; in the SDKs' next release. A run that waits for its volume says so withblockedReasonvolume. See Keep data between runs.A full region answers 503, and an account at its limit 429. No room for a sandbox, a fork, a restart, a wake, a build or a volume,
no_capacity, is now503 Service UnavailablewithRetry-After: 1. The account at a limit on what runs at once,quota_exceededorno_credit_running_limit, is now429 Too Many RequestswithRetry-After: 5. All three were409 Conflict, which a client that retries only 5xx and 429 gave up on. Such a client now retries them with no change. The body is the same, so code that readserror.codekeeps working. In the SDKs' next release the error's class follows the status:no_capacityis aServiceUnavailableError, and the two limits are aRateLimitError, not aConflictError. The SDKs still wait them out on create, wake and restart, and return them at once elsewhere, as before. See errors.Every error says whether to retry it, and its status means what HTTP says. Each error now has
retryable,trueorfalse; a retryable one always carries aRetry-Afterheader, and no other does. Each code has one status, listed with every code in Responses and errors and in the OpenAPI document'sx-error-codes. Codes are unchanged, so code that readscodekeeps working; a check on the status may need a look:- 409 is now only a state you change first, or one that clears by itself
(
snapshot_not_ready,image_not_ready,volume_releasing, ... are retryable). - Your own limits that clear by themselves are 429, always with
Retry-After:quota_exceededon what runs at once (details.limitsuch assandbox.countorsandbox.memory_mib), theno_credit_*limits on what runs,process_limit,transfer_limit,guest_busy,build_in_progressand the daily caps. - A count that falls only when you delete something is 409, with
retryable: falseand noRetry-After, so no retry library retries it:no_credit_kept_limit,limit_reached(keys, invitations, compartments) andquota_exceededon what is kept (volumes, snapshots, images, secrets,sandbox.kept). Delete one, or raise the limit. - A full region or host is 503 with
Retry-After:no_capacity,host_capacity,own_share_full. - A product switched off on a deployment is 501, not 503, so no client retries it.
- A fault of ours that a retry does not fix is 500 (
operation_failed,price_unavailable, andwatch_failed: Runtime's own file watcher in a sandbox); a service behind the API is 502 or 504. - A request that cannot be done as asked is 422:
disk_too_small,idempotency_conflict,no_credit_size_limit, a program in your sandbox that failed (interpreter_failed,tunnel_unavailable).
- 409 is now only a state you change first, or one that clears by itself
(
The SDKs read
retryable(in the same versions). They retry an answer that saysretryable: trueafter itsRetry-After, and never one that saysfalse. A create, wake or restart waits out room and the account's limits for its own wait for room (two minutes by default;0returns at once), and a fork returns them at once. An answer whose wait is over a minute (a daily cap) is returned at once, withretryAfterMs. The Go, Ruby and Java SDKs now also resend a call refusedguest_busy,busyorrate_limiteduntil its deadline, as JavaScript and Python do. The CLI's--jsonerrors carryretryableandretryAfterMs.Accounts without credit hold up to 10 API keys. A new key past ten is refused with
no_credit_key_limit(409) and says how to make room: revoke a key you no longer use, or add credit, after which there is no limit. Every key an account already holds keeps working, and keys Runtime makes for the console, its terminals and image builds are not counted. See free usage.
20 October 2026#
runtime.appsin the TypeScript SDK, for the Apps private beta.withruntime's next release (npm i withruntime@latest) hasruntime.apps: create an App, deploy an image to it, follow the deploy, roll back, and list its versions and copies. Apps is a private beta for now: an account outside it getsproduct_in_beta(403), with a hint to ask support to join.Book room for a burst. Book room for up to 10,000 sandboxes of one size for a window of up to 24 hours, starting now or within 14 days, and be told at once whether you have it. In the window your creates are never refused
no_capacityorquota_exceededup to what you booked; sandboxes you run bill as usual. A decline says why, the most that fit and the nearest window that takes them all. In the API (POST /v1/reservations), the JavaScript, Python, Go, Ruby and Java SDKs (runtime.reservations), the CLI (withruntime reservations book) and MCP. See Book room for a burst.Booked room left unused costs a little. Room a booking holds that none of your sandboxes uses now costs a quarter of the memory rate, $0.001875 per GiB-hour, with no CPU charge; sandboxes you run bill as usual. 300 sandboxes of 2 GiB booked for 2 hours cost at most $2.25 if none run, and nothing if you cancel at least an hour before the start. A booking's answer, the CLI and the console's Booked room card say the most it can cost. See What it costs.
Standing room for a pool. Keep room for a pool of sandboxes until you cancel it: name the snapshots it forks from and the room is held on the servers holding them, so a sandbox replaced after each use is never refused for room or limits.
forKeykeeps it for one key's sandboxes, andinUsesays how much of it runs now. Room none of them uses costs a quarter of the memory rate, $0.001875 per GiB-hour. See standing room.Audit log entries older than 400 days are now removed. The audit log has always promised to keep each entry for at least 400 days; until now it kept every entry forever. From this release, entries past 400 days are deleted, oldest first, and none younger is ever touched. See the audit log.
Node trusts HTTPS from a sandbox's first command. A sandbox with egress secrets checks its HTTPS with Runtime's own certificate authority, and Node, which keeps its own roots, learns it from
NODE_EXTRA_CA_CERTS. A sandbox's or a scheduled job's first commands, in its first few seconds, could start without that variable, and Node refused every HTTPS call withSELF_SIGNED_CERT_IN_CHAIN. They now have it from the start. See networking.The CLI says when a certificate is not trusted. Behind a proxy or firewall that inspects TLS with its own authority, every call failed as "No answer from Runtime". It now says the certificate presented is not one your machine trusts, with its code, and to point
NODE_EXTRA_CA_CERTSat the proxy's certificate.runtime images build -freads the Dockerfile asdocker builddoes.runtime images build . -f apps/web/Dockerfilebuilds a monorepo's app with the repository as its context:-fis read from where you run the command, and a path inside the folder still works. See images.Apps and Functions: what Cloudflare's cache serves is outbound traffic (private beta). Once Cloudflare's cache serves Apps and Functions, the bytes it serves for an App's or a Function's addresses and custom domains, without reaching it, are charged as outbound traffic, the same as a sandbox's: from the account's 100 GiB a month free first, then $0.02 per decimal GB. They are read from Cloudflare's analytics an hour at a time, charged once per hour, and shown in
GET /v1/usageunderoutbound. An App or Function made without credit sends for free and uses none of the allowance.Storing several secrets at once no longer fails. Writing egress secrets (
PUTorDELETE /v1/egress-secrets/{name}) or the upstream proxy from parallel jobs of one account used to fail with 503 busy for all but one of them. Now the writes wait in line and each one succeeds. See the API.Sandbox desktop, browser, MCP servers and mounts in the console. A sandbox's page now lets you open its desktop and watch it live, record it, start or stop its browser, and see or stop its code contexts, MCP servers, bucket mounts, file watches and tailnet, each stop asked first. Networking gains the switch for your sandboxes to reach each other by name.
Faster website on phones. Pages on withruntime.com no longer download two extra font files, 140 KB, to look for a single character such as "10⁹" or "✓": the home page loads about a third lighter on a phone, and the pricing, comparison and blog pages about a fifth lighter. See pricing.
Clearer page titles in search results. Guides now show titles that say what they cover, such as "Python SDK for agent sandboxes" or "Custom sandbox images from any Dockerfile", so they are easier to find. See the Python SDK.
CI/CD leaves no run "Waiting" on GitHub after its check ended. A check restarted midway, or one whose tests were split into a different number of parts, could leave old
runtime / …runs queued or in progress on the commit for good, though the check itself had passed, failed or been cancelled. Within a few minutes of a check's end, every run of it GitHub still shows open is now ended: a job's run with its job's result, an extraruntimerun with the check's own, and a run of a job the check no longer has as Cancelled, "Not run: its check ended before this run of the job began." Another check of the same commit keeps its runs as they are.A CI/CD check that can no longer finish now fails, with the reason. Before, a check whose runner stopped, or whose job hung, could show "in progress" on GitHub for hours. Now it fails within minutes of the point it can no longer finish, saying why: a job sent nothing for longer than its 30-minute limit, no machine came for its jobs in 45 minutes, no runner has held it for 30 minutes, or it waited an hour to start. Re-run it on GitHub to check the commit again.
Choose what happens when an App release gets worse (private beta). An App or Function now has
releaseWatch: when a new version's errors or speed get clearly worse in its first 15 minutes,alert(the default) tells the account's owners,rollbackalso goes back to the previous version by itself, andoffdoes neither. Each release judged worse posts anapp-release-worsenotice toGET /v1/noticesfor every owner, shown on Usage & billing and emailed to them. Set it on create or update from the API, the MCP tools, or the JavaScript 0.24.0, Python 0.22.0, Go 0.11.0, Ruby 0.10.0 and Java 0.10.0 SDKs. Only an account-wide key made on the website turns it off: a key in a compartment, a key made by another key and a sandbox's own session key may choosealertorrollback, andoffis refused with403 forbidden(compartments, run a swarm).A job tells you when it fails, runs your image, and changes in place. A job's
alertposts to your webhook, signed with a jobs secret, or emails you once runs fail in a row, with the run's reason, exit code and last lines of output, and once more when a run succeeds again. Your account's webhooks hearjob.run.failedandjob.recovered.--imagestarts each run from an image of yours, andruntime jobs update(PATCH /v1/jobs/{id}) changes a job's command, image, size, secrets, alert, timeout or retries and keeps its history. Inwithruntime0.29.0 for JavaScript and the CLI, and 0.28.0 for Python. See alerts.Every App has a readable address (private beta). Every App and Function, those you have and every new one, answers at its name, 16 random characters, then its account's handle:
https://shop-3f9a1c2e7b04d915-acme1.runtimehost.com/for the Appshopof the account Acme, inurlon the App and its deploys, in the API, the console and every SDK. It is kept for life: a rename leaves it, and a handle is never another account's, even after an account closes. Every App keeps its id's address too.A disk snapshot of a sandbox that is writing no longer fails. A
mode: "disk"snapshot of a running sandbox used to fail with "could not confirm that its writes reached its disk" whenever a program in it was writing. Its pause now waits for the sandbox to write out what it still held in memory before the snapshot is taken. That takes milliseconds when the sandbox is quiet and can take a few seconds while it writes. Memory snapshots are as fast as before. See the API guide.A trust center for your security review. withruntime.com/trust gathers what a security team asks a vendor for on one page: the public documents, where data lives, how sandboxes are kept apart, encryption, sign-in, availability and recovery, every subprocessor, and how to report a vulnerability. A filled-in questionnaire is on request from security@. See security and compliance.
19 October 2026#
- Fly Machines API on Runtime. Code written for Fly's Machines API now
runs on Runtime by changing one address: run
npx withruntime fly-apiand pointFLY_API_HOSTNAME(or fly-go'sFLY_FLAPS_BASE_URL) at it. Each Machine is a sandbox;init,env,files, metadata, leases and the restart policy work, and what isn't supported is refused with Runtime's alternative. Node services can serve it themselves withmachinesApi()fromwithruntime/fly. See switching from Fly Machines. - Every router serves the same routes, and a copy stops only once none
sends it visitors. An App's or a balancer's change counts served only once
every Runtime router serves it, so a deploy's old copies stop only after no
router can still send them a visit. A router that has never had its route
table yet answers
router_not_ready(503,Retry-After: 1) instead ofno_route. See Networking. - Functions in the CLI and the console (private beta).
runtime functionscreates, deploys, lists, reads, updates, rolls back and deletes Functions, and lists their releases, versions and copies, asruntime appsdoes for Apps. In the console, Functions has a list of its own beside Apps, and each Function a page with its calls, errors, releases, copies and logs, with deploy and rollback. Outside the beta these are refused withproduct_in_beta. See the CLI. - Snapshots kept while you have credit have no end date. A snapshot taken
without
retentionDaysused to be deleted a year after it was taken, even with credit on the account. Now it is kept for as long as you have credit, as the 4 October entry said. See pricing. - The Vercel-compatible snapshot's
expiresAt. For a snapshot kept while you have credit it now reports a year from now, moving on with each read, instead of a year after the snapshot was made, a date that would pass while the snapshot was still kept. In the JavaScript SDK's next release. - The data processing addendum, privacy policy and subprocessors page say more, and say what is true today. A new subprocessor is listed at least 30 days before it starts, and you may object within those 30 days; email legal@withruntime.com to be told when the list changes. A breach affecting your data is reported to your account's owners within 72 hours, with what happened, who and what it touches and what we are doing. Closing an organization destroys its key first, then deletes its data, and the addendum gives every step's time limit, including each server's own nightly backup, gone within 44 days. Once we hold a SOC 2 report, it is shared under a confidentiality agreement as our answer to audit requests. The addendum lists the security measures we run now. Anthropic, which runs the AI model that answers support, and Slack, which carries our team's alerts and support drafts, are now on the subprocessors page. See security and compliance.
- Keep-alive ends when its sandbox is deleted. In every SDK, a sandbox's
keep-alive (
keepAlive,keep_alive,KeepAlive) now ends at the first answer that the sandbox is gone, as when it was deleted by id from another handle or another process. Before, it went on reading the deleted sandbox once a minute for as long as the program ran. - Storage is limited in GiB, not only counted. An account keeps up to
500 GiB in all with credit (50 GiB without): snapshots, images, volumes,
volume backups and paused or stopped sandboxes, measured as they are
billed; snapshots up to 250 GiB of it (20 GiB without). Past a limit nothing
is deleted or stopped: a new snapshot, image, backup or volume is refused
with
quota_exceeded, naming the limit, until there is room. An account that already stored more than a limit when it began has what it stored then as that limit. Both are on the Limits page and inGET /v1/limits. See limits. - Requests in flight grow to your sandbox quota. An account's requests in flight grew by six for each sandbox it holds only up to 1,024 (138 sandboxes). Now an account whose sandbox quota support raised past 138 keeps growing, six for each running sandbox up to that quota: 2,592 for 400 running, so each can stream four commands and two watches at once. Watch streams, SSH logins, port forwards and terminals grow with it. See limits.
- A command may run 15,360 processes and threads. One command and everything it starts may hold up to 15,360 processes and threads together, of a sandbox's 16,384; it was 1,024. Test runs that start many processes, Java and parallel builds on a sandbox with several vCPUs no longer fail to start a thread. A sandbox gets it the next time it starts; a custom image, once it is built again. See limits.
- Started copies are kept for images in use. A server keeps an image's started copies (the ones a sandbox starts from in about half a second) while sandboxes are created from that image there. Once none has been for 2 days, the copies go. The first sandbox after that gap boots the image (a few seconds), and the ones after it start from copies again. Before, every image version kept its copies on every server it reached, used or not. See Images.
- See which files a command read. Run a command with
traceFiles: trueand its answer lists every file and folder it, and anything it started, opened, and every file it wrote; other programs on the sandbox never show up. Key a test cache by those files and rerun only the tests whose files changed. Background processes, every SDK andruntime sandboxes exec --trace-fileshave it too. See commands and processes. - A paying account's stopped sandboxes keep their disk 30 days. When a sandbox stops to clean up (a stop from an older client, the end of its time limit, or a crash), an account that has paid, holds credit or saved a card for automatic top-ups now keeps its disk free for 30 days after the stop, not three. Disks already waiting in such an account move to 30 days from their stop, never less than a day from now, and you get the deletion notice again before the new date. Other accounts keep three days. See paused storage.
- Turn an App's CDN off (private beta). Cloudflare's CDN sits in front of
every App's and Function's addresses by default, with no separate fee. Set
cdntofalsewhen you create or update one (--cdn offin the CLI,cdnin the API, MCP tools and every SDK) to send visitors straight to Runtime's routers, with nothing cached. - Read and follow an App's logs (private beta). What an App's or a
Function's copies print to standard output and error is kept 14 days and
read back with
GET /v1/apps/{id}/logs(/v1/functions/{id}/logs), theruntime_apps_logsandruntime_functions_logsMCP tools,runtime apps logs <app>in the CLI, andlogsin every SDK. Narrow it bysince(a time, or30s,15m,2h,7d; an hour by default),version,copyandstream; page back withcursor. Withfollowit streams each line as it is printed, and the SDKs and the CLI reconnect by themselves and give each line once. A key that may read files reads the logs of the Apps it can see, a worker's or a compartment's key its own Apps' alone. Outside the beta these calls are refused withproduct_in_beta. - Sandboxes with egress secrets start under heavy load. Creating a
sandbox that names its egress secrets (
secrets) checks its list again rather than failing at once withsecrets_unconfirmedwhen the service is busy, and one account sending far more requests than its limit is slowed alone while other accounts' calls go through. See Keys and secrets. - Request timeouts on sign-up and webhook routes. A request to a route you
call before you have a key (the MCP sign-up, GitHub's webhooks and
install link, and an agent's reports) whose body has not all arrived after
5 seconds is now answered
408 request_timeoutstraight away: send it again. Before, it waited 15 seconds or more and was answered503 api_unavailableas if Runtime had failed. See errors. - The Prime Sandboxes drop-in follows 0.4.7. Code written for
prime-sandboxes0.4.7 runs onwithruntime.prime. Its newarchoption on create works with"amd64", and"arm64"gets a plain error before any sandbox is made, as Runtime sandboxes are x86-64.create_lan_networknow takesrulesand, as before, names Runtime's private network instead. See Migrate. - Workers start from their coordinator's snapshots. A key made by a key
can now create a sandbox from a snapshot that its maker, or any key above
it, took and labelled
share: made-keys. It can only start from it: it never lists, reads, changes or deletes it, and a snapshot without the label stays out of its reach. The label is never copied to sandboxes, forks or new snapshots made from a shared one: set it on each snapshot you share. Worker keys made before this release need to be made again to use it. Ashare: made-keyslabel already on a snapshot was taken off, so nothing became shared by itself; asharelabel of any other value is untouched. A snapshot of a sandbox that named its egress secrets (secrets) is never shared: workers getsnapshot_not_foundfor it, while its owner still starts it. Sharing never crosses a compartment. Before, a worker key with reachagentwas answeredsnapshot_not_foundfor every snapshot but its own. See Run a swarm. - A scraping account no longer gets other accounts blocked. Runtime can move an account whose sandboxes scrape sites to outbound addresses kept for scrapers, so a site that answers it with a CAPTCHA or a ban does not block the other accounts on the same server. The move reaches its running sandboxes at their next connection, they keep their internet throughout, and the addresses are in the same published list as the shared ones. See Shared addresses.
- MCP sandbox switch and resize refusals say what to do. Through
MCP, switching a sandbox's image while asking to keep more than
/workspaceagain says what a switch keeps and how to keep everything (snapshot first), and a resize sent without a restart says that a resize always restarts, instead of naming only the field. See MCP. - Jobs secrets belong to the key that stored them. A jobs secret stored
by an API key can now be used only by that key, by agents you name, and by
you. Share it with your other keys using
runtime secrets share NAME --agent <id>,--allor--none(secrets.sharein the SDKs,POST /v1/secrets/{id}:share). Secrets you store on the website stay every key's. A job that binds a secret another key stored stops at its next run until that key or you share it; if another of your keys could reach a secret before now, rotate it. A job created with a secret its key may not use is refused withsecret_not_shared. See secrets in a job. - Ask support to stop our emails and get a straight answer. Email support "remove me from your list" and the support agent now tells you which of Runtime's emails reach that address, if any, and how to stop each: the link at the foot of each optional email, or Settings, Emails in the console. It no longer passes the request to a person or promises a removal. See Stopping Runtime's emails.
- Raise how many sandboxes run at once. Ask support for a higher count and it is raised for your account with the vCPUs, memory and disk to match, never below what auto top-up gives, whether auto top-up is on or off. See when you meet one.
- A sandbox paused for abuse stays paused until support lifts it. When
the abuse checks pause or stop a sandbox for traffic only abuse makes, such
as reaching a cryptocurrency mining pool, a wake, restart, snapshot or fork of it
now answers
sandbox_halted(403) saying why, instead of running it again. Its files are kept, and your inbox says what was seen. See Security. - A build on a busy server waits for room instead of failing. When the server an image builds on has no room for its build machine at that moment, the build waits up to five minutes for room and then runs, and its log says it is waiting. Before, it failed at once with a fault on our side and asked you to build again. See Images.
- Narrow a secret without its value.
runtime secrets set NAME --keep-valuewith a narrower--hostor--allowtakes hosts, methods or paths away from a secret you stored, with no need to have its value at hand: a token that could push to a repository can be made fetch-only by anyone who may write secrets. Anything wider is refused, since a new place could learn the value. In the API,PUT /v1/egress-secrets/{name}/rules; in every SDK,secrets.narrow(withruntime 0.22.0 for JavaScript, 0.21.0 for Python); in the console, leave the value empty when you edit a secret to take hosts or rules away. The audit log records each one. See Secrets sandboxes never see. - Links to one file in a sandbox, with no API key.
files:link(API),sandbox.files.downloadUrlanduploadUrl(JavaScript, withdownload_urlandupload_urlin Python, and the same in Ruby, Go and Java) andruntime sandboxes linkmake a secret, expiring URL for one file. A GET downloads it (Range works, so videos play and downloads resume); a PUT writes it atomically, up to 5 GiB. A link lasts 1 hour by default and at most 7 days;revokeLinksends every link of a sandbox, and revoking the key that made one, or deleting the sandbox, ends it too. E2B'sdownloadUrlanduploadUrlnow work the same way. JavaScript 0.25.0, Python 0.23.0, Go 0.12.0, Ruby 0.10.0 and Java 0.10.0. See files in the API guide. - Apps, Functions and Builds in the Go, Ruby and Java SDKs (private beta).
Go 0.7.0 (
client.Apps,client.Functions,client.Builds), Ruby 0.6.0 (client.apps,client.functions,client.builds) and Java 0.6.0 (apps(),functions(),builds()) carry every method the TypeScript SDK has: create, deploy from an image or a build and wait for it, roll back, versions and copies; builds of a connected repository with their log, followed as it is written. Each can also ask for the link that installs Runtime's GitHub App, so private repositories build. Outside the beta these calls are refused withproduct_in_beta.
18 October 2026#
GitHub App tokens, push limits and API budgets for secrets. A secret can now hold a GitHub App's private key (
githubApp): our servers make its installation tokens and add them to your sandboxes' GitHub requests and git pushes, and the key itself goes into no request.git.pushnames the branches a push may update, such asrefs/heads/task/{label.task}: each label's branch belongs to the first sandbox made with it, even once it is deleted, and that label can't change after the sandbox is made. Any other push is refused with git's own[remote rejected], as is any API call that would move, merge or write to another branch.apicaps each sandbox's calls and writes an hour, lists the GraphQL mutations allowed, and lets sandboxes share cached reads. A rule's path segment that is*alone now names any one segment. See GitHub: an App's tokens, branch limits and API budgets.SDKs take a secret's GitHub App, push limits and API budgets.
withruntime0.25.0 for JavaScript and 0.23.0 for Python, the Go SDK 0.12.0, and the Java and Ruby SDKs 0.11.0 set and returngithubApp,gitandapi. See GitHub: an App's tokens, branch limits and API budgets.Clear refusals instead of 500 errors on sandbox create. A create that asks for ports beyond 80 and 443 (
network.connect) from an account without a kept top-up is refused with 403connect_not_allowed, saying what lifts it, and amaxTotalCostMicrosbelow the first minutes a paid sandbox holds is refused with 400invalid_requestnaming that field; both answered 500 before. A pause sent while a sandbox is still starting, a wake sent while it is pausing, and a restart sent while it is stopping now wait for it instead of being refused, and a file call right after a wake waits for the sandbox to listen instead of answeringguest_busy. A persistent sandbox stopped before it ever started now readsdiskKept: false, since it has no disk to restart from; it readtrue, and its restart was refused. See networking, limits and the API guide.API key limited to chosen sandboxes, approved in the browser. An agent with no key can now ask for a key that reaches only the sandboxes it names, whichever key or connector made them:
runtime keys create --sandbox <id> --actions get,exec. An owner or admin approves it from a link, seeing each sandbox and what the key may do. Withoutcreateit cannot start, wake or restart them; a running one is billed as usual until its own time limit. See asked for in the browser.Snapshot starts no longer stop for CPU on one server. A sandbox started from a snapshot whose server was short of CPU for your other sandboxes used to stop with
account_busy_here. Now it starts on another server that holds a checked copy of the snapshot, and stops only when none of them has room (or after it has moved 3 times). See A sandbox stopped on its own.Apps console with traffic and live releases. Console → Apps shows each App as a card with its last day of requests, error rate, copies running, last release and this month's cost. An App's page draws its copies by version, a release step by step as requests move to the new version, its requests, errors and latency over an hour, a day or a week, its busiest routes, and log search by request id or any words. A failed release keeps its output, and the previous version rolls back in one click. See custom domains on an App.
Move from Cloudflare Sandbox to Runtime. A Worker written for Cloudflare's Sandbox SDK (0.x) now runs on Runtime sandboxes once you change its import to
withruntime/cloudflare, delete thecontainersblock fromwrangler.jsoncand add aRUNTIME_API_KEYsecret. Commands, streaming, files, background processes, the code interpreter, preview URLs, sessions andgitCheckoutwork as before. See change the import.A sandbox can name the secrets it gets. Create a sandbox with
secrets: ["ANTHROPIC_API_KEY"](runtime sandboxes create --secret ANTHROPIC_API_KEY) and it gets only that egress secret: no placeholder for any other, and our proxy puts no other value into its requests. An agent given untrusted input can no longer send a key meant for other work.[]is none; the list narrows each secret's ownonly, is fixed for the sandbox's life, and a fork or copy of a snapshot may only narrow it. In the API, the MCP tool and every SDK. See secrets sandboxes never see.One deletion email a day, not one per pause. A sandbox with
:retentiondays of its own is a day or so from deletion after each idle pause, and its owners were emailed a warning on every pause, though using it again cancels the deletion. Warnings for dates you set this way are now emailed at most once a day for the account, listing every sandbox due, and never once a sandbox has woken or paused again since; the email says its own retention chose the date, andnullkeeps it while you have credit. See pricing.A secret that could not be added is no longer silent. When a request to a secret's host leaves your sandbox without the secret because our server could not add it at that moment, the sandbox now gets a
sandbox.secret_not_appliedevent with reasonwithheld, saying the fault is ours and what to do. See events.A worker's key runs its own Apps. A key made by another key, or a key in a compartment, can now create, list, deploy, roll back and delete the Apps and Functions its own agent made, as it does sandboxes, over the API and MCP. Another agent's App still answers 404. Such a key deploys from an image only: a deploy naming a
buildanswers 403 (forbidden, oroutside_compartmentin a compartment); deploy builds with an account's key. Such a key asks an App for at most 2minCopies, 2sparesand 20maxCopies; a larger App is made with a key made on the website. It cannot give an App or Function a name one of the account's own Apps holds: create or rename answers 409name_taken. See Run a swarm.MCP:
runtime_appsactiondeploytakes itsid. It refused its ownid, and listed noimageorbuild, for every key; it now takes them. Theruntime_appstool also answers a worker's or compartment's key in the Apps beta, which it refused before.Snapshots and forks in bursts no longer wait running. A snapshot or a fork of a running sandbox now stops it at once, so the snapshot, or the fork's copies, hold the memory of the moment you asked, and then waits for its turn at the server's disk with the sandbox stopped. Before, it waited for that turn with the sandbox still running, and a burst on one server could take tens of seconds each, the sandbox changing all the while. A sandbox whose time limit or funded time ends soon, on a busy server, still waits running and stops at its turn, as before. See products.
Secret scopes in the Python, Go, Ruby and Java SDKs. The SDKs can now give a secret to some sandboxes instead of all of them, as the JavaScript SDK can:
onlyonsecrets.set(only=in Python and Ruby,Onlyin Go, a sixth argument in Java) andsecrets.scope(name, only)(Scopein Go), which changes who gets an existing secret without its value. Python is 0.17.0, Go 0.6.0, Ruby 0.5.0 and Java 0.5.0. SeeGive a secret to one App's copies.
runtime secrets scope NAME --only-app <app id>gives a secret to every copy of an App, including copies later deploys, restarts and scaling make; a deploy names the secrets its copies see withsecrets: ["NAME"], and a copy holds only the placeholder. An App copy's identity token now says which App it is (app_id). See secrets sandboxes never see.A sandbox out of memory still answers. When a sandbox's programs fill its memory, Linux now ends one of them for memory, as the guide says, instead of the whole sandbox slowing until commands, reads and kills time out. Your programs share its memory less a small reserve for the sandbox's own services. See when a program runs out of memory.
Upload stalled: a clear answer in 30 seconds, not a 503 after two minutes. A request whose body stops arriving for 30 seconds, such as a chunk of a large upload, is now answered at once with the bytes received, where before it waited about two minutes and answered
503 api_unavailable. A body that keeps arriving, however slowly, is never cut. The SDKs and the CLI get503 body_stalledand send it again by themselves with the same key; other clients get408 request_timeout. See errors.Fetch a web page in under a second with a paused browser. The guides show how to keep spare browsers paused, charged only for storage, and wake one per page: wake to page done measured 0.56 to 0.81 seconds. Python's guide gains its browser section. See Spare browsers, paused.
Connection limit per site: 429 Too Many Requests from the egress proxy. A sandbox opens up to 20 new connections a second to one site, and an account's sandboxes on one server up to 100 together, after a burst. Past it the connection is refused with
429and a sentence naming the site. Downloads over open connections, installs, clones, storage, CDNs and AI APIs are never counted. See connections to one site.Identity tokens from any running sandbox. A program with no
RUNTIME_ID_TOKEN_REQUEST_*variables, such as one started before they were set or a sandbox kept from older guest software, now gets a token too:Sandbox.identityToken()(TypeScript 0.17.3), Python'sSandbox.identity_token()(0.16.2) andruntime sandboxes identity-tokenask the sandbox's host for them, and the docs show the same with curl alone. See identity tokens.No 429 for a busy key right after an update of Runtime. A key whose account runs many sandboxes may send up to 8 times the ordinary rate. Just after Runtime updated its servers, its first requests met the ordinary rate instead, for the moment it took to recognise the key, so a burst sent then was answered
429 rate_limited. Those requests now wait that moment, at most two seconds, and are served at the key's own rate.Daytona's GPU and sort enums import from the drop-ins. The Daytona drop-ins follow Daytona 0.225.0 and the Prime Sandboxes one follows 0.4.6.
GpuType,SandboxClassand the list sort enums now import fromwithruntime/daytonaandwithruntime.daytona, and the sort enums sortlist. A Python create that asks for a GPU type now gets a plain error, as TypeScript already did, instead of a CPU sandbox. Prime's newlan_network_idon create is refused before a sandbox is made, naming Runtime's private network. See Migrate.Idle sandboxes now pause after 5 minutes. A new sandbox, browser or sleeping container pauses after 5 minutes with nothing happening in it by default, where it was 1 minute before. Rates are unchanged, but an idle sandbox that sets no idle time now runs, and is billed for its memory, up to 4 more minutes before it pauses; set
idlePauseSecondsto 60 to keep the old default. The shortest idle pause is now 60 seconds, not 10: a time of 10 to 59 seconds you set on a new sandbox, or change to, is raised to 60, so that sandbox runs, and is billed, until 60 seconds idle. The answer shows the 60 it got; 0 still turns pausing off. Sandboxes made before today keep the setting they have, under 60 too. See pause when idle.
17 October 2026#
- Browser starts in about 1 to 2 seconds in a new sandbox. The browser
now comes ready on the sandbox's host instead of being downloaded and
installed on its first start, which took up to a minute:
browser.start()in a brand-new sandbox now returns in about 1 to 2 seconds. A custom image that is not Ubuntu 24.04 x86_64 still installs it once on its first start (withruntime 0.17.2, and 0.16.1 for Python). See A browser over CDP. - Give a sandbox a key without typing it into a command. In the CLI,
--env NAMEwith no=sends that variable's value from your own shell, asdocker run -e NAMEdoes, oncreate,update,execandrun(withruntime 0.17.1). The security guide now shows how to install a key your sandbox's server checks on incoming requests, and the same key at another provider, and how to rotate it with no failed request. See Shared keys. - Swarm worker keys cannot reach scheduled jobs or their secrets. A key
made by another key with reach
agentnow gets403 forbiddenon/v1/secrets,/v1/jobsand/v1/job-runs, and on theruntime_jobsandruntime_secrets_jobstools, as the guide already said for secrets: a job's secrets belong to the person the key's agent serves, often the owner. See Run a swarm. - A revoked worker's spend still counts against its maker's limit. A key revoked, expired or retired counts what it spent in the last day toward the daily limit its maker's keys share, so revoking a worker that spent its limit and making another no longer spends that limit twice.
- Run commands as root. A command, background process or terminal now
takes
user: "root"and runs as root, with its environment,PATHand working directory kept andHOMEset to/root, so nothing needs asudoin front. The default is still the sandbox user,runtime, and each process says which it runs as. It is in the API, MCP, the JavaScript, Python, Go, Ruby and Java SDKs, and the CLI (--rootonexec,spawn,runandshell). Coming from Freestyle, whose VMs run as root? See how to switch. - Keys limited to sandboxes. A key can now be limited to a few sandboxes
and to what it may do to them: look, start and restart, stop, run commands,
or reach files. It is served nothing else, so a watcher that restarts one
server holds no key to the rest of your account. Make one with
runtime keys create --sandbox <id> --actions get,create, orsandboxesandactionsinPOST /v1/keysandruntime.keys.create. See Teams. - .NET programs run. Programs built on .NET 7 or later, such as
dotnet, PowerShell and GitHub's Actions runner, no longer stop as they start with "File size limit exceeded". Commands in a sandbox had a file-size limit as large as its disk, and .NET sizes an in-memory file at 2 TiB to map its code twice. Commands now have no file-size limit, as on any Linux machine: a file still cannot hold more than the disk, but sparse files and in-memory files larger than it work. New sandboxes get this. See Sandbox environment. - Wake and restart wait for room. In the JavaScript, Python, Ruby, Go and
Java SDKs, a sandbox's
wakeandrestartnow wait for room ascreatedoes. When the sandbox's own server is full (no_capacity), the SDK sends the call again with the same idempotency key, for up to two minutes by default, instead of failing in a few milliseconds. A sandbox stays on its server, so waiting is the only way it gets room. SetwaitForCapacityMs(JavaScript) orwait_for_capacity(Python, Ruby) on one call;0fails at once. A fork never waits. See JavaScript. - API rate limit grows with your sandboxes. An API key's rate now grows
with the sandboxes its organization runs, as its requests in flight already
did: about 170 requests a second in bursts of 675 with 40 sandboxes, up to
400 a second in bursts of 1,600. Before, every key stayed at 50 a second
however many sandboxes it drove, so one key running dozens of agents was
answered
429 rate_limitedfor much of its work. See Limits. - Paused sandboxes keep their memory when many pause at once. A sandbox told it was paused is now written to disk early enough even while many other sandboxes on its server are pausing too. Before, one could wait too long behind them, and wake from its disk alone with its memory lost. See pause and wake.
- Console pages no longer hang. A console page whose data the database is slow to give now stops within 15 seconds and shows "This page did not load" with Try again, where it could spin for minutes. Nothing you run is affected. See troubleshooting.
- Relabelling a sandbox into a secret's scope takes effect at once.
Changing a running sandbox's labels so a scoped secret reaches it (or no
longer does) now waits until its server holds the change, and the answer
carries
secretsEnforced: true(for a key that may read secrets; any other key's relabel takes up to 15 seconds, as before). Before, requests could go out without the value for up to 15 seconds after the label call returned. See Security. - A job run that reaches its timeout ends as a timeout. A run whose
timeout was as long as its paid time (a one-hour timeout, say) ended
unknownorcanceledwith the reasoncompute_stoppedwhen it ran to the end, with no exit code and no retry. It now endsfailedwith the reasontimeout, keeps its exit code and output, and is retried when the job asks for retries. See jobs. - FUSE filesystems. sshfs, rclone, s3fs, gcsfuse, bindfs or your own FUSE program mount in any sandbox as its own user, and a mount lasts through a pause and a wake. See FUSE filesystems.
16 October 2026#
- Identity tokens in Python and copied programs. Python's
Sandbox.identity_token()(0.13.1) now asks again with the sandbox's current request token when the one a program started with is refused, as the TypeScript SDK does, and both SDKs (TypeScript 0.15.1) read it from the sandbox itself first, so a server carried into a fork gets a token naming its own sandbox instead of a 403. See identity tokens. - Private preview link expiry. A WebSocket, stream or download opened with a private preview's link now ends when that link expires, so a link made to last ten minutes, or one read through a sandbox session, opens nothing past its end. Open it again with a fresh link. See private preview tokens.
- Enterprise features on the pricing page. The pricing page now lists single sign-on, SCIM directory sync, roles, the audit log, two-step sign-in, key limits and compartments, the data processing addendum and the uptime promise, each free on every account with no enterprise plan or seat fee. See pricing.
- Retrying a create refused for no room. The API guide now says a
request refused before it ran, such as a create answered
no_capacity, is not replayed: retrying with the sameIdempotency-Keyruns it again, and the create reference names the refusal and itsRetry-After. See retries and idempotency. - Identity tokens in long-running programs. A program that runs for a long time inside a sandbox, such as a server or an agent, now keeps getting identity tokens after the sandbox's request token changes: the TypeScript SDK asks again with the sandbox's current one instead of failing with a 403. See identity tokens.
- Referral share after a refund or a lost dispute. If every matched payment from someone you referred is refunded or disputed, their use no longer earns you a monthly share. If they lose a dispute, your share now starts again after one month instead of stopping for good. See referrals.
- Someone leaving no longer deletes what they stored. When a member is removed, or your directory suspends them, the disks, snapshots, volumes and images they made stay on the account's credit like anything else. Until now their storage stopped being paid for and was deleted seven days later, with a notice that blamed missing credit. A storage item still stops only when the account itself has no credit, hits a spending limit, or is suspended. See teams.
- Faster console pages. Agents & API keys, Networking, Secrets, Webhooks, Two-step sign-in, Audit log, Limits, Support and Close account now download about a quarter less code, and Home, Usage & billing and each sandbox's page less too, so they open sooner on a slow connection. A mistyped address's "not found" page is lighter as well. See the quickstart.
- Pay per call credits even after an interruption. A sandbox paid for per call over HTTP 402 is now credited to the paying wallet's account within minutes, even if our server stopped right after sending your transfer and you never used the claim code. See pay with stablecoins.
- Pause vs stop a sandbox. One table now shows what a pause, a stop and a delete each keep, how the sandbox comes back, when each happens on its own and what each costs. See pause, stop or delete.
- Open a sandbox in your editor in one step.
runtime sandboxes code <id>opens the sandbox in VS Code over SSH, and--editor cursoror--editor windsurfin Cursor or Windsurf. It sets up the SSH entry the first time and installs an SSH server in a sandbox without one. See SSH and editors. - Blaxel session default length. With the Blaxel drop-in,
sandbox.sessions.create()with noexpiresAtnow makes a session that lasts a full day, as Blaxel's does, instead of a second less. See moving from Blaxel. - Usage export and held credit. The API guide now says which charges the usage export leaves out: credit held for work still running is not in it, and becomes a row once it settles. See export settled usage.
- HTTP/2 to the hosts your secrets name. A sandbox's HTTPS requests to a host that one of your secrets names now go over HTTP/2 when your client and the host both offer it, as they already did to every other host. Concurrent calls to that host share one connection instead of each taking one of the sandbox's connections, and gRPC works there too. Each request is still checked on its own: its host, its rules and where the value goes. See security.
- A restart runs the image's start command again. A sandbox from an
image with a start command (a Dockerfile
CMD, orstartinimages.build) now runs it again after a stop and:restart, a:resize, or agetOrCreatethat restarts it, and reports it instartas a create does. Before, the server it started was gone until started by hand. See images. - Identity tokens in scheduled jobs, documented. The jobs and
identity tokens guides now say that a job's run has
RUNTIME_ID_TOKEN_REQUEST_URLandRUNTIME_ID_TOKEN_REQUEST_TOKEN, as any sandbox does, so a job can get a token for AWS, Google Cloud or your own API with no stored key.
15 October 2026#
- Hundreds of outbound connections, and a clear answer at every limit.
A sandbox of an account that keeps a top-up now holds 512 outbound
connections open at once for each vCPU, up to 4,096, where every sandbox held 64. In a test, 500 HTTPS connections opened at once from a 1 vCPU sandbox
all connected, where 436 of them were reset before. New connections a
second (20, after a first 128 at once) and new hosts a minute (120) stay
as they were for every sandbox; past them a connection waits its turn
instead of being reset. Past any limit a connection gets
503with the limit inX-Runtime-Egress, and the account eventsandbox.network.limitedsays which limit, at most once an hour.GET /v1/sandboxes/{id}/networkshows a sandbox's limits. Accounts without a kept top-up keep 64. See the sandbox environment. - Keep sandboxes on separate servers. A create takes
spreadFrom, up to 16 ids of your sandboxes or snapshots, and starts on a server none of them is on. Every sandbox and snapshot now showsplacement, an opaque tag that is the same when two share a server. A copy of a memory snapshot starts only on its snapshot's server, so keep warm sources apart and spread copies across their snapshots: each server starts copies at its own pace rather than refusing themaccount_busy_here. See the API. - A sandbox's time limit can be set or changed after it starts.
:update(sandbox.update()in the SDKs, or the CLI'sruntime sandboxes update --timeout) takestimeoutSeconds, a new limit counted from now, sooner or later than before (0removes it), andonTimeout, what its end does. A sandbox made without a limit can now get one. E2B'ssetTimeoutto an earlier time works underwithruntime/e2binstead of throwing. See Sandboxes in the API guide. - Custom domain on an App. An App can serve your own domain, apex or
www, through every deploy and rollback. Its HTTPS certificate is issued and checked before you point the name at the App, so the first visitor already gets HTTPS, and it renews by itself at least 30 days before it expires. See networking. - Referral and welcome matches always land. A referral or welcome match that could not be decided the moment you paid, for a passing error on our side, is no longer lost: it is tried again within minutes until it is paid, and your payment is never held up by it. See referrals.
- Which stopped sandboxes lose their disk after three days. Pricing now
names them by client version, not by date: a sandbox made by a JavaScript
or Python SDK before 0.12.0, Go, Java or Ruby before 0.2.0, or raw HTTP
without
x-runtime-client: http/2026-10-04keeps its disk free for three days after it stops, then it is deleted. JavaScript 0.11.1 and 0.11.2 and Python 0.11.1 came out after 4 October and count as older. See paused storage. - pip install withruntime on Python 3.9. The Python SDK now installs and
runs on Python 3.9, the
python3a Mac comes with, wherepipused to find no version of it at all. See the Python SDK. - GitHub API rate limit exceeded. Calls to GitHub's API without a token share GitHub's 60-an-hour limit with every sandbox sending from the same address. The guide now shows how to save a GitHub token as a secret that the network adds to each call, so tools get your own limit with no change. See shared addresses and per-address limits.
- llms-full.txt names each page. Every guide in
llms-full.txt, the docs in one file, now starts with its address, so an assistant that reads the one file can link you to the page a fact came from. AI assistants' search crawlers now get the home page itself rather than the plain-text quickstart. See start. - Listing sandboxes is faster.
GET /v1/sandboxesand every SDK's list answer a page about three times sooner in any account with more than one sandbox, and a list of only running sandboxes in an account with thousands of stopped ones answers in milliseconds where it read all of them.GET /v1/usageanswers two to three times sooner in large accounts, andGET /v1/meno longer waits on a usage read. The answers are the same. See Sandboxes and Account. - Refer someone, not only a company. The referral in Billing and Home now reads "Refer someone", and your billing history names someone you referred rather than a company: anyone you bring to Runtime counts. See referrals.
- Set up Runtime with one line for your coding agent. A new account's Home now opens on the line to paste into Claude Code, Codex or Cursor, shown as it will be pasted, with one Copy button; starting a sandbox in the browser comes next, and the key and install steps by hand are folded below. The line is shorter everywhere: "Move this project to Runtime Cloud: read https://withruntime.com/llms.txt and follow it." See Get started.
- Free hours card fits on every page. The "100 free hours" card at the end of the changelog, pricing and about pages now holds its whole title on wide screens, where its second line ran past the card's edges. See pricing.
- MCP server instructions on first connect. When
npx withruntime mcpconnects throughruntime_connect, its answer now carries Runtime's full instructions (limits, cleanup, safe retries), which an agent's first session never saw before. If your client does not show the new tools, restart it: the connection is saved. See MCP. sandboxes rundeletes its sandbox.npx withruntime sandboxes runnow deletes the sandbox when the command ends, so nothing is left billing for disk and an account without credit no longer reaches its 10 kept sandboxes after ten runs.--keepstill keeps it. See CLI.- Volume restored from a backup stays put. A volume made from a backup can no longer be removed after it is ready by a restore attempt that finished late, and the nightly backups keep earlier copies whenever a night could not read the data they protect. See Volume backups.
- A paused sandbox wakes when its server can't take it. A wake whose
sandbox's own server is full, out of service or lost now comes back on
another server from the sandbox's saved copy, files and memory as they were,
where it was refused
no_capacity. Each server is checked for this after every release before it takes another server's sandboxes. See pause, wake, extend. - Free account limits for backups, feedback and support. An account without credit keeps a volume backup at most seven days, like its snapshots and paused sandboxes; one that has never added credit files 5 feedback reports and sends 40 support messages a day. Adding credit lifts them. See volume backups and feedback and support.
- Preview token expiry explained. Each create or read of a private
preview signs its own token with its own
tokenExpiresAt, so a list after a week-long create shows a different token that ends sooner; the token you already hold still works until its own expiry or a rotate. See private preview tokens. - Sandbox environment changes and running programs.
:updatechanges a paused or stopped sandbox'senvtoo, and a program already running keeps the values it started with, so restart it to pick up a change. See Sandbox environment. - Vouch for a scheduled job. An owner or admin can now vouch for a job on its page in the console. Each run's identity token then names the job, its version, who made it and who vouched for it, so your own API can accept a job's call only when a person stood behind exactly what it runs. Any change to the job takes the vouch off. See identity tokens.
- Code for the newest rival SDKs runs on Runtime. The drop-ins follow
Daytona 0.224.1, E2B 2.56, Blaxel 0.3.30 (Python 0.4.18), Freestyle 0.2.20,
Modal 0.11.1 (Python 1.6.2), Prime Sandboxes 0.4.5 and Vercel Sandbox 3.8.0
(Python
vercel-sandbox0.9.1 andvercel0.12.0). New here: finding a stopped Modal sandbox by name (includeTerminated); Prime checkpoints, and creating a sandbox from one; input to a running Vercel command (stdin,writeStdin,onStart); Freestyle terminals that reconnect after a dropped connection, andconnectXterm; Blaxel's error helpers, preview shorthand andcreateIfExpiredtokens; a Prime background job that cannot start now fails instead of reading as running. Anything Runtime cannot do, such as another Daytona region or Prime LAN networks, is refused with a plain error rather than ignored. See Migrate. - A snapshot of a running sandbox answers sooner.
sandbox.snapshot()in every SDK now asks the server once, and the server pauses the sandbox for the capture and wakes it before answering, where the SDKs paused, captured and woke it in three calls of their own. A repeat snapshot of a 4 GiB sandbox took 1.19 s at the median instead of 1.96 s in Virginia. Snapshots and forks also see they are ready sooner on the server. - Images start where their base says. A Dockerfile stage
FROMan image now starts in that image'sWORKDIR, as itsUSER, with itsCMDandENTRYPOINT, as on Docker:FROM golangbuilds in/go. An image built from{image: "redis:7"}starts redis. See Custom images. - Dockerfiles read more like Docker reads them. An
ENVnow beats anARGof the same name inRUN, anARGwith no value stays unset (so${FOO:-default}gives the default), quotes and\$keep$literal inCOPYandARG, andCOPY --chmodtakes symbolic modes such asa+x.COPY --fromnaming its own stage is refused with a clear message. See Custom images. - Containers from slow registries start. Reading a container's image
allows 5 seconds for each request rather than for the whole read, accepts
index.docker.ioandregistry.hub.docker.comas Docker Hub, and refuses an image built only for arm64 at create instead of failing later. - Prove a volume backup restores. The storage guide now says what a
readybackup already proves, that only a restore checks every byte, and how to prove one: restore it, check it, and delete the restored volume, charged only while it exists. A restored volume counts toward your volume limit. See volume backups. - Creates from a snapshot no longer fail because its servers are full.
When the servers keeping a disk snapshot have no room, the sandbox now
starts on another server in the region, once a verified copy of the
snapshot is brought there from its backup. That create takes longer (the
copy arrives first) instead of failing with
no_capacity. Each such create leaves the snapshot on one more server, so a snapshot used often is kept on more servers as it is used. - Dockerfile files are owned as Docker owns them.
COPYandADDnow write files owned by root unless--chownsays otherwise, whatever theUSER, and aWORKDIRthat does not exist yet is made for the currentUSER. SoUSER node,WORKDIR /app,COPY . .,RUN npm cibuilds, where it failed on an/apponly root could write. See Build from a Dockerfile. - Paid accounts get 1 TiB of sandbox disk. An account with credit now has 1 TiB of disk across its sandboxes, up from 400 GiB. One sandbox is still at most 400 GiB. See Limits.
- An account without credit keeps 5 sandboxes. Running, paused or stopped, down from 10; each is still up to 10 GiB of disk. A sandbox you already keep is never cut off: waking or deleting one is never refused, and an account keeping more than 5 makes new ones once it is under. Adding credit lifts the limit.
- Morph Cloud code runs on Runtime after one import. Change
from "morphcloud"tofrom "withruntime/morph"(withruntime0.16.0): snapshots and their cachedsetupsteps, instances,branch, pause and resume,execand HTTP services run as Runtime sandboxes, snapshots and previews. See Switch to Runtime. - Morph Cloud's Python code runs on Runtime too. Change
morphcloudtowithruntime.morphin the imports (withruntime0.14.0 on PyPI):from withruntime.morph import MorphCloudClient. The same calls work, with theira-prefixed async twins and Morph'sbuildand cachedsetupchains. - A reference on the page that did not load. When a page of your account fails to load, it now shows a reference number. Quote it when you ask for help, and support can find exactly what went wrong with that page. See Feedback and support.
14 October 2026#
- Making /workspace needs permission to write files.
files:mkdiron/or/workspacenow needs a key that may write files, as on any other path, and a key that may only read is refused. If the path exists but is not a folder, it answers 409not_a_directoryinstead of success. See Files. - A public preview's warning cannot be skipped from a link. In browsers that do not say where a click came from, only the warning's own Continue button now takes a visitor past it. A link sent by someone else shows the warning first. See Networking.
- Image rebuilds get the newest base image. A build
FROM python:3.12-slimor:latestnow starts from the image the tag names today, asdocker buildx builddoes, instead of an earlier pull kept from a past build.cache: false(--no-cache) now always builds every step afresh. See Faster rebuilds. - Comparison tables that read cleanly. The tables on the comparison, blog and how-to pages are soft rounded cards again, with room around the text instead of a hard square outline, and Runtime's row in a price ranking is one even band. See compare sandboxes.
- Best sandbox for AI agents, compared. A new page ranks every sandbox provider by the cost of the same agent job, sets their published start times beside ours, and names which one fits each need, GPUs and self-hosting included. The price index now opens on which agent sandbox is cheapest. See Best sandbox for AI agents.
- Faster first paint on the website. Guides, blog posts, comparisons, pricing and the home page now load only their own styles: a glossary page fetches 30 KB of them instead of 67 KB, the home page 25 KB instead of 61 KB.
- A worker's own workers share its daily limit. When a key with a daily limit makes keys, the limits of every live key under it, at any depth, now add up to at most its own, so a worker cannot multiply its cap by making workers of its own. Keys are made at most 8 deep, and a key in a compartment makes no keys. See Run a swarm.
- A wallet account's key is never lost to a failed save. If
runtime_wallet_claimcannot save the key it was just issued (a read-only config directory, say), it still connects and shows the key once, to keep. - A command on a paused sandbox starts sooner. An exec, a file call or
any other command sent to a paused sandbox with
autoWakewakes it with two fewer steps before the command runs. A key that may run commands but not read the sandbox is still refused before anything wakes, as before. See Wake on request. - Cost breakdowns you can read at a glance. The worked sums on the comparison, blog and use-case pages, such as "Cost for the same job", now show as one card per provider with its total and a bar to scale, instead of text in a code box. The blog, how-to guides, glossary, pricing and changelog pages share the cleaner look of the sandbox page. Each page's Markdown is unchanged for agents. See Runtime vs E2B.
- MCP servers at a URL that never expires.
public: trueonsbx.mcp.start(public=Truein Python,Publicin Go,--publicin the CLI,publiconPOST /v1/sandboxes/{id}/mcpand theruntime_sandboxes_mcptool) serves the sandbox's MCP servers at a public preview: URLs with no link token, so an agent is set up with them once. TheAuthorizationheader still guards every request, and stays the same at every start, after a restart too, until you stop the gateway. An idle sandbox pauses with its servers in memory and wakes on the next request. Reading the gateway no longer turns a public preview of its port back to private. Needs a kept top-up. See MCP servers. - The console stays fast for busy accounts. Home, Usage & billing, a sandbox's own page and Networking no longer slow down as an account's history grows: on an account with 100,000 sandboxes in a month, Home opens in under a tenth of a second instead of 1.5 s, and Usage & billing in 0.15 s instead of 1.2 s. Older pages of the audit log, and the log filtered to one kind of change, open as fast as its first page. See the audit log.
- Your account's limits, from the API.
GET /v1/limits(andruntime.limits.get(), and theruntime_limits_gettool) now lists every limit the account is held to with what it uses of each now, the numbers a create past one is refusedquota_exceededby: sandboxes at once, their vCPUs and memory, volumes and the rest. An agent can watch them and hold back before it is refused. See Limits. - Agent-only wallet accounts top up, watch their credit and recover a lost
key. On an account an agent opened with a wallet and no person pays for,
an out-of-credit answer now tells the agent to add credit itself with
npx withruntime billing topup <usd>(details.addCredit.byisagent).GET /v1/limitsgainscredit: the balance, the daily pace, the days it lasts and whether it isok,loworempty. Webhooks can subscribe tocredit.lowandcredit.empty. A lost key is replaced with the claim code (runtime billing claim <code> --new-key), which revokes every other key; at most 3 times a day, logged in the audit log, until a person takes the account over. See pay with stablecoins, limits and events. - Swarm worker keys stay inside their own sandboxes. A key made by
another key with reach
agentnow gets403 forbiddenon the account's own settings, whatever its person's role: closing the account, webhooks, telemetry exports, the audit log, credit and billing, secrets, domains and networks. It still runs sandboxes, reads its own usage and makes its own keys; an account-wide one keeps everything. See Run a swarm. - Code interpreter cells and terminals show in a sandbox's commands. A
sandbox driven only by E2B's
runCode/run_codelisted no commands at all. Each cell is now kept as its language (python-cell · exit 1 · 2 sfor a cell that raised), and a terminal as its shell; never the code or what is typed. See observability. mkdir -p /workspacethrough the files API is success.files:mkdir(and the files tool's mkdir) on/workspaceor/answered 400 "Refusing the root of a tree"; it now answerscreated: false, as for any folder that already exists. AndGET /v1/usage?key=with something that is not a key's id answers 400invalid_requestrather than 500.- Wallet accounts and the welcome match. An account an agent opened with a wallet, and that no person has taken over, no longer earns the welcome match or a referral reward on its payments. Once a person takes it over, its later payments earn them as usual. See paying with stablecoins.
- A key makes more keys over the API, with no browser. For agent swarms and
for accounts opened with a wallet.
POST /v1/keys,GET /v1/keysandDELETE /v1/keys/{id},runtime.keys.create/list/revoke/usagein the TypeScript SDK, andruntime keys create --name worker-1 --daily-limit 5with a key on the machine (--browserkeeps the browser approval). New:runtime keys ls,runtime keys usage <keyId>,runtime keys revoke <keyId>, andGET /v1/usage?key=. Each key is its own agent, a new key never has more than its maker, and the daily limits of the keys a key made add up to at most its own. See run a swarm. - The Python, Go, Java and Ruby SDKs no longer take a failure or a cut stream for a success. A call that runs longer than 90 seconds gets its status early and its answer after; when that answer is an error (a create whose host was lost, say), Go, Java and Ruby now raise it, as JavaScript and Python did, instead of returning an empty result. A file read in Go, Java or Ruby is checked against the length and SHA-256 the API sends with it, read again if it came short, and refused rather than returned short. In Python's synchronous client, an event stream (a watch, a log follow) whose connection closed part way raises instead of ending as if it had finished. Each arrives with that SDK's next release.
- Free usage is for trying Runtime, and a lower limit applies to every
account at once. An account that has never paid gets its 100 free hours
(100 GiB-hours of memory and 25 vCPU-hours of active CPU) once, across the
30 days from its opening, and then nothing until it adds credit. An account
that has paid gets them every month, as before. Saved copies (10 GB) and
disks (5 GB) stay monthly for every account, and the startup hours are
unchanged.
GET /v1/usageshowsfreeUntilon each ofallowances: when the free machine time ends, or null once the account has paid. Usage & billing and the sign-in and offer pages say it the same way. - Without credit, fewer sandboxes at once, and a few new limits. Four
sandboxes run at once, not eight, with at most 8 vCPU and 16 GiB in all,
not 16 and 32. An account keeps at most 10 sandboxes, running, paused or
stopped (a create past it is refused with
no_credit_kept_limit, 409), and makes at most 50 a day, in any 24 hours (no_credit_daily_limit, 429). Waking, resuming or deleting a sandbox you already keep is never refused. Scheduled jobs do not run without credit: a job waits withblockedReasoncreditsuntil the account holds credit. Adding credit lifts all of these. Public previews and ports other than 80 and 443 were already for paid accounts only. The Python SDK's Inspect integration defaults to four sandboxes at a time. - Every limit is published, and an account with credit is charged, not
capped. With credit, an account keeps up to 10,000 volumes, snapshots,
images, volume backups, jobs and secrets (5 volumes before), with no limit
on the GBs of volumes and images, which its credit pays for. A
quota_exceedednow names the limit and its number in its message and indetails(limit,max,raise), including the vCPU, memory and disk limits that said only "quota exceeded". The limits guide lists every one, and the console's Limits page shows each with what the account uses. - A stop or delete never loses a snapshot or a sandbox's disk. Stopping
or deleting a sandbox while a snapshot of it is still being taken is now
refused with
snapshot_in_progress(409) and nothing changes, instead of destroying the sandbox and failing the snapshot; wait until the snapshot isreadyand stop it again (see troubleshooting). A stop that comes while a paused sandbox is waking from its saved copy, or is still being copied to another host, or just after that copy was restored, keeps the copy and the disk. A resize of a sandbox that only its saved copy holds wakes it from that copy. A volume lost with its host keeps its newest ready backup past its retention, so the backup the error tells you to restore from is still there. - An agent with no shell can open and pay for an account over MCP. Two new
tools,
runtime_wallet_openandruntime_wallet_claim(also at/mcp?signup=wallet), open an account paid in USDC: the first answers with an address per network, the exact amount and a claim code; the second connects once the payment lands. There is no free trial on this path. The Go, Ruby and Java SDKs gain the wallet calls, andruntime_connectpicks up a key saved after the MCP server started. See pay with stablecoins. - No paid-or-trial choice in the SDKs. Free usage comes first, then
credit, and there is nothing to choose, so the examples and options that
showed
fundingare gone and Harbor and Inspect tell an account without credit to add credit for a bigger size. The option is still accepted (deprecated in Go and Java), so existing code runs. - A preview, port or private stream keeps going when you extend the time limit. A long download through a private preview was cut at the end of the limit it began under even though you had extended the sandbox, and it now carries on into the new limit. A limit that really ends still cuts it.
- Pages in the console answer faster. Every page waits less for the sign-in check and makes fewer database round trips, a click from page to page no longer waits a fixed 0.3 seconds, and a new account's Home is built once, not twice.
- A slow command start no longer holds up the sandbox's other calls. Starting a command no longer blocks listing processes, reading or writing files and killing processes while it waits for a slot. A command that waits in line longer than 6 seconds is refused as busy, which is safe to retry, instead of ending with an unknown outcome.
- A short database outage no longer fails a start, stop, wake or delete.
A broken database connection no longer ends one of these as
operation_failed, and after a database restart the first request on a reconnected connection is answered instead of failing with the old session's error. - A member an owner removed stays removed. If an owner removes someone, or they leave, after your directory had deactivated and an invitation had brought them back, single sign-on directory sync no longer restores their membership when it turns them on again.
- A wallet top-up that never reached the payment provider says so. A claim whose top-up was never created no longer shows a pay-by time; it says to send the top-up again with the claim code.
13 October 2026#
- A secret can go to only some of your sandboxes. A secret reached every
sandbox of the account; it can now name the sandboxes that get it, by
label or by id.
runtime secrets set NAME --host api.example.com --only-label role=hub(once per selector) or--only-sandbox <id>gives it to those alone,--all-sandboxesgives it to every sandbox again, andruntime secrets scope NAMEchanges who gets an existing secret without its value. The API takesonly(andPUT /v1/egress-secrets/{name}/sandboxes), the SDKsonlyandsecrets.scope, and MCP the sameonly. A new value keeps the scope it had. Settings → Secrets sets the scope and shows which sandboxes each secret reaches, andGET /v1/egress-secretsgives each scoped secret'sreaches. See secrets sandboxes never see. - Every account page is drawn from one kit. Home, Usage & billing, Sandboxes, Jobs, Secrets, Networking, Settings, Support and the rest are one column 1040px wide with the same spacing, bigger buttons, 13px text at AA contrast or better, and one Select, DatePicker and Input everywhere. Each page's loading outline is measured from the page that follows it, so nothing moves when it arrives.
- Identity tokens work in a scheduled job's run.
identity_token()in a job answeredidentity_refused(403) because the run read a token left from the sandbox's warm start. The command now gets the sandbox's current identity-token request token, as a command in the sandbox does. See identity tokens. - Commands run in a sandbox at its open-connection limit. A sandbox holding all of its open connections (a crawler, a server's keep-alives) had every command answered 503 "environment unavailable" until one closed. Its environment read now goes through, and everything else over the limit is still refused.
- A terminal or tunnel cut by its sandbox ending says so. When a sandbox's
stop, pause, time limit or delete closes a terminal or a tunnel, you now
get that reason, not
503 guest_failed. - A full house names what it is waiting for. A create from a snapshot,
image or volume starts only on the servers that keep it. When those are
full it answers
no_capacity(409) saying so, withdetails.keptOnset tosnapshot,imageorvolume, instead of saying the whole region is full; create without it to start anywhere in the region. - A custom image's creates start faster. A create from a custom image goes first to a host that already ran the image at the same vCPU, memory and disk, where it restores from a start template instead of booting cold.
- An email before your sandboxes are deleted. Every account's owners are emailed the day-before deletion warning (it was sent only to pilots), with how many sandboxes and other items go and when, and a sandbox is told its retention started once, not again beside the warning. On an account without credit, adding credit before the deadline keeps them.
- Deleting a sandbox the host had already removed completes. A delete the host had carried out is answered as done, no longer "Guest not found" for good.
- The support chat shows what it is doing. Until the answer arrives, the chat says "Searching the docs…" and the like instead of bare dots. Account → Support is one chat window, and a short conversation lets the page scroll.
- A quieter free hours card. The card on Usage & billing is small: it says the hours are included every month for paying accounts, shows one plain line once they are used, and is never red.
- Pasted secrets and plural CLI options work.
runtime secrets setdrops the line breaks, bracketed-paste markers and outer spaces a pasted token carries, from standard input and the hidden prompt alike.--hosts a,bis--host a --host b, and likewise for--allow,--denyand--connect; any other plural is still refused as a typo. - A full snapshot count names its limit. A snapshot refused at the account's count says which limit it is and that every key's snapshots count. See limits.
12 October 2026#
- A new look for the console. Usage & billing, Home, Settings, Close account, Sandboxes, Jobs, Secrets, Agents & API keys, Webhooks, Networking and two-step sign-in are rebuilt from one set of pieces: a near-white ground, white cards, pill controls and Inter. Usage & billing leads with the balance and the amounts to add, with auto top-up and the referral as rows, the month beside its products, limits as meters and the statement as a ledger. Home opens with one line, "All healthy." or "One thing needs you."
- A scheduled job whose sandbox was deleted before it started runs
again. A run whose sandbox was deleted under it stayed "provisioning" for
good, and a job runs once at a time, so the job never ran again. The run
now ends as unknown (
compute_stopped) and the next occurrence runs. - 100 free hours every month. Every account's free usage is now told in one figure: 100 free hours a month of a 1 GB machine, which is 100 GiB-hours of memory and 25 vCPU-hours of active CPU (about 25 hours of a 2 vCPU, 4 GB sandbox at half busy). Saved copies (10 GB) and disks (5 GB) are unchanged. It applies to every account. Usage & billing now shows the free hours left this month, with the memory and active CPU behind them, and the guides call it free usage throughout.
- The Blaxel and Daytona drop-ins honour the create options they used to
drop. In
withruntime.blaxel,SandboxInstance.create(config, timeout=N)(1 to 50 seconds, as Blaxel 0.4.13) deletes a sandbox not running in time and raisesSandboxCreationTimeoutError, andsafe=Truechecks the new sandbox answers. Inwithruntime.daytona,create(timeout=...)bounds the create,queue_timeoutis how many minutes it waits for room (thenDaytonaQueueTimeoutError),pip_install_from_requirementstakes pip's index and link options, andkvm, adockerfile_commandsbuild context andwait_for_resize_completeare refused by name instead of ignored. - A busy sandbox's refusal keeps its own error. When a call waits to
retry
guest_busyor a full house and its deadline ends the wait, the JavaScript SDK now throws that refusal, as it judged it would, instead of "The call was cancelled or ran past its deadline". Your own cancel still ends the call as a cancel. - Why a secret's placeholder arrived unchanged. The troubleshooting
guide now covers a rule's near-miss (
/ingestis not/ingest/), paths that read two ways, clients that ignoreHTTPS_PROXY, and what the sandbox's ownNO_PROXYlists; the security guide links to it. - JavaScript cells with
awaitkeep their variables. Aconst,let,classor function declared in a JavaScript or TypeScript interpreter cell that uses top-levelawaitis there in the next cell, as in every other cell. Before, it ended with its cell and the next one reada is not defined. A cell run again may declare itsconstandletagain, as in a browser console. See code interpreter. - A paused sandbox that will not wake tells you what to do. When
autoWakeis off, a call to a paused sandbox answerssandbox_paused(409) with "…and autoWake is off, so requests do not wake it: call wake, or update it with autoWake: true." The Go KeepAlive example no longer turnsautoWakeoff, since it is on by default (the API reference). - Clear words for an image limit below the base. A build from Runtime's
base (
FROM runtime, or a recipe without a base) with abuild.maxImageMiBunder 3,072 MiB, the base's own size, is now refused when you send it, with the smallest value that works, instead of failing after it was queued. - Know when your usage export is final. Every page of
GET /v1/usage/exportnow carriesfinalThrough: no row settled before it can still appear or change, so a range ending at or before it is complete for good. Each row also saysfinal: trueonce its sandbox or volume is deleted and every charge it will ever have is in the export. A volume's backups bill until their retention ends, so they are not final when the volume is. The CSV gains a last column,final. See export settled usage. - Compartments. Wall a group of keys off from the rest of your account:
choose One compartment when you make a key at API keys. A key in a
compartment sees and uses only the sandboxes, snapshots, images, volumes,
previews, ports and jobs its compartment's keys made; everything else answers
"not found", and no other key reaches in except an account-wide one. Give one
to each customer of your platform, or to an agent whose sandboxes nobody
else may touch. Each compartment has its own sandbox names, so every
customer can have its own
main(compartments). - An email when your credit is in. Each time you buy credit, Runtime emails you once it lands: what you added, the welcome or referral match it earned, and your balance now. An automatic top-up emails everyone on the account who may pay. See pricing.
- Delete sandboxes by label.
runtime sandboxes rm --label team=search,sandboxes.deleteAll({ labels })in JavaScript andsandboxes.delete_all(labels=...)in Python delete for good every sandbox with all the labels given, stopped ones too, the way stop by label already stops them. Each returns what it deleted and what failed. In the CLI's and each SDK's next release. See the CLI. - Wallet top-ups say when they are off.
POST /api/wallet/topupsanswers 404 with codenot_availablewhile wallet top-ups are switched off, instead of 503, so a client can tell an option not offered from an outage. - Storage reaches your usage export an hour sooner. Each hour of storage (a paused sandbox's memory and disk, a stopped sandbox's disk, images, snapshots, volumes and volume backups) now settles within a minute of its end, usually seconds, instead of 58 minutes after it. Nothing is charged differently. See export settled usage.
- A code for a new account by email. Opening an account by email now asks for the six-digit code the email carries, typed on the page where you asked for it, instead of a link click. An address with an account gets one email with its link and a code, so signing in is still one click. Every address sees the same page, "check your email", so the page never says whether an address has an account. New accounts by email are not opened from data-centre or VPN networks, and no email comes: use Google there, or write to support@withruntime.com. An address gets at most five sign-in emails an hour, and ten wrong code tries a day; past that, its email has only the link.
- A paused sandbox tells you how to reach it. When a sandbox has paused
and its autoWake is off, a request to it now answers
409 sandbox_pausedwith what to do: call wake, or update the sandbox withautoWake: true. The Go keep-alive example no longer turns autoWake off, so a sandbox copied from it wakes on its next request. See troubleshooting.
11 October 2026#
- Faster retries when a server cannot be reached. When a connection to the API is refused before your request leaves, the SDKs (JavaScript, Python, Go, Java and Ruby) send it again at once instead of after a quarter of a second, so a server that just went away costs your call almost nothing. A request that may have reached a server waits and retries under its idempotency key as before, so nothing runs twice. In each SDK's next release.
10 October 2026#
- Auto top-up. Usage & billing can add credit from a saved card when your
balance falls below a line you pick, up to a monthly most you set. Each
automatic top-up earns 5% more as credit, and while it is on your
account runs 200 sandboxes at once instead of
- A declined charge turns it off and never stops a running
sandbox. Also
runtime billing auto-top-up, the SDKs and/v1/billing/auto-top-up. See auto top-up.
- A declined charge turns it off and never stops a running
sandbox. Also
- Jobs in the console. A Jobs page lists every scheduled job: its schedule in words, its size, its last run and how it ended, its next run and this month's cost, with what needs you first. A job's page shows each run's state, start, length, exit code, cost and output, and pauses, resumes or cancels the job. See scheduled jobs.
- Run a job now, or change its schedule. Run now starts one run at once,
beside the job's schedule; a paused job runs once and stays paused. Change
schedule moves the next run to the new schedule's next time, and a run going
finishes as it started. On the job's page,
runtime jobs triggerandruntime jobs reschedule, the SDKs, MCP and/v1/jobs/{id}:triggerand:reschedule. See jobs. - Secrets in the console. Settings → Secrets lists every secret your
sandboxes and jobs use: the hosts each may reach, where its value goes, its
rules, whether jobs have a copy, and who added and last changed it. Add a
secret, replace its value or delete it there, as with
runtime secrets. Values are never shown, there or anywhere. See secrets sandboxes never see. - Referrals pay on every payment, and for a year. When a company signs up with your link, every credit it adds in its first 30 days is matched for both of you, up to $1,000 for each company, not only its first top-up. Then, for 12 months, you earn 10% of what it spends from credit it paid for, up to $50,000 a year. Your link opens an invite page with the offer and a way to sign up. See referrals.
- Creates stay fast with a thousand sandboxes. A create now costs the same beside a thousand of your account's sandboxes as beside none: what it checks (sandboxes at once, quotas, a server's room) is kept as a running total instead of counted again at each create. On a test database with one account on one server, a create's database work beside 1,000 sandboxes went from 11 to 85 ms to 6.3 to 9.7 ms, and 100 creates over 8 connections from 6 to 11.5 s to 0.5 to 0.6 s. Every limit holds exactly as before.
9 October 2026#
- A limit without credit says plainly how to lift it. Every refusal an
account meets because it has not paid (sizes, sandboxes at once, builds,
used-up included usage, public previews, open ports and the network
features) now answers in one shape: what was refused and the limit, what to
do now, and that the account's owner adds credit at Usage & billing, with
the welcome match.
details.addCreditsays the same for code. See responses and errors. - Out-of-memory kills are reported. When Linux ends a program because its
sandbox ran out of memory, the command's result, its process and the
stream's
exitevent carryoutOfMemory: the codeout_of_memory, how many processes were ended, the sandbox'smemoryMiBand a hint (1,024 MiB or more, or a resize while paused). Each such command also sends the eventsandbox.out_of_memoryto your webhooks. See when a program runs out of memory. - Rebuilt custom images start warm from their first sandbox. A new build of an image starts at the sizes your account's other images use on that server, before any sandbox asks for them; only your own account's images count. On a test server, a rebuilt image's first 1 vCPU, 512 MiB sandbox started in 120 to 139 ms, where it took 2,364 ms. See fast starts.
- Custom images behave as on Docker in three more places. A file the image
puts in
/tmpis there when a sandbox starts; a string command on an image without bash, such as Alpine or BusyBox, runs under/bin/sh; and0.0.0.0and the sandbox's own addresses skip the proxy, so a server you start in the sandbox answers from inside it. Existing images get this at their next cold start, with no rebuild. See images. - A secret goes only into a request header. The proxy puts a secret's value
in the header you set for it, or, with none set, in the credential headers
(
Authorization,x-api-key,x-goog-api-key,api-key,xi-api-key,x-subscription-tokenandprivate-token), never in a URL's path or query or another header, where the placeholder now goes out as it is. Stored OpenAI, Anthropic and Gemini keys keep working; code that put a placeholder in a URL should send it in a header. See secrets sandboxes never see. - A full disk answers
no_spacewith how to free it. A command, file write or other call that finds the sandbox's disk full answers 409no_space, with a hint: delete files, or create a sandbox with a largerdiskMiB. The sandbox keeps taking commands, so thermthat frees space runs. See troubleshooting.
8 October 2026#
- Runtime for Startups now speaks of startup hours. The machine time is
10,000 startup hours, each an hour of a 2 vCPU, 4 GB sandbox. Storage kept free each month and the at-once limits
are what Runtime for Startups includes; the amounts and terms are unchanged.
GET /v1/usagenow names its fieldsstartupIncludedandstartupLimits, with the same shapes. The old fieldspotandpotLimitsstill work for 30 days after this change ships, with a warning. See included usage. - Sign up with Google in one click, and start a sandbox from Home. "Start free, no card" opens Google sign-in at once, with no human check to wait for (a sign-in by email link still has one), and a new account's Home opens on a sandbox you start with one click, then the prompt to paste into your agent.
7 October 2026#
- Every credit you add in your first 30 days is matched, up to $1,000 in total.
The welcome match now covers each payment, not only the first: add $20 and
then $500 and you get $520 more. Home, the billing page and
runtime switchshow how much of the $1,000 is used and left (welcome match). - Your first top-up is matched, up to $1,000. Every organization's first top-up made within 30 days of signing up is matched with credit, up to $1,000, with nothing to claim; Home and the billing page show the date it ends (welcome match). A referral now matches up to $1,000 on each side (referrals); the two never stack, and the larger applies.
- Runtime for Startups gives a startup pot. An accepted startup gets 10,000 startup hours, each an hour of a 2 vCPU, 4 GB sandbox, given once and used within 12 months, with 100 GB of saved copies and 100 GB of volumes kept free each month for those 12 months, 8 image builds at once, 100 sandboxes at once (up to 1,000 on request), and every paid feature. The pot is used after each month's included usage and before credit. Apply at withruntime.com/startups.
- One plural word names each product everywhere.
/v1/sandboxes,runtime.sandboxes,runtime sandboxesandruntime_sandboxes, and the same for every product; from SDK 0.12.0, each product can also be imported alone, aswithruntime/<product>. The old words keep working for 30 days, and each use warns with the new name (the API).
6 October 2026#
- A browser says when its sandbox is small for heavy apps.
browser:startnow answers the sandbox'smemoryMiBand, under 2 GiB, ahint: heavy apps such as Google Sheets, YouTube and StackBlitz need 2 GiB. Of 100 visits to ten heavy pages, 56 crashed for memory at 1 GiB, 20 at 1.5 GiB and none at 2 GiB. 1 GiB still suits light pages and scraping, and the browser starts at any size.runtime sandbox browser startprints the hint. - Usage included every month, for every account, and jobs run on it.
Every account now gets 100 GiB-hours of machine memory, 25 vCPU-hours of
active CPU, 10 GB of saved copies (snapshots, images,
backups) and 5 GB of volumes each calendar month, enough for
100 free hours of a 1 GB machine, with no card. It renews on the 1st (UTC), is used
before credit and is never charged. New accounts get it in place of free
hours; an account given free hours before 6 October keeps what is left of them,
and has the included usage as well.
GET /v1/usagelists each product's share underallowances, andtrialgainsofferandrenewsAt. A scheduled job's runs spend it first, then credit, as a sandbox does; a run it cannot take, on an account without credit, waits withblockedReasoncredits. An account holds up to 1,000 jobs and 1,000 secrets for jobs, where it held 50 and 200. Credit, bought or given, now opens every paid feature but three: a kept top-up is needed only for ports beyond 80 and 443, public previews, and private networks and Tailscale. Without credit, an account runs at most 8 vCPU and 16 GiB at once across its sandboxes and image builds, beside 2 vCPU and 4 GiB each and eight at once; past it, a create, wake or build is refused with 409no_credit_total_limit, whose message says what runs now. Seven codes are renamed, in the API, MCP, CLI and every SDK:trial_busyis nowno_credit_running_limit,trial_capacityno_credit_capacity_full,invalid_trialno_credit_size_limit,trial_domain_limitno_credit_domain_limit,trial_build_limitno_credit_build_limit,trial_exhaustedincluded_usage_used_upandtrial_unavailableincluded_usage_unavailable; code that compares with an old name should compare with both until it updates. See included usage and what a job costs. - Volume backups cost $0.02 per decimal GB per 30-day month. They
cost $0.012, which is below what keeping each backup in two
places costs us: one copy beside the servers and one with a second provider.
A backup made from now costs the new rate. One you already have keeps
$0.012 until 7 November 2026, then costs the new rate
too; a backup on the included usage stays free. Nothing else changes, and
nothing is charged twice: a backup's hour that runs across the date is
charged each part at its own rate.
GET /v1/usageshows each backup's rate now underrates. See pricing. - Leaving a block deletes the sandbox it made. From the next release of
the TypeScript and Python SDKs, the end of an
await usingorwithblock deletes a sandbox thatSandbox.create()made there, where it used to stop it and keep its disk, which bills. Create it withkeep: true(Pythonkeep=True) to stop it instead, as before. A sandbox the block got withget(), or onegetOrCreate()found already there, is still only stopped. The drop-ins keep each rival's own block exit:withruntime/e2b(Python) kills,withruntime/vercelstops in TypeScript and deletes in Python.
5 October 2026#
- A hundred sandboxes at once from the first top-up, and time limits up to
24 hours. A paid account runs 100 sandboxes at once as
soon as its first top-up clears, where a new one ran 50 for its first week;
only a disputed payment, a suspension or an abuse report holds an account to
- Paused and stopped sandboxes no longer count
toward it, and an account keeps up to 1,000 in all. A time limit goes up to
24 hours, where it stopped at one, and a sandbox it stops reads
stopReasontime_limitwhere it readlease_expired, in the API, events, webhooks and OpenTelemetry export: code that compares withlease_expiredshould compare with both. A sandbox's disk is at most 400 GiB, and a largerdiskMiBis refused at once, naming the limit. See how many at once.
- Paused and stopped sandboxes no longer count
toward it, and an account keeps up to 1,000 in all. A time limit goes up to
24 hours, where it stopped at one, and a sandbox it stops reads
- Downloads as fast as the server's link, and TCP ports five times faster. A sandbox's downloads are no longer capped: each sandbox shares its server's link, and when several are busy a paid account gets four times the share of one without credit. Uploads stay limited, more strictly without credit (10 Mbit/s); paid uploads are 500 Mbit/s, 200 Mbit/s after 10 GiB, 500 GiB a day. A public TCP port now moves traffic at those paid figures, where it was 100 Mbit/s, 20 Mbit/s after 2 GiB and 50 GiB a day. See sandbox environment.
- A snapshot of a running sandbox, in one call, at any size.
POST :snapshotandruntime_snapshot(actioncreate) take a running sandbox: they pause it, capture it and wake it, as a fork does, and answer once the capture is over. A sandbox with volumes is still refused. A copy of a disk snapshot takes the vCPUs, memory and disk you ask for, with a disk at least the saved one; a memory snapshot's copy is still the snapshot's size, and asking for another size answers400. Every sandbox can now pause, fork and be snapshotted, and every stop keeps the sandbox's files. See snapshots and forks. - What a sandbox serves is billed as outbound traffic, and persistence
costs nothing extra. For sandboxes created from today, what a sandbox
sends back through a preview, a custom domain or a TCP port counts toward
the account's 100 GiB a month free, then $0.02
per GB, like what it sends over its own connections; what visitors send in
stays free. While a sandbox made from today runs, its disk past the first
10 GiB is billed at $0.08 per decimal
GB per 30-day month, as a paused disk is; a disk of
10 GiB or less never pays it. A
persistentsandbox no longer pays $0.11 per GiB for a reserved disk all the time: its disk is billed as any sandbox's, andpersistentmeans only "keep it running". See pricing. - More E2B code runs unchanged on
withruntime/e2b. In the JavaScript SDK 0.11.2 and the Python SDK 0.11.1, a hundred commands at once run at once,kill()deletes the sandbox, a template name resolves with its team and tag,commands.listgivescmdandargs, file entries carry permissions and owners, paths under/home/usercome back as E2B gives them, and in Python every module path e2b 2.52.1 defines a public name in imports. See migrating.
4 October 2026#
- Paused sandboxes, kept disks and snapshots are kept while you have
credit. A paused sandbox, a stopped one's disk and a snapshot stay for as
long as the account holds credit, with no 30-day or 7-day end, unless you set
days with
:retentionor a snapshot'sretentionDays. When credit runs out they are kept seven more days, with a notice first, and a top-up keeps them again. A sandbox paused on the trial is kept the same way once the account holds credit, and its storage is billed from the end of its seven free days. See paused storage. - The trial's hours, then credit, with nothing to choose. A sandbox runs
on the free trial's hours first and on prepaid credit after, automatically:
at create, when a paused sandbox wakes, and while one runs, so a running
trial sandbox carries on on credit instead of pausing when the hours run
out. A request's
fundingis accepted and ignored, and code that sets it keeps working. Once an account holds credit, its sandboxes have paid limits and still spend the trial's hours first, and a trial sandbox that turns paid while it runs gets a paid sandbox's disk share at once and, if the trial had slowed it, its full cores back. See included usage. - Public previews follow a kept purchase. A preview can be public once the account has bought credit; credit given alone does not open one. While an account is blocked, or every purchase it made is refunded in full, its public previews need the token like private ones, and they open to anyone again once it pays. See security.
- A stop keeps the disk; only a delete removes it. A stopped sandbox keeps
its files for $0.08 per decimal GB per 30-day month, reads
diskKept: trueand starts again from them with:restart, its memory gone; deleting it removes them.onLeaseEnd: "delete"deletes a sandbox and its files when its time limit ends. A stop from a client released before today, or from raw HTTP withoutx-runtime-client: http/2026-10-04, keeps the disk free for three days, with one notice, and then deletes it. The console shows Restart and Delete on a stopped sandbox. See paused storage. - Ending a sandbox never waits for room. A delete, stop or pause never fails for lack of room, even on a full server.
3 October 2026#
- A sandbox runs while it works. There is no lease to manage any more: a
sandbox has no time limit unless you set one, runs for as long as it is busy
and pauses itself when idle, until you stop it or credit runs out. Nothing
needs extending, and code that extends, sets
timeoutSecondsor callskeepAlivekeeps working: a time limit you set is still kept.endsAtsays when a sandbox will stop or pause by itself, and isnullwhen it never will. The E2B, Daytona, Vercel, Blaxel, Modal and Runloop adapters do the same when your code sets no timeout. See the API. - Runtime for Startups. A venture-backed startup building with AI agents can apply at withruntime.com/startups for $5,000 of credit, added over 12 months (since 7 October 2026, the startup pot instead: 10,000 startup hours, each an hour of a 2 vCPU, 4 GB sandbox, given once, to use within 12 months). An accepted startup's account counts as paid from the day it is accepted. See pricing.
- Two error codes are renamed. A command whose timeout outlasts the
sandbox's time limit or its funded time is refused with 409
time_limit_too_short, anddetails.secondsLeftsays how long is left:time_limit_too_shortreplaceslease_too_short. A host that is busy answers 503busy, safe to retry with the same key:busyreplacesfence_conflict. Code that matched the old names should match the new ones. See errors. - More requests at once for accounts with many sandboxes. An organization may have 192 requests in flight, and two more for each sandbox it holds that is not stopped, up to 1,024, so every sandbox can stream a command and a watch at once. See limits.
2 October 2026#
- Export settled usage for a chosen period.
runtime usage exportand/v1/usage/exportcover every visible product and resource with exact charges in the server's CSV. The CLI follows every page; API callers can follow the returned cursor. Pending holds stay separate. See the API. - Archive bytes and root-owned folders. Native SDK archive helpers return or unpack tar bytes, support relative exclusions and explicitly requested root access through passwordless guest sudo. JavaScript request cancellation reaches transfers and local extraction. See files.
- Current MCP groups give the replacement call. Retired aliases fail with the canonical group and action before doing work. ChatGPT connections get scoped preview links without a persistent gateway credential. See MCP.
- A browser for Playwright, Puppeteer and browser-use.
sbx.browser.start()runs Chromium in a sandbox and returns a privatecdpUrlthatconnectOverCDPandpuppeteer.connecttake as it is. The browser is paid for as its sandbox and follows the sandbox's network rules, and the desktop opens pages in Chromium instead of Firefox. See a browser over CDP. - More E2B, Daytona and Vercel Sandbox code runs unchanged. The E2B adapter
runs commands, terminals and files as another
user, keeps a sandbox for up to 24 hours, filters, sorts and resumesSandbox.list, returns a command's whole output and works with e2b 2.52.0. The Daytona adapter opens PTY sessions you can attach to again, drives the desktop throughcomputerUse, runs as auserfrom your image, keeps a sandbox past an hour and filterslist. The Vercel adapter creates users and groups, keeps a sandbox past an hour and pagesSandbox.listwith cursors. See migrating.
1 October 2026#
- Build images and manage volumes in the console. Build from a Dockerfile, a registry image or a package recipe, start a sandbox from an image version, manage tags, and create, back up or restore volumes. Spending and deletion ask first. See images and storage.
- See API calls, CPU waiting and memory stalls in the console. Usage & billing shows the account's API calls and errors by operation and exports settled usage as a CSV file; a sandbox's Activity tab charts CPU wait and memory stalls. See observability.
- Request a feature from the console. The Support page has a Request a feature button, which opens the feedback form on a feature request and asks what the feature would let you build. See send feedback.
30 September 2026#
- Environment variables for a whole sandbox. Pass
envat create, or change it later with an update, and every command, background process, terminal, SSH session and image start command gets those variables. Values are stored encrypted and never shown back. See the API. - Delete a sandbox for good.
DELETE /v1/sandboxes/{id},sbx.delete()andruntime sandbox rmstop it, remove its disk and paused memory, revoke its previews and ports, and free its name. Usage and audit history stay. - Switch a sandbox to a new image and keep your work. Switching keeps the
sandbox's id, name,
/workspace, volumes, environment, previews and ports; processes restart. See images. - Folders over plain HTTP. Upload or download a whole folder of any size as a tar stream. The SDKs verify a downloaded archive before merging its folder contents; ordinary file downloads publish only complete files.
- File changes to your webhooks. A watch started with
webhook: truesendssandbox.files.changedevents, signed and retried like every webhook, without keeping the sandbox awake. See observability. - Choose which sites may embed a preview.
embedOriginslists them, and a private link's token is refused in any other site's frame. - Join your Tailscale network. A paid sandbox can join your tailnet with an auth key stored as a secret. See networking.
- Trial sandboxes keep going while they work. A trial sandbox that is still
busy when its lease ends gets its
timeoutSecondsagain, until the trial hours run out. See included usage.
29 September 2026#
- Global installs run by name, and pnpm and yarn are ready. In a new
sandbox,
npm install -gfailed withoutsudo, and with it, or withbun add -g, the command installed but was not found. Now all three put their commands onPATH, sonpm install -g @anthropic-ai/claude-codegives youclaudestraight away, andpnpmandyarnwork through Corepack. See the sandbox environment. - Private previews work inside your own site's iframe. Set an iframe's
srcto a preview'surlWithToken: the link keeps its token for your site alone, a paused sandbox shows its waking page in the frame and reloads by itself, and a public preview skips its warning page when it is framed. See previews. - Disk-only snapshots.
mode: "disk"on a snapshot keeps only the root filesystem, and a sandbox created from it boots fresh with your files and no saved processes. Memory snapshots stay the default. See the API. - Faster disks, shared fairly. A sandbox's disk no longer has a fixed speed or a burst to run out. It shares its server's drives with the sandboxes beside it, in proportion: at least about 40 MB/s each way, and up to about 1 GB/s when its neighbours are quiet. A busy neighbour slows your writes a little rather than stalling them, and a pause stays quick on a busy server. See the sandbox environment.
28 September 2026#
- A console that reports your day. Home, Sandboxes, Images, Volumes, Usage & billing and Agents & API keys each open on what needs you, then today in a line, two charts and the list. Sandboxes describes today's runs as a whole, hour by hour against yesterday, by who started them and by image, and its list opens on what runs now, with search over every day. A sandbox's page says how it ended and why, draws its life from start to stop and copies what happened for your agent. Usage & billing shows spend by who started it and each key's use against its daily limit. Agents & API keys, in Settings, tells agents connected from a tool apart from API keys. Today is counted in your browser's time zone.
- Each sandbox's commands, on its page. A sandbox's page lists the commands
run in it,
pytest · exit 1 · 28 s, with failures in red and a running one as running: on its Activity tab while it runs, and in its life once it ends. Runtime keeps each command's program name, exit code and duration for 14 days, never its arguments. See observability. - Scheduled jobs. Run a command in a fresh sandbox once at a time you
choose or on a cron schedule in your timezone, with each run's exit code and
output kept, retries when you ask for them, and pause, resume and cancel:
runtime job create nightly --cron "0 3 * * *" -- python3 report.py,runtime.jobsin the SDKs, or theruntime_jobMCP tool. Runs are paid sandboxes at the sandbox rates. See scheduled jobs. - Secrets for jobs.
runtime secrets set NAME --jobskeeps a copy a job puts into its run's environment (--secret NAMEonruntime job create); with--hostas well, one command stores it for sandboxes and jobs alike. The jobs copy can be rotated and read back; the sandboxes' copy still never can. - The region is now
us-east. It wasus-east-vin, the name of one building; a region is named for its place, so more data centres nearby can join it. Every sandbox, snapshot, volume, image and job moved with it and keeps running. Asking forus-east-vinnow answersinvalid_regionand namesus-east, and an identity token'sregionclaim readsus-east, so update a trust policy that names the old one.withruntime0.8.4 sendsus-eastas a job's default region; update withnpm i withruntime@latestorpip install -U withruntime. A job that names a region Runtime does not have is now refused when you create it, rather than waiting at every run. - A sandbox from a browser. A sandbox session is a short-lived token your
own web page uses to run commands, read and write files and reach previews in
one sandbox, with no API key and no proxy of your own. It cannot stop, extend
or change the sandbox, lasts 1 hour unless you ask for up to
24 hours, can be revoked at once, and is answered only from the pages
you list.
sbx.sessions.create({ origins })makes one andSandbox.fromSession({ token, sandboxId })uses it, fromwithruntime0.8.3; Blaxel'ssandbox.sessionsandfromSessionnow work in the drop-in. See JavaScript and Python. - Passkeys. Sign in with a passkey, with no email link and no code, or use one as the second step in place of an authenticator app's code. Add them under Settings → Two-step sign-in, beside the app or instead of it. See two-step sign-in.
- A Go SDK.
go get withruntime.com/goinstalls one Go client for every Runtime product, with acontext.Contexton every call and only the standard library underneath. See the Go guide. - A Ruby SDK.
gem install withruntimeinstalls one Ruby client for every Runtime product, with only the standard library underneath. See the Ruby guide. - A Java SDK.
com.withruntime:withruntimeon Maven Central is one Java client for every Runtime product, for Java 17 and later with nothing beyond the JDK. See the Java guide. - Faster starts, pauses and stops. A new sandbox runs its first command 331 ms after the create request at the median, down from 374 ms, and 30 of 40 creates were running in under 200 ms. A pause answers in 165 ms, down from 226 ms, and a snapshot is ready in 3.27 s. On the server, without the network to Virginia, a pause answers in 81 ms, a wake in 75 ms and a stop in 37 ms; the speed page now shows those figures beside the ones from a laptop.
- Persistence can be turned off, and a stopped persistent sandbox deleted.
runtime sandbox update <id> --persistent off,update({ persistent: false })or:updatewith{"persistent": false}now works as the guides said: a running sandbox stops paying for its disk at once, and a stopped one has its disk deleted and its name freed. A stopped persistent sandbox is listed byruntime ls,runtime sandbox lsandGET /v1/sandboxeswith the live ones, since its disk is still kept and billed. - Agents can list images, volumes, volume backups and snapshots. Over
MCP,
runtime_image,runtime_volume,runtime_volume_backupandruntime_snapshottake the actionlist, with the filters and pages ofGET /v1/images,/v1/volumes,/v1/volume-backupsand/v1/snapshots:state,limit,cursorfrom the last page'snextCursor, andname, orvolumeIdfor backups andnameandsandboxIdfor snapshots. Theirgetnow reads one byid. See MCP.
27 September 2026#
- Two-step sign-in. Turn on a code from an authenticator app after every sign-in, whichever way you sign in, under Settings → Two-step sign-in. Owners can require it of everyone in the account. See two-step sign-in.
- Faster wakes, snapshots and stops. A paused sandbox runs its next command 588 ms after the call that wakes it at the median, down from 980 ms; a snapshot of a running sandbox is ready in 3.49 s, down from 6.54 s; a preview visit to a paused sandbox answers in 0.47 s, down from 0.77 s; and a stop answers the moment the sandbox is frozen. See speed.
- An uptime promise, paid automatically. Paid accounts are promised 99% API uptime every calendar month, measured by the outside check on the status page. A month below it gives every paid account 10% of that month's charges back as service credit in the first week of the next month, with no claim to file. The terms now give 30 days' emailed notice before we end an account without cause, and the liability floor is $1,000 instead of $100. See the Uptime Promise.
- Idle sandboxes pause themselves. A new sandbox pauses after 60 seconds
with nothing happening in it, used or not (a
persistentone only if you set an idle time), and pays only paused storage until the next request wakes it. A command or terminal still running, an open preview, port, SSH or tunnel connection, network traffic or CPU use keeps it awake.idlePauseSecondsnow goes as low as 10 seconds, and 0 still turns it off. Sandboxes made before today keep their settings. See pause when idle. - Account-wide keys. An owner or admin can make a key that sees and uses
every sandbox, snapshot, image and volume in the account, whichever key made
it, as a Blaxel workspace key does: choose Everything in the account at
API keys, switch an existing key from
its row, or approve
runtime keys create --account-wide.getOrCreatewith a name another key holds then returns that sandbox. Keys made without it are unchanged. See keys in a team. - Switch from Blaxel in one import. Code written for Blaxel's sandbox SDK
runs on Runtime after changing
@blaxel/coretowithruntime/blaxel(withruntime0.8.0), or in Pythonblaxel.coretowithruntime.blaxel(0.8.1). Processes, files, previews, snapshots, forks and the code interpreter carry over, and standby becomes a pause that keeps memory and processes until the next call wakes it. A switch from Blaxel now earns the switching credit: runruntime switch --from blaxelbefore your first top-up, and that top-up is matched, up to $100. See Runtime vs Blaxel. - Start a sandbox from the browser. A new account's Home offers Start a sandbox beside the agent prompt. It opens the sandbox with a shell running in the page, runs on the free hours, and pauses after an idle minute. It acts as an agent named Console, one for each member, shown on the API keys page like any other. See Get started.
26 September 2026#
- Single sign-on through OIDC. Okta, Entra ID and Google Workspace connections by OIDC can be saved and used, as SAML ones could. See single sign-on.
- Paid means paid and kept. Paid-only features follow a top-up that was not refunded or charged back in full, and a refund of a top-up that earned matching credit is smaller by any of that credit already spent. See pricing.
- Faster starts, pauses and wakes. Runtime now keeps machines of the most common sandbox shapes started ahead of time, and the servers keep memory ready for sandboxes that start or grow at once. Measured through the public API: a new sandbox runs its first Python command 374 ms after the create request at the median (495 ms p95, down from 981 ms), a pause takes 207 ms, a paused sandbox runs its next command 980 ms after the call that wakes it, and a preview visit to one answers in 0.77 s, down from 3.99 s. See speed for every figure and the samples.
- Outbound traffic has a price. Inbound traffic stays free, and each
account's first 100 GiB out a month is free. Past it, what sandboxes send to
the internet costs $0.02 per GB, fixed in each new sandbox's quote. Replies
served through previews, custom domains and TCP ports, traffic to your own
network, and trial sandboxes are not charged, and sandboxes made before today
keep free traffic for their whole life.
GET /v1/usageshows the month so far underoutbound. See pricing. - Your account opens straight away. A new account now lands in the full console. Home shows the setup prompt for your coding agent until the agent connects, and keys, billing and settings are in the menu from the first visit. Hide the prompt if you would rather start on your own.
- A smaller MCP tool list. An agent connected to Runtime's MCP server now
reads 45 tools instead of 80, in 61,754 characters instead of 80,808, before
its first call. A product's rarer verbs share one tool that takes an
action:runtime_volume_getis nowruntime_volumewith"action": "get". The first-session tools keep their names. The old names answered until the next release and said what replaced them; they were retired on 30 September 2026. See renamed tools.
25 September 2026#
- Sandboxes from a custom image start in half a second. Once an image is ready, a sandbox of the default size created from it starts from a started copy of the image: 481 ms from create to running at the median, from 3.7 s. See fast starts.
- A new console. Home shows what runs now, with live CPU and memory and what just happened across every product. New, or ⌘K, finds any page or resource and starts anything, showing the command that does it. A sandbox's page opens a terminal in the browser and has Pause, Wake, Snapshot, Fork and Stop; Images and Volumes have their own pages; Usage & billing says how long your credit lasts and charts daily spend by product. See your account.
- A 100-hour free trial. The free trial is now 100 hours of sandbox time, from 50, still with no card. Accounts already on the trial get the extra hours too; hours already used still count. See included usage.
- Sandboxes up to 16 vCPUs and 64 GiB. A paid sandbox can now be as large as 16 vCPUs and 64 GiB of memory, at the same per-unit rates; a trial sandbox stays at 2 vCPU and 4 GiB. See pricing.
- Faster network for paid sandboxes. A paid sandbox moves up to 500 Mbit/s, 200 Mbit/s sustained after its first 10 GiB, and 500 GiB a day. See the sandbox environment.
- Outbound UDP to any port. Paid sandboxes send UDP to any public address and port: HTTP/3 and QUIC, DNS to a resolver you choose, time sync, game and media servers, WireGuard and other VPN clients. Private addresses are refused, a sandbox sends at most 50,000 datagrams a second, and a flow that gets no answer after 256 datagrams is closed. Trial sandboxes send TCP only. See networking.
- 50 sandboxes at once for a new paid account, then 100. A paid account runs up to 50 at once until 7 days after its first top-up clears or $50 of paid use has settled, whichever comes first, then 100. A paid account now runs 100 from its first top-up. See pricing.
- Rules on a secret. On a paid account, a secret can name the methods and
paths it goes to, such as
GET /repos/acme/*; a request no rule allows goes out without it. See security. - Your own upstream proxy. A paid account can send its sandboxes' traffic, or only the hosts it names, through its own HTTP or HTTPS proxy, with one of its secrets as the proxy's password. Runtime's own checks still come first, and a proxy that fails refuses the connection rather than going direct. See networking.
- Custom images get
sudo,adduseranduseradd. Every image Runtime builds, from a public image too, gives the sandbox user passwordlesssudo, and the base image now carriesadduseranduseradd. A command in a sandbox from an image starts in the image's lastWORKDIR(inside/workspace). Build logs number only the steps they log. - Close your account yourself. An owner closes the account at
Close account or with
POST /v1/account:close;runtime account closearrived inwithruntime0.7.0. See teams. - Usage per run.
GET /v1/usagenow gives each resource's name, start time, size and billed running time. Inwithruntime0.7.0,runtime usage --csvexports one row per resource to the microdollar.
24 September 2026#
- Disk bursts. A sandbox now writes at about 250 MB/s for up to 30 seconds before settling at about 40 MB/s, so installs, builds and test runs finish sooner. In a measurement a sandbox wrote at 200 MB/s instead of 38 (now up to about 1 GB/s, with no burst to run out). See the sandbox environment.
- Volumes and snapshots are backed up off their server. Every kept snapshot
is copied off its server, encrypted with your organization's own key, and a
volume is backed up daily and on request, then restored as a new volume
(
runtime volume backup,runtime volume restore). See storage and backups. - Faster default starts. In matched 20-run public-API measurements, the default 2 vCPU / 4 GiB memory / 4 GiB disk sandbox reached running in 207 ms median (620 ms p95), and took 351 ms median from create through the first Python result (815 ms p95). Both runs had zero errors. See speed for the before figures and scope; Python execution itself did not get faster.
- Python data tools are ready. The current default image includes NumPy, pandas and matplotlib. Imports and PNG plotting were checked in a live sandbox. Retained sandboxes keep their existing image.
- Identity and file permissions. A new sandbox on the current default image receives its current lease's identity-token environment before its first accepted command. File writes apply the requested mode, including executable scripts; the default remains 0644.
- The code interpreter speaks seven languages. Python, JavaScript,
TypeScript, R, Java, Bash and Go, each keeping its state between cells (Go
keeps its declarations and runs each cell as a program). R plots come back
as PNG and R data frames and JavaScript arrays of objects as tables, and
displayreturns any file as a result. R, Java and Go install themselves the first time you use them. See JavaScript. - Watch files.
sbx.files.watch,runtime sandbox watchandruntime_sandbox_files_watchstream create, write, remove, rename and chmod events for a directory, with include and exclude globs, batches, a rate cap that says when it drops events, and a cursor that loses nothing across a pause. - Record the desktop.
sbx.desktop.recordingsrecords the screen to MP4 and fetches it; a recording is bounded in CPU, bit rate and size and stops before the disk fills. - MCP servers in a sandbox.
runtime sandbox mcpandsbx.mcpstart GitHub, Postgres, a Playwright browser, filesystem, fetch and nine more MCP servers in a sandbox in one call, each at an authenticated URL your agent connects to; secret settings come from Runtime secrets, so the server never holds the value.GET /v1/mcp/cataloglists them with their licences. - Terminals. An organization may hold 64 terminals open, 12 in one sandbox (it was 8).
- Mount your own bucket. An Amazon S3, Cloudflare R2 or Google Cloud
Storage bucket appears as a directory in a sandbox (
runtime sandbox mount,sbx.mounts.add). The sandbox never holds the bucket's key: Runtime's egress proxy signs each request with it. See mount your own bucket. - Single sign-on, free on every account. Sign in through Okta, Microsoft Entra ID, Google Workspace or any SAML or OIDC provider, prove your email domain with a DNS record, and require single sign-on for your members. See single sign-on.
- SCIM directory sync. Your identity provider adds people, sets their roles through groups, and removes them the moment they leave, which revokes every key they made.
- Identity tokens for code in a sandbox. A sandbox gets a short-lived OIDC token naming itself, its organization and its image, and trades it for AWS or Google Cloud credentials with no stored key. See identity tokens.
- Custom domains, TCP ports, dedicated outbound addresses and private
networks, for paid accounts. Serve a sandbox's port at your own hostname
with automatic HTTPS (
runtime domain add), open a public TCP port to a database or game server (runtime port open), send from an address of your own for allow-lists (runtime address reserve), and reach your sandboxes from your own network over WireGuard (runtime tunnel). See networking. - MCP tools are renamed, a breaking change. Every tool now carries its
product's name, as the CLI does:
runtime_execisruntime_sandbox_exec,runtime_files_readisruntime_sandbox_files_read,runtime_sandboxes_createisruntime_sandbox_create, and images, volumes and snapshots areruntime_image_*,runtime_volume_*andruntime_snapshot_*. Every sandbox tool names its sandboxid. The old names are gone: a call to one fails and its error names the new one. Restart your agent, or run/mcpin Claude Code, so it lists the tools again, and change any permission rule or prompt that names an old tool. The whole table is in MCP. runtime_sandbox_exectakes a command as a list as well as a string; a list runs without a shell, asargvdoes.
23 September 2026#
- Switch in one import from Daytona and Vercel Sandbox too. Code written
for Daytona's or Vercel Sandbox's SDK runs on Runtime after changing one
import to
withruntime/daytonaorwithruntime/vercel, in JavaScript and Python, as E2B code already does withwithruntime/e2b. - See what you save.
runtime compare --from e2bprices the sandboxes you actually ran at a rival's published rates and prints the monthly saving. Record the provider you are leaving withruntime switch --from <provider>before your first top-up, and that top-up is matched, up to $100. - Works inside the agent tools you use. A sandbox client for the OpenAI Agents SDK, tools for the Vercel AI SDK, LangChain, CrewAI, LlamaIndex, Pydantic AI, Google ADK, Mastra and the Claude Agent SDK, a Claude Code plugin, and ready configs for Codex, Cursor, Windsurf, VS Code and Gemini CLI. See frameworks.
- Remote MCP with browser sign-in. Add Runtime's MCP address to Claude.ai, ChatGPT or another remote client, approve it once in your browser, and it works with no key to paste. Each connection is listed and revocable on your keys page.
- SSH, editors and port forwarding.
runtime sandbox ssh <id>opens a shell,runtime sandbox ssh config --installlets VS Code and JetBrains connect, andruntime sandbox port-forward <id> 5432brings any TCP port to your machine, all over the API with no port open to the internet. - Pause answers at the freeze. A pause returns as soon as the sandbox's processors stop, and compute billing ends there; its memory is saved in the background.
- The SDKs wait for room. When every sandbox slot is taken, a create waits for one to free, for up to two minutes, instead of failing.
- Every sandbox command lives under
runtime sandbox.runtime sandbox run,runtime sandbox sshandruntime sandbox port-forward, because sandboxes are one product of several. The oldruntime runsays where it went. - Custom images, all the way. Build from any Dockerfile: multi-stage,
COPY --from,ARG, heredocs,ADDfrom a URL,FROM scratchand.dockerignore, with a build context of up to 100 MiB sent from a folder, where a rebuild uploads only what changed. Pull from private registries (Docker Hub, GitHub, Google, Amazon ECR and others) with credentials sealed on arrival and never returned. Each build of a name is its next version, tags such aslatestpoint at versions, and a sandbox starts fromname:tag. An image can run a start command and have its sandbox's create wait for a ready port or command. Rebuilds start from the steps an earlier build shares, four builds run at once on a paid account, and the build log streams. See custom images. - Metrics, events and webhooks. Each sandbox's measured CPU and memory
over time, with
sbx.metrics(),runtime sandbox metrics, MCP, and live charts on the sandbox's own page in your account, where owners can also stop it. Lifecycle events (created, running, paused, woken, stopped, start failed) for sandboxes, snapshots and volumes, withGET /v1/events. Webhooks send them to your URL, signed like Stripe's, retried for about three days, with a delivery log and a test send;verifyWebhookin both SDKs checks them. OpenTelemetry export pushes events as logs and CPU and memory as metrics to any OTLP/HTTP endpoint. See metrics and webhooks. - Teams. Invite people to your account as owner, admin, developer or billing
member; each role can do what its name says and no more, and a key can never
do more than the member who made it. A person can belong to several accounts
and switch between them on the website or with
runtime account switch. See teams. - Audit log. Every change to members, keys, connections, limits, credit,
network rules, secrets and durable resources is recorded with who made it,
when and from which address, kept at least 400 days. Read it at
Audit log, with
GET /v1/audit,runtime audit, the SDKs or MCP. - Paid sandboxes reach every port. Databases,
gitover ssh, gRPC and programs that ignore proxy settings work with no setup, on any public host. Trial sandboxes stay on ports 80 and 443, and your network rules narrow every port. - Secrets sandboxes never see.
runtime secrets set OPENAI_API_KEY --host api.openai.comstores a key once; sandboxes see a placeholder, and the proxy adds the value to HTTPS requests to the hosts you named. See security. - Paused sandboxes wake on request. A command, a file or terminal call, or
a visit to a shared port wakes a paused sandbox by itself, in about half a
second, and the call runs.
idlePauseSecondsnow pauses a sandbox after that long without a request, so it costs running time only while it is used. - Sandboxes by name. A name is unique in the account, and
Sandbox.getOrCreate(name)returns that sandbox, woken if paused, or makes it. - Long-running sandboxes from every interface.
persistent: trueat create,sandbox.update(),runtime sandbox update --persistent onor the API keeps a paid sandbox running while credit lasts, andkeepAliveextends a lease from your own process. - 50 free hours and 100 sandboxes at once. The free trial is now 50 hours (now 100), up from 20, still with no card and eight sandboxes running at once. A paid account starts with room for 100 sandboxes, 200 vCPUs and 400 GiB of memory at once, and more on request. Accounts that signed up before get the 50 hours too.
- Forks and snapshots for everyone. Copy a running sandbox with its memory and processes, and choose whether the copies use the trial or paid credit.
- Code written for E2B runs on Runtime. Change
from "e2b"tofrom "withruntime/e2b"(Pythonwithruntime.e2b) in SDK 0.4.0, and it runs. - SDKs work behind proxies and inside Cloudflare Workers. Both SDKs honour
HTTPS_PROXYandNO_PROXY, and the JavaScript SDK runs in a Worker withnodejs_compat. - Keys for CI from the terminal.
runtime keys creategets an owner-approved key and prints it once, ready to pipe into a secret store. - First commands in a fresh sandbox are faster. Start templates now come
with Node, npm, Python, pip, Bun, uv and git already warm, so a first
nodetakes 84 ms instead of 1,284 ms. - A public status page. withruntime.com/status checks the API from outside every two minutes and starts a real sandbox every ten.
- Storage prices for snapshots, images and volumes. Snapshots and images cost $0.08 per GB a month and volumes about $0.11 per GiB a month, and the trial keeps three images and 10 GiB of volumes free for good.
- Read your own limits.
runtime limitsandruntime.limits.get()show whether a key is read-only and how much of its daily limit is left.
22 September 2026#
- Custom images. Build an image from a package list, a public image or a Dockerfile, and start every sandbox from it.
- Volumes. Persistent disks that outlive sandboxes, attached read-write to one or read-only to many.
- Previews. Give any port in a sandbox an HTTPS address at
runtimehost.com, private with a token unless you make it public. - A desktop in any sandbox. Start a Linux desktop and drive it with clicks, keys and screenshots, or watch it live.
- Code interpreter. A notebook-style Python or JavaScript session in a sandbox, with charts returned as images.
- Network rules per sandbox. Allow or deny hosts, turn the internet off, and
open
host:portpairs such as a database on a paid account. - Interactive terminals.
runtime sandbox shellopens a real terminal in a sandbox, and the API serves one over WebSocket. - Read-only keys and daily spending limits. An owner can give an agent a key that changes nothing, or cap what it may spend in any 24 hours.
- Buy credit by card. Add any amount from $10 to $10,000, with no subscription.
- Referrals. Refer a company and you both get credit equal to its first top-up, up to $500 each.
- A 20-hour free trial. Every new account gets 20 sandbox hours (now
- with no card.
- One line connects your agent.
claude mcp add --scope user runtime -- npx -y withruntime mcp(or the same for Codex and Cursor) is the whole setup; the agent asks for one browser approval. runtime run. One command creates a sandbox, runs your command, prints its output and stops it, connecting the machine on first use.- In the official MCP registry. Runtime Cloud is listed for any MCP client to find.
- The
withruntimepackage. Both SDKs publish aswithruntimeon npm and PyPI, and the old names still install it. - API 0.2.0. One API for every product, over HTTP/2, with a public OpenAPI document.
- A hundred commands at once. One key can have 128 requests in flight, so an agent can fan out without refusals.
- Idle sandboxes pause themselves. A sandbox left on the default lease and never used pauses after five minutes (now any sandbox after a minute with nothing happening in it), so it stops paying the running rate.
- Ask support anywhere. Ask from the dashboard, with
runtime support, or at support@withruntime.com.
21 September 2026#
- Public signup opens. Anyone can sign up and start a sandbox on the free trial.
20 September 2026#
- Connect an agent from the browser. An agent shows you a link and a code, and you approve it once.
- Keys for every product. An API key works across every Runtime Cloud product and lasts until you revoke it.
- withruntime.com. Runtime Cloud moves to one address.
19 September 2026#
- Wake in about a third of a second. A paused sandbox comes back with its memory and processes in about a third of a second.
18 September 2026#
- Pause keeps memory. A paused sandbox saves its running memory and wakes with its processes still running.
- Pay for the CPU you use. CPU is charged only while it is busy, and memory while the sandbox runs.
Try it on your own work. Sign up, then paste the setup prompt into your coding agent.