Pricing and limits
Shardflux plans, the signup trial, what an agent session costs, what happens at a limit, opt-in overage, workspace sizes, region, rate, file and command limits.
Plans
Prices are in US dollars per month. Allowances reset with each billing period on a paid plan. The signup trial counts its allowances over its 7 days.
| Developer | Pro | Startup | Scale | |
|---|---|---|---|---|
| Price | $9 | $29 | $79 | $299 |
| CPU hours | 100 | 500 | 1,500 | 6,000 |
| RAM GiB-hours | 800 | 4,000 | 12,000 | 48,000 |
| Retained state | 100 GiB | 250 GiB | 1,000 GiB | 3,000 GiB |
| Workspaces stored (2 GiB each) | about 50 | about 125 | about 500 | about 1,500 |
| Outbound transfer | 100 GB | 250 GB | 1 TB | 5 TB |
| Workspaces working at once | 10 | 10 | 50 | 200 |
| Largest workspace (vCPU / RAM / disk) | 4 / 8 GiB / 50 GiB | 8 / 16 GiB / 50 GiB | 8 / 16 GiB / 50 GiB | 32 / 64 GiB / 100 GiB |
| Shared volumes (count / account total) | 5 / 10 GiB | 10 / 50 GiB | 20 / 100 GiB | 100 / 1,000 GiB |
| GPU-hours | — | — | 25 | 100 |
| Overage spend cap per period (opt-in) | $1 to $9 | $1 to $29 | $1 to $79 | $1 to $299 |
Retained state is sized for one workspace per customer, with suspended workspaces kept for as long as you want them. The workspace counts assume 2 GiB each, which is generous for most work: on the default template with 2 GiB of memory, a new workspace keeps under 0.1 GiB, one with a cloned Node.js repository and its dependencies about 0.2 GiB, and one with a Python environment, 40 MB of data and a report about 0.4 GiB. A checkpoint also holds the memory the workspace has used, so one that has filled its memory can keep close to its memory size on top of its disk.
Opt-in idle retention removes workspaces you no longer use so you stay inside your Retained state allowance.
Retained state sets how many workspaces you keep: the workspace counts above are what it holds at 2 GiB each. Only working workspaces count toward workspaces working at once, so on Developer you keep about 50 workspaces and up to 10 of them work at the same moment.
GPU: on Startup and Scale, workspaces render on a GPU through Shardflux's own Vulkan driver, with the CUDA Driver
API (libcuda.so.1), NVENC (API 13.1) and NVDEC (libnvcuvid.so.1) on the same GPU, and Vulkan, CUDA, NVENC, NVDEC
and VA-API apps use them unchanged. CUDA applications call the Driver API, as NVENC and FFmpeg do; programs
built on the CUDA Runtime API (libcudart) use the Driver API instead. Blender's Cycles renders on CUDA devices; it is
offered no OptiX device. Render on the GPU has each engine's launch settings. GPU-hours
measure what your apps use.
GPU video: a workspace holds up to 32 Vulkan Video sessions, 64 NVDEC decoders and 64 NVDEC parsers at once. A session or decoder past those, or while the GPU's own are all in use, waits a short time for one to free up and is then refused (GPU video sessions).
Enterprise: contact shardflux@shardflux.dev. Write there too when you outgrow Scale. With its largest overage Scale covers 67,933 RAM GiB-hours a month (48,000 included plus $299 of overage at $0.015); past that, no plan fits yet.
There is no automatic overage. Reaching an allowance adds charges only after you turn on
overage with a spend cap. Upgrade, change or cancel a plan under Usage & billing in the
console, or from a terminal with the CLI (0.5.0+): shard billing upgrade <plan> prints
the Stripe Checkout URL where a person pays, and shard billing portal prints the link for plan changes and
cancellation (Billing).
Card on file
Compute runs on organizations with a card on file and an active trial or paid plan. The organization's creator saves a non-prepaid credit or debit card directly on the console's Usage & billing page, a Stripe page in setup mode, and approves it with their bank (3-D Secure; wallet tokens and prepaid cards are not accepted): nothing is charged. A paid plan's card counts, and so does a plan arranged with Shardflux (a custom or design-partner plan). Accounts, organizations, projects and API keys need no card. Until a card is saved, opening, resuming or forking a workspace and building a template answer 402 card_required with the page that saves it. Running workspaces keep running.
Signup trial
New accounts can register automatically via the console, CLI (shard signup) or HTTP API, and create organizations, projects and API keys right away. Before starting workspace compute, verify an established GitHub account (at least 30 days old) or non-disposable work domain (registered at least 30 days ago with active MX records), and complete the $0 Stripe card check on the console’s Usage & billing page or with shard billing trial --wait. Enter a credit or debit card number directly and approve it with your bank (3-D Secure); wallet tokens and prepaid cards are not accepted. Nothing is charged. This starts 7 days of Pro’s allowances and limits. Subscribing to a paid plan ($9/mo Developer and up) enables compute immediately without the trial checks.
| Trial | |
|---|---|
| Length | 7 days from when the card-backed trial starts |
| RAM GiB-hours | 4,000 |
| CPU hours | 500 |
| Retained state | 250 GiB |
| Outbound transfer | 250 GB |
| Workspaces working at once | 10 |
| vCPU across all workspaces | 8 |
| Largest workspace (vCPU / RAM / disk) | 8 / 16 GiB / 50 GiB |
| Shared volumes (count / account total) | 10 / 50 GiB |
| Overage | None: the allowances are hard caps |
- Who gets it. One signup trial per person, per card and per GitHub account, across all accounts, ever. Either a linked GitHub account at least 30 days old or a verified work email or organization domain registered at least 30 days ago with active MX records is required alongside a non-prepaid, non-wallet Stripe card check that the card's bank approves (3-D Secure). Consumer webmail addresses (such as Gmail, Outlook, Yahoo, iCloud or Proton) need a linked GitHub account or a verified organization domain to qualify for the trial, or can start directly on a paid plan. The trial applies to the organization where you start it; additional organizations need a paid plan. Trials are limited each month.
- Capacity. Trial workspaces start on capacity that is already running, so at busy times a start may wait for it
(until the start's deadline, then
capacity_unavailable). Paid plans add capacity when they need it. A trial organization's running workspaces share 8 vCPU, and on a busy host trial workspaces run on the CPU that paid plans leave free. - The end. When the RAM GiB-hours or CPU hours are used up, or after 7 days, workspace compute pauses until you choose a paid plan ($9/mo Developer and up). Up to 10 GiB of retained workspace storage is kept and nothing is deleted. Every owner and billing member gets an email 3 days before the end and one when it ends.
- Upgrading. Upgrade to a paid plan at any time. The plan replaces the trial at once; Pro ($29) has the same allowances and workspace limits, without the shared 8 vCPU, every month, with overage.
What each allowance measures
| Allowance | Measures |
|---|---|
| CPU hours | CPU time the workspace's processes actually used. |
| RAM GiB-hours | The memory a running workspace holds, by what its host keeps ready. While it works it uses the memory it holds: with elastic memory, what its processes use and at least its 1 GiB floor, as they use and free it (a workspace holding 2 GiB while it works for one hour uses 2 GiB-hours). It works during a tool call and the 2 seconds after it, while an exec output stream or terminal is attached, while a command started through exec runs, during a keepalive, and while its processes keep using CPU or the network. Once it is idle its host parks it and compresses its memory in place: it then uses at most 256 MiB plus the compressed size of the rest, until the next call wakes it. A suspended workspace uses none. A file-first workspace uses it only while an execution runs, at the execution VM's memory. |
| Retained state | Storage you keep: each workspace's own disk changes and checkpoints (running or suspended), a file-first workspace's current file tree, plus your organization's template storage. Platform templates never count. Measured as what you keep now: the latest measurement of each workspace you have not deleted (taken every minute) plus your template storage, so deleting a workspace frees its room at once. |
| Outbound transfer | Bytes your workspaces send to the internet, in decimal GB, including the responses your apps send through port URLs. Inbound traffic is free and does not count, and neither does Shardflux's own traffic (checkpoints, template downloads, moves between hosts). |
| GPU-hours | The GPU your apps use, at the larger of their scene's GPU memory and the GPU's busy time (see GPU-hours). Startup and Scale. |
| Workspaces working at once | Workspaces working at the same moment, across the whole organization. A workspace works while it starts (open, resume, fork), during a tool call and the 2 seconds after it, while an exec output stream or terminal is attached, while a command started through exec runs, during a keepalive, and while its processes keep using CPU or the network. A parked or suspended workspace does not count, and a file-first workspace never counts. |
Shared volume storage is measured and shown separately; no allowance includes it and it never blocks anything.
shard usage, cloud.usage (TypeScript) and Usage in the console show what you have used, with the time the
numbers were measured through.
GPU-hours
A GPU app counts every second at the larger of two shares of one GPU: the GPU memory its scene holds, over 16 GiB, and the fraction of that second the GPU spends on its own work. An hour at a full share is one GPU-hour, so a light scene uses a fraction of one:
| Scene GPU memory | GPU busy | GPU-hours per hour |
|---|---|---|
| 2 GiB | 5 % | 0.125 |
| 4 GiB | 40 % | 0.4 |
| 12 GiB | 100 % | 1 |
- Only your own work counts: time spent waiting for the GPU and the driver's own memory never do.
- A scene's GPU memory counts while it is on the GPU. A Vulkan scene waiting between frames leaves the GPU a fraction of a second after its last frame and comes back with the next request (Frames on request), so an app that renders on request counts its GPU memory only around its frames.
- 16 GiB is 2^34 bytes. Usage is measured per app, summed for the organization, and counted per UTC hour like the other allowances.
- Startup includes 25 GPU-hours a period and Scale 100. With overage on, more cost $1.00 per GPU-hour under the same spend cap as RAM and CPU.
- Usage in the console and the usage summary (
gpu: used, included and overage GPU-hours) show what you have used.
What an agent session costs
Because a parked workspace uses little or no RAM, what you pay follows how long your agent works, not how long the workspace stays open. The figures below are the average of 1,345 recorded agent sessions, each 55.7 minutes from the first tool call to the last with 11.2 minutes of tool calls, replayed on the production idle policy with a workspace holding 2 GiB while it works. A session uses 0.573 RAM GiB-hours: the full 2 GiB for 15.1 minutes and 256 MiB for 16.8 minutes. A workspace that a background process keeps busy never parks, so it uses its full 2 GiB for 63.1 minutes (2.102 GiB-hours), or 55.6 minutes (1.854 GiB-hours) when your harness suspends it as the turn ends.
| Sessions per end customer a month | RAM GiB-hours | At $0.015 per GiB-hour | Kept busy | Kept busy, suspended at turn end |
|---|---|---|---|---|
| 10 | 5.7 | $0.09 | $0.32 | $0.28 |
| 60 | 34.4 | $0.52 | $1.89 | $1.67 |
| 124 | 71.1 | $1.07 | $3.91 | $3.45 |
- The dollar columns are the cost per end customer a month at the overage rate. Inside a plan's allowance the sessions cost nothing extra: Developer's 800 RAM GiB-hours cover about 1,396 of them a month, Pro's 4,000 about 6,980, Startup's 12,000 about 20,941 and Scale's 48,000 about 83,763.
- 124 sessions is one workspace's month in the replay, with modelled breaks between the sessions.
- The replay assumes the workspace parks whenever the agent is idle. One whose processes keep using CPU or the network while idle stays resident: count it as kept busy.
- Past Scale with its largest overage, 67,933 RAM GiB-hours a month or about 118,550 of these sessions, no plan fits yet: contact shardflux@shardflux.dev.
- CPU hours are not included. They count only the CPU time your processes use.
- The calculator in the pricing section works this out for your number of customers and sessions and your workspace size.
With elastic memory. The table counts 2 GiB held while the workspace works. With
elastic memory a workspace is billed for what it holds, not for its maximum.
Replayed on 1,885 recorded agent sessions, the median session of a workspace with a 1 GiB floor and the 8 GiB
maximum of python-node-browser was billed for 0.55 GiB on average over its running time, less than a workspace
holding 2 GiB (0.71 GiB), with up to 8 GiB there whenever its commands need it.
What happens at a limit
| Limit | What happens |
|---|---|
| Workspaces working at once | A tool call or keepalive that would wake a parked workspace past the limit waits up to 5 seconds for another workspace to stop working. If none does, it is refused with 429 quota_exceeded and Retry-After (details.limit: concurrent_workspaces, limit_value, current, retry_after_seconds). Nothing ran, so any call is safe to retry, and the SDKs retry it (TypeScript 0.14.0+, Python 0.10.0+). Calls to a workspace that is already working never wait. Opens, resumes and forks beyond the limit wait up to 10 seconds the same way, then are refused with 429 quota_exceeded and Retry-After (details.limit: concurrent_workspaces, limit_value, current, retry_after_seconds, plan); nothing started, so they are safe to retry, and the SDKs retry them (TypeScript 0.22.0+, Python 0.18.0+). Reopening a workspace that is already running never waits. A workspace stops counting a few seconds after its last work ends, or after it is suspended or deleted. Suspend a workspace you are done with, or upgrade. |
| CPU hours or RAM GiB-hours, overage off | New opens, resumes and forks are refused with 402 allowance_exhausted (details: reason: allowance_used, allowance, used, included, resets_at). Running workspaces are suspended, keeping their files, memory and processes. Nothing is deleted. |
| CPU hours or RAM GiB-hours (paid plans), overage on | Workspaces keep opening and running. Usage past the allowance is charged at the overage rates until the charges reach your spend cap. At the cap, new opens, resumes and forks are refused with 402 allowance_exhausted (reason: spend_cap_reached) and running workspaces are suspended the same way. Nothing is deleted. |
| Outbound transfer | At 100 %, outbound internet traffic of every workspace in the organization is blocked until you upgrade, add more, or the next period starts. Workspaces keep running; inbound connections, commands, terminals and file transfer keep working, and opens are not refused. |
| GPU-hours, overage off | At 100 %, only the GPU stops until the next period, an upgrade, or overage: an app's frame requests answer 402 allowance_exhausted (reason: allowance_used; see GPU frame requests). Workspaces keep running, and opens and resumes are never refused for GPU-hours. Rendering comes back on its own once the cause clears. |
| GPU-hours, overage on | Rendering continues at the overage rate until the charges reach your spend cap; then only the GPU stops (reason: spend_cap_reached) and workspaces keep running. While a plan payment is past due, overage is paused and the GPU stops at 100 % (reason: overage_paused). |
| GPU on Developer or Pro | An app's frame requests answer 402 entitlement_required (reason: not_included, "GPU needs the Startup or Scale plan"). Upgrade to Startup or Scale. |
| Retained state, overage off | At 100 %, opening a new key and forking are refused with 403 quota_exceeded (details.limit: retained_state, limit_value and current in GiB). Existing workspaces keep running, waking, suspending and resuming, nothing is deleted and nothing is charged. Owners and billing members get an email at 80 % and 100 %. Delete workspaces you no longer need, which frees their room at once, or upgrade. |
| Retained state, overage on | Workspaces keep opening, forking and growing. Storage above the plan's retained state is charged at the overage rate until the charges reach your spend cap. Nothing is deleted. |
| Workspace size | Caps above the plan's maximum are lowered to it, not refused, at an open and at a resize. With overage on, a workspace disk grows past the plan's disk maximum up to 2,048 GiB; its bytes count toward retained state. |
| Template builds | 3 builds at once per organization; more are refused with 403 quota_exceeded (concurrent_template_builds). A version larger than the plan's disk maximum fails with resource_limit. |
| Shared volumes | Creating one beyond the count or account-wide total quota is refused with 403 quota_exceeded (shared_volumes_max, shared_volume_gib_max). At most 8 volumes can be attached to one workspace. |
Every owner and billing member gets an email at 80 % and 100 % of an allowance. With overage on, they also get one at 50 %, 80 % and 100 % of the spend cap. Compute limits are enforced with short budget leases, so usage can run slightly past an allowance or the spend cap before running workspaces are suspended; the organization's spend view reports that bound.
Billing states. If a payment fails, you have 7 days of grace. Nothing changes during it, except that
overage is paused until the invoice is paid. After that, new opens,
resumes and forks are refused with 402 entitlement_required (details.reason: payment_past_due or unpaid); running
workspaces and your data are untouched. A cancellation takes effect at the end of the period, after which new workspace
starts require a paid plan while up to 10 GiB of retained workspace storage is kept.
Data is never deleted by billing or inactivity. Workspaces are deleted only when you delete them, with one exception: a session workspace is deleted when its session ends.
Overage (opt-in)
Overage keeps your workspaces opening and running past the CPU-hours and RAM GiB-hours allowances, keeps them rendering past GPU-hours on Startup and Scale, and lets retained storage and workspace disks grow past the plan, up to a spend cap you set. It is off by default; trials have no overage.
Turning it on. An owner or billing member turns overage on under Usage & billing in the console and sets a spend cap in dollars per billing period. The cap is at least $1 and at most the plan price: $9 on Developer, $29 on Pro, $79 on Startup, $299 on Scale. A period's bill is therefore at most twice the plan price. The cap never exceeds the current plan's price, so moving to a cheaper plan lowers it.
Rates. RAM, CPU and storage rates are the same on every paid plan.
| Past the allowance | Rate |
|---|---|
| RAM GiB-hours | $0.015 per GiB-hour. A 2 GiB workspace costs $0.03 for an hour of work; parked, it costs 256 MiB for about 15 seconds, then nothing. |
| CPU hours | $0.04 per CPU-hour past the plan's CPU hours. |
| GPU-hours | $1.00 per GPU-hour past the plan's GPU-hours, on Startup and Scale. |
| Retained state | $0.15 per GiB-month for storage above the plan's retained state, counted per hour (a GiB-month is 730 GiB-hours). 100 GiB above Scale's 3,000 GiB for a whole month costs $15. |
With overage on, a workspace disk can also grow past the plan's disk maximum, up to 2,048 GiB. Shared volumes are never charged. Outbound transfer has no overage: outbound traffic is blocked at 100 % of the transfer allowance.
Billing. Charges come from the same usage measurements as the allowances, counted per UTC hour. They go on your next monthly invoice and are charged to the card that pays the plan. There are no prepaid credits. Upgrading during a period does not refund overage already charged.
At the cap. New opens, resumes and forks are refused with 402 allowance_exhausted
(details.reason: spend_cap_reached; see Errors). Running workspaces are
suspended, keeping their files, memory and processes. Nothing is deleted. Work can start again when the next billing
period begins, when you raise the cap (up to the plan price), or when you upgrade. Usage can run slightly past the cap
before workspaces are suspended, but you are never charged more than the cap. Past the GPU-hours allowance, the cap
stops only the GPU; workspaces keep running.
Past-due payments. While a plan payment is past due, overage is paused and the allowances apply as if it were off.
Past an allowance, starts are refused with 402 allowance_exhausted (details.reason: overage_paused) and running
workspaces are suspended. Overage resumes when the invoice is paid.
Emails. Every owner and billing member gets an email at 50 %, 80 % and 100 % of the cap, and when someone turns overage on or off or changes the cap.
Workspace sizes
A workspace's CPU, memory and disk are the smallest of three maximums: the plan's (above), the template's, and the caps
you pass to open (caps: { cpu_millis, memory_mib, disk_gib }; 1,000 cpu_millis is one vCPU). Memory is
elastic: the workspace sees that maximum from boot and holds what its processes
use, at least memory_mib_held, 1,024 MiB by default and at least 512. A floor within 512 MiB of the maximum is
lowered to leave that room, and a maximum below 1,024 MiB is held in full.
A workspace boots with the vCPUs of its plan's or template's maximum; cpu_millis is the CPU time it may use.
- A new workspace starts with its template's default disk, 20 GiB on the platform templates, and its disk grows on its
own as it fills, up to the plan's and the template's maximum. An explicit
caps.disk_gibat open sets the size it starts at, within those maximums; reopening it without a disk cap keeps its disk. Retained state counts the bytes kept, not the disk's size. python-node-browserallows up to 4 vCPU and 8 GiB of memory. Its workspaces have up to 8 GiB of memory, or thecaps.memory_mibyou set.- Resize: memory changes live, both ways; CPU changes live up to the vCPUs
the workspace booted with (its plan's or template's maximum) and above them at its next start; a disk grows online and never shrinks (a smaller
disk_gibis422 validation_failed,shrink_not_supported). A resize above the plan's or the template's maximum is lowered to it (limit_reason), andat_maximumsays the resource is there. - Disk is the space for the workspace's own changes; the template's files do not count against it.
See Workspace size.
Region
Workspaces and the API run in AWS us-west-2 (Oregon, United States). The API is https://api.shardflux.dev and the
console https://app.shardflux.dev.
Starts and waits
| Limit | |
|---|---|
A start waiting for capacity (capacity_pending) |
15 minutes, extended while new capacity starts for it or its files move to new storage (at most 1 hour), then capacity_unavailable (retryable; nothing started). After 2 minutes, with retry_after_seconds, when no more capacity can be added right now |
| Starts waiting for capacity at once | Served in the order they were requested, up to 1,000 per region (an organization's share depends on its plan). A start past that gets capacity_unavailable at once, with retry_after_seconds and details.limit; starts already waiting keep their place |
| A tool call that wakes a parked workspace while its host makes room | Held up to 25 seconds for a command, terminal or git start, 30 for attaching to a command's output or a terminal, and 50 for other calls, then 503 service_unavailable host_capacity with Retry-After; nothing ran |
| An open, resume or fork past the plan's workspaces working at once | Held up to 10 seconds, then 429 quota_exceeded with Retry-After; nothing started |
SDK retries of a call refused before it ran (503 host_capacity, 429 quota_exceeded) |
2 minutes by default (admissionTimeoutMs, admission_timeout), each wait the full Retry-After (TypeScript 0.22.0+, Python 0.18.0+) |
| SDK wait for an operation | 5 minutes by default (timeoutMs, timeout), and while the start is capacity_pending, until its deadline (TypeScript 0.22.0+, Python 0.18.0+); the operation continues after the SDK stops waiting |
| Wake of a suspended workspace by a tool call | 120 seconds by default, and while the resume is capacity_pending, until its deadline (TypeScript 0.22.0+, Python 0.18.0+) |
| Idle timeout of a persistent workspace | Learned per workspace, 10 seconds to 4 hours; 5 minutes while there is no history to learn from. Or fixed:<seconds> (60 to 604,800) or never. See Automatic suspend when idle |
| Suspend when idle | after_seconds 0 to 3,600 (Suspend when idle) |
| Session idle timeout | 10 minutes unless the template sets one (60 to 86,400 seconds) |
Inbound ports
Port URLs of processful workspaces:
| Limit | |
|---|---|
| Exposed ports | 10 per workspace |
| Port token lifetime | 60 seconds to 1 day (1 hour by default) |
| Signed link lifetime | 60 seconds to 7 days (1 day by default) |
| Wait for a workspace to wake and its port to accept | 30 seconds, then 503 wake_timeout (host_capacity while its host is still making room) with Retry-After |
| Wait for a running workspace's server to accept again | 3 seconds, then 502 port_not_listening |
| Requests | 100 per second per workspace (bursts of 200) and 1,000 per second per organization (bursts of 2,000), then 429 rate_limited with Retry-After |
| Open connections | 256 per workspace and 2,048 per organization, then 429 connection_limit |
| Request body | 1 GiB, then 413 body_too_large |
| Idle connection | Closed after 1 hour without traffic in either direction |
| Protocols | HTTP/1.1 and WebSocket over HTTPS |
Templates
| Limit | |
|---|---|
| Immutable paths | 8 per template, each an absolute path of up to 256 bytes |
| Immutable image | 16 GiB per template version |
A version's immutable paths are stored as one image. Each version's image counts toward your organization's template storage, and so toward retained state.
Computer use
| Limit | |
|---|---|
| Screen | 640x480 to 2560x1600 pixels; 1280x800 by default |
| Actions per batch | 50 |
| Waits and holds per batch | 300 seconds in total (wait, hold_key) |
Text per type action |
20,000 characters |
settle_ms |
0 to 10,000 ms (default 250) |
| JPEG quality | 1 to 100 (default 80) |
| Batch request | 1 MiB |
| Viewer links | 60 seconds to 7 days (default 24 hours) |
| Templates | python-node-browser 15 and later, and templates built on them |
The desktop's control port, 61001, is reserved and cannot be exposed (422, port_reserved). The viewer is served
through the workspace's inbound ports 61002 (view only) and 61003 (interactive), which stream() exposes for you.
API rate limits
| Limit | Value |
|---|---|
| Tool tokens (including an open that returns one) | 3,600 per hour per API key; past it, an open still succeeds, with tool_token: null |
| Template package searches | 120 per minute per organization |
Over a limit, the API answers 429 rate_limited with a Retry-After header. The SDKs retry 429 for safe and
idempotent requests (maxRetries / max_retries, default 2), waiting the full Retry-After (TypeScript 0.22.0+,
Python 0.18.0+), then raise the error with retryAfterSeconds (TypeScript) or retry_after (Python). A wait that
would outlast the request's timeout raises the error at once.
File and command limits
| Limit | |
|---|---|
| One file write | Any size: the body streams to the file, and a replace takes effect once the whole upload is on disk (up to 15 minutes per transfer) |
| One file read | 256 MiB per request; the SDKs read larger files in several requests |
| File paths | Absolute, at most 4,096 bytes |
| Directory listing | Up to 10,000 entries per call (default 1,000) |
| Command arguments | Up to 4,096 arguments of up to 128 KiB each |
| Command environment | Up to 512 variables |
| Command stdin | 1 MiB |
| Command timeout | Up to 7 days; at the timeout every process the command started is stopped (SIGTERM, SIGKILL after kill_grace_ms) |
| Commands kept per workspace | The newest 10,000; a finished command beyond them is removed with its output (404 not_found) |
Command output kept by exec.run / ws.exec |
1 MiB of stdout and 1 MiB of stderr by default (maxOutputBytes / max_output_bytes); stream everything with onOutput / on_output |
| Output returned to a model by the agent tools | 64 KiB per call |
| Reads of a suspended workspace from its disk | The same limits as other reads; not billed as compute |
| Secrets bound to one workspace | 50 |
| Browser screenshot / page content | 32 MiB / 5 MiB |
| Workspace keys | 1 to 200 characters; keys starting with sf: are reserved |
Search, patches and revisions
| Limit | |
|---|---|
| Search pattern | 1 to 1,000 characters, literal or RE2 |
| Search results | 200 matches by default, at most 5,000; a search also stops after 10 seconds or 4 MiB of results (truncated, stop_reason) |
| Files searched | Up to 1 MiB each by default, at most 64 MiB (max_file_bytes); each line in its first 1 MiB; binary files and symbolic links are skipped |
| Search globs | Up to 32 include and 32 exclude globs of up to 256 characters |
| Search context | 0 to 5 lines before and after each match; the matched line is returned up to 1,000 bytes |
| One patch request | 7 MiB (413 payload_too_large above); write larger files with a normal write |
| A patched file | 64 MiB |
| Edits in one patch | 1 to 100 |
File revision from stat |
Regular files up to 256 MiB |
File revision on a read (X-File-Revision) |
Regular files up to 16 MiB |
| Wake hint | Held for 60 seconds when no tool call follows |
File-first workspaces
| Limit | |
|---|---|
| Files | Only under /home/user; names must be valid UTF-8 |
| Executions at once | One per workspace; others and file changes get 409 workspace_busy (execution_in_progress) until it ends |
| Execution output | stdout and stderr each up to 1 MiB by default, at most 16 MiB (outputLimitBytes, output_limit_bytes, --output-limit) |
| Changed paths in a result | Up to 10,000 (changed_truncated); the agent tools return up to 200 |
| Execution ids | 8 to 128 characters of A-Z a-z 0-9 . _ : -, starting with a letter or a digit |
| Execution results | Kept for 7 days |
| Command stdin, timeout, arguments and environment | As for other commands (above) |
| Lifetime | Persistent only |
| Change time | Grows with the tree: about 0.6 seconds per change at 100,000 files |
Shared volumes
The plan's shared-volume size is an account-wide total: the sum of quota_gib across every customer-managed
shared volume in the organization. Developer has 10 GiB, Pro 50 GiB, Startup 100 GiB and Scale 1,000 GiB.
Count limits are unchanged; the trial has Pro's 50 GiB total. Shared-volume storage is reported and has no storage charge.
An open by name defaults to 1 GiB only when creating; supply quota_gib within the remaining allowance
(TypeScript SDK 0.18.0+, Python 0.14.0+, CLI 0.13.2+, MCP 0.12.0+).
Shared volumes store data outside workspace snapshots and forks; attached agents can read or write them according to the mount mode. A workspace takes up to eight shared-volume mounts; detach a volume before adding another. See Volumes.
Website sign-ins
| Item | Limit |
|---|---|
| Credential request lifetime | 24 hours after creation |
| Agent wait for one credential request | 10 minutes per call |
| Outstanding credential requests | 32 per workspace; every pending request counts until it is expired, and fulfilled requests count until their expiry |
| Passwords and authenticator setups per login | One password and one TOTP configuration |
| Passkeys per login | 100 |
| Related sign-in origins per login | 50 |
| Username or password | 8,192 characters each |
| Site or related origin | 2,048 characters |
| TOTP seed | 1,024 characters, base32 |
| TOTP code length | 6 to 8 digits |
| TOTP period | 15 to 120 seconds |
See the HTTP reference for store metadata and the sign-in protocol.
Secrets
Project secrets are stored encrypted with AWS KMS; only the project's workspaces can load them, and every load is logged. Browser sessions are stored and loaded the same way.
Secret values are redacted before exec/PTY output and logs are persisted, including base64/URL forms across chunks.
Tool-call capture sanitizes bound secret values. Both cover values of 8 or more characters, and values that are
only letters or only digits from 16; shorter or plain values, such as true, 1, 8080 or production, appear as
written, so output that contains them stays intact.