How long does a Space take to start in your own cloud?
From a client Mac, a Space on a new cloud machine ran its first command 105 s after the request on AWS, 194 s on Google Cloud and 164 s on Hetzner (p50, n = 10 each, 2026-10-24). On a machine already running it took 2.03 s on AWS and 3.78 s on Hetzner (p50, n = 12 each, 2026-10-25).
Measured 2026-10-24 to 2026-10-25Build app 0.15.0, cua 0.9.0Raw data (CSV)
Results
p50 time from the create command until the first command returns, one Space at a time. Lower is better.
| Result | Value | n | Measured |
|---|---|---|---|
| AWS, new machine | 105 s p50 | 10 | 2026-10-24 |
| Google Cloud, new machine | 194 s p50 | 10 | 2026-10-24 |
| Hetzner, new machine | 164 s p50 | 10 | 2026-10-24 |
| AWS, machine running | 2.03 s p50 | 12 | 2026-10-25 |
| Hetzner, machine running | 3.78 s p50 | 12 | 2026-10-25 |
Method: AWS, new machine
Released cua 0.9.0 CLI, isolated signed-in CUA_HOME, cua cloud connect aws then cua cloud budget --max-per-hour 3 --monthly 20 --autoscale off. Serial; per sample: t0 before cua sb create linux --on aws --name cb-<label>-<i> --json; value = when cua sb exec <name> -- echo ok has returned 'ok' (machine boot, Docker, image pull and relay join included; no warm host, no prewarm). Then cua sb rm <name> --force (not timed). Two batches of 5 (cold-*, cold2-*), all samples kept.
Caveats
- Includes the cloud's VM boot and the image pull on a new VM. The client is a Mac on a home network in California; API calls go to the cloud, and the first command goes through relay.cua.ai.
- The machine type is the one cua 0.9.0 picks for the default `linux` image: t4g.medium.
Environment and build
| Machine | Mac Studio (the client), Mac14,13 |
|---|---|
| Chip | Apple M2 Max, 12 cores |
| Memory | 96 GB |
| OS | macOS 26.6.2 |
| Where | client in the San Francisco Bay Area, home network; Space reaches the client via relay.cua.ai |
| Kind | container (Docker on a new cloud VM, one VM per Space) |
| Cloud | aws |
| Region | us-west-2 |
| Machine type | t4g.medium |
| Usd per hour listed by cua | 0.0419 |
| Image | ghcr.io/trycua/linux:24.04 (cua's default `linux`) |
| Warm host | false |
| Autoscale | off (`cua cloud budget --autoscale off`: each Space gets a new machine of its own) |
| Load avg before | 1.46 |
| Other vms | other sessions' VMs on the client Mac (not on the path) |
| Build | cua CLI bundled in Cua Spaces 0.15.0 DMG (GitHub release cua-spaces-v0.15.0, published 2026-10-24T19:42Z; dmg sha256 8725a09b...aba0), Contents/MacOS/cua, `cua --version` = cua 0.9.0 |
| App | 0.15.0 |
| cua | 0.9.0 |
Reproduce
# Cua Spaces 0.15.0 from cua.ai/download (its cua CLI is cua 0.9.0)
curl -fLO https://cua.ai/benchmarks/cloud-first-space-time/files/cloud_start.py
cua auth login
cua cloud connect aws --profile <aws-profile> --region us-west-2 --ttl-hours 2
cua cloud budget --max-per-hour 3 --monthly 20 --autoscale off
for b in 1 2; do python3 cloud_start.py aws 5 cold$b-aws; done # create, then exec, then rm
cua cloud sweep --all --deleteMethod: Google Cloud, new machine
Released cua 0.9.0 CLI, isolated signed-in CUA_HOME, cua cloud connect gcp then cua cloud budget --max-per-hour 3 --monthly 20 --autoscale off. Serial; per sample: t0 before cua sb create linux --on gcp --name cb-<label>-<i> --json; value = when cua sb exec <name> -- echo ok has returned 'ok' (machine boot, Docker, image pull and relay join included; no warm host, no prewarm). Then cua sb rm <name> --force (not timed). Two batches of 5 (cold-*, cold2-*), all samples kept.
Caveats
- Includes the cloud's VM boot and the image pull on a new VM. The client is a Mac on a home network in California; API calls go to the cloud, and the first command goes through relay.cua.ai.
- The machine type is the one cua 0.9.0 picks for the default `linux` image: e2-medium.
Environment and build
| Machine | Mac Studio (the client), Mac14,13 |
|---|---|
| Chip | Apple M2 Max, 12 cores |
| Memory | 96 GB |
| OS | macOS 26.6.2 |
| Where | client in the San Francisco Bay Area, home network; Space reaches the client via relay.cua.ai |
| Kind | container (Docker on a new cloud VM, one VM per Space) |
| Cloud | gcp |
| Region | us-west1 (zone us-west1-a) |
| Machine type | e2-medium |
| Usd per hour listed by cua | ~0.04 (cua cloud status) |
| Image | ghcr.io/trycua/linux:24.04 (cua's default `linux`) |
| Warm host | false |
| Autoscale | off (`cua cloud budget --autoscale off`: each Space gets a new machine of its own) |
| Load avg before | 1.46 |
| Other vms | other sessions' VMs on the client Mac (not on the path) |
| Build | cua CLI bundled in Cua Spaces 0.15.0 DMG (GitHub release cua-spaces-v0.15.0, published 2026-10-24T19:42Z; dmg sha256 8725a09b...aba0), Contents/MacOS/cua, `cua --version` = cua 0.9.0 |
| App | 0.15.0 |
| cua | 0.9.0 |
Reproduce
# Cua Spaces 0.15.0 from cua.ai/download (its cua CLI is cua 0.9.0)
curl -fLO https://cua.ai/benchmarks/cloud-first-space-time/files/cloud_start.py
cua auth login
gcloud auth login # cua uses `gcloud auth print-access-token`
cua cloud connect gcp --project <project> --region us-west1 --ttl-hours 2
cua cloud budget --max-per-hour 3 --monthly 20 --autoscale off
for b in 1 2; do python3 cloud_start.py gcp 5 cold$b-gcp; done # create, then exec, then rm
cua cloud sweep --all --deleteMethod: Hetzner, new machine
Released cua 0.9.0 CLI, isolated signed-in CUA_HOME, cua cloud connect hetzner then cua cloud budget --max-per-hour 3 --monthly 20 --autoscale off. Serial; per sample: t0 before cua sb create linux --on hetzner --name cb-<label>-<i> --json; value = when cua sb exec <name> -- echo ok has returned 'ok' (machine boot, Docker, image pull and relay join included; no warm host, no prewarm). Then cua sb rm <name> --force (not timed). Two batches of 5 (cold-*, cold2-*), all samples kept.
Caveats
- Includes the cloud's VM boot and the image pull on a new VM. The client is a Mac on a home network in California; API calls go to the cloud, and the first command goes through relay.cua.ai.
- Hetzner bills each started hour, so each sample cost an hour of cx23 plus IPv4 ($0.0114).
- The client is in California and the server in Germany, so relay round trips cross the Atlantic; server boot and image pull dominate.
Environment and build
| Machine | Mac Studio (the client), Mac14,13 |
|---|---|
| Chip | Apple M2 Max, 12 cores |
| Memory | 96 GB |
| OS | macOS 26.6.2 |
| Where | client in the San Francisco Bay Area, home network; Space reaches the client via relay.cua.ai |
| Kind | container (Docker on a new cloud VM, one VM per Space) |
| Cloud | hetzner |
| Region | fsn1 (Falkenstein, DE) |
| Machine type | cx23 (2 vCPU x86, 4 GB) |
| Usd per hour listed by cua | cx23 $0.0104/h + primary IPv4 $0.0010/h (Hetzner API, 2026-10-24) |
| Image | ghcr.io/trycua/linux:24.04 (cua's default `linux`) |
| Warm host | false |
| Autoscale | off (`cua cloud budget --autoscale off`: each Space gets a new machine of its own) |
| Load avg before | 1.46 |
| Other vms | other sessions' VMs on the client Mac (not on the path) |
| Build | cua CLI bundled in Cua Spaces 0.15.0 DMG (GitHub release cua-spaces-v0.15.0, published 2026-10-24T19:42Z; dmg sha256 8725a09b...aba0), Contents/MacOS/cua, `cua --version` = cua 0.9.0 |
| App | 0.15.0 |
| cua | 0.9.0 |
Reproduce
# Cua Spaces 0.15.0 from cua.ai/download (its cua CLI is cua 0.9.0)
curl -fLO https://cua.ai/benchmarks/cloud-first-space-time/files/cloud_start.py
cua auth login
cua cloud connect hetzner --token-stdin --region fsn1 --ttl-hours 2 < token
cua cloud budget --max-per-hour 3 --monthly 20 --autoscale off
for b in 1 2; do python3 cloud_start.py hetzner 5 cold$b-hetzner; done # create, then exec, then rm
cua cloud sweep --all --deleteMethod: AWS, machine running
Released cua 0.9.0, isolated signed-in CUA_HOME, daemon cua daemon start --foreground. cua cloud hosts add --provider aws --type c7g.2xlarge --ttl-hours 3 (joined in ~70 s; not timed). Two warm-up Spaces pulled the image first (not counted). Serial, n=12. Per sample: t0 before cua spaces create linux --on aws --instance-type c7g.2xlarge --name cb-warm-aws-<i> --json; value = when cua sb exec <ref from create> -- echo ok has returned 'ok'. Then cua spaces delete --force (not timed).
Caveats
- The first command uses the Space reference that create returns.
- The client is on a home network in California; create and exec go through relay.cua.ai to us-west-2.
Environment and build
| Machine | Mac Studio (the client), Mac14,13 |
|---|---|
| Chip | Apple M2 Max, 12 cores |
| Memory | 96 GB |
| OS | macOS 26.6.2 |
| Where | client in the San Francisco Bay Area, home network; Space reaches the client via relay.cua.ai |
| Kind | container (gVisor on an elastic pool host) |
| Cloud | aws |
| Region | us-west-2 |
| Machine type | pool host c7g.2xlarge (8 vCPU, 16 GiB), $0.3016/h per cua |
| Image | ghcr.io/trycua/linux:24.04 (cua's default `linux`, already pulled on the host) |
| Warm host | true |
| Autoscale | on, cap $0.40/h, host added and pinned with `cua cloud hosts add` |
| Load avg before | 3.08 |
| Other vms | other sessions' VMs on the client Mac (not on the path) |
| Build | cua CLI bundled in Cua Spaces 0.15.0 DMG (GitHub release cua-spaces-v0.15.0, published 2026-10-24T19:42Z; dmg sha256 8725a09b...aba0), Contents/MacOS/cua, `cua --version` = cua 0.9.0 |
| App | 0.15.0 |
| cua | 0.9.0 |
Reproduce
# Cua Spaces 0.15.0 from cua.ai/download (its cua CLI is cua 0.9.0)
curl -fLO https://cua.ai/benchmarks/cloud-first-space-time/files/cloud_start.py
cua auth login
cua cloud connect aws --profile <aws-profile> --region us-west-2
cua daemon start --foreground &
cua cloud budget --autoscale on --max-per-hour 0.40 --monthly 20
cua cloud hosts add --provider aws --type c7g.2xlarge --ttl-hours 3 # wait until `cua cloud hosts ls` says joined
cua spaces create linux --on aws --instance-type c7g.2xlarge --name w0 --json && cua spaces delete w0 --force # image pull
CUA_BENCH_SPACES=1 python3 cloud_start.py aws 12 warm-aws --instance-type c7g.2xlarge
cua cloud hosts rm <host> && cua cloud sweep --all --deleteMethod: Hetzner, machine running
Released cua 0.9.0, isolated signed-in CUA_HOME, daemon cua daemon start --foreground. cua cloud hosts add --provider hetzner --type cax31 --region fsn1 --ttl-hours 3 (joined in ~2 min; not timed). Two warm-up Spaces pulled the image first (not counted). Serial, n=12. Per sample: t0 before cua spaces create linux --on hetzner --instance-type cax31 --name cb-warm-hetzner-<i> --json; value = when cua sb exec <ref from create> -- echo ok has returned 'ok'. Then cua spaces delete --force (not timed).
Caveats
- Bimodal: 2 of 12 creates took about 36 s, the rest 2 to 8 s, on an otherwise idle host. The cause was not diagnosed.
- The client is in California and the host in Germany; create and exec go through relay.cua.ai (exec about 230 ms).
Environment and build
| Machine | Mac Studio (the client), Mac14,13 |
|---|---|
| Chip | Apple M2 Max, 12 cores |
| Memory | 96 GB |
| OS | macOS 26.6.2 |
| Where | client in the San Francisco Bay Area, home network; Space reaches the client via relay.cua.ai |
| Kind | container (gVisor on an elastic pool host) |
| Cloud | hetzner |
| Region | fsn1 |
| Machine type | pool host cax31 (8 vCPU arm64, 16 GB), $0.0410/h per cua (cax31 $0.0400 + IPv4 $0.0010, Hetzner API) |
| Image | ghcr.io/trycua/linux:24.04 (cua's default `linux`, already pulled on the host) |
| Warm host | true |
| Autoscale | on, cap $0.40/h, host added and pinned with `cua cloud hosts add --provider hetzner --type cax31 --region fsn1` |
| Load avg before | 3.08 |
| Other vms | other sessions' VMs on the client Mac (not on the path) |
| Build | cua CLI bundled in Cua Spaces 0.15.0 DMG (GitHub release cua-spaces-v0.15.0, published 2026-10-24T19:42Z; dmg sha256 8725a09b...aba0), Contents/MacOS/cua, `cua --version` = cua 0.9.0 |
| App | 0.15.0 |
| cua | 0.9.0 |
Reproduce
# Cua Spaces 0.15.0 from cua.ai/download (its cua CLI is cua 0.9.0)
curl -fLO https://cua.ai/benchmarks/cloud-first-space-time/files/cloud_start.py
cua auth login
cua cloud connect hetzner --token-stdin --region fsn1 < token
cua daemon start --foreground &
cua cloud budget --autoscale on --max-per-hour 0.40 --monthly 20
cua cloud hosts add --provider hetzner --type cax31 --region fsn1 --ttl-hours 3 # wait until `cua cloud hosts ls` says joined
cua spaces create linux --on hetzner --instance-type cax31 --name w0 --json && cua spaces delete w0 --force # image pull
CUA_BENCH_SPACES=1 python3 cloud_start.py hetzner 12 warm-hetzner --instance-type cax31
cua cloud hosts rm <host> && cua cloud sweep --all --deleteHelper scripts: cloud_start.py.
Cua commands use the published Cua Spaces 0.15.0 release and the public trycua/cua repository at the tag cua-spaces-v0.15.0. Downloads: samples (CSV), result (JSON), this page as Markdown.
Questions
Why is a new machine so much slower?
A new machine has to boot, start Docker and pull the image before the first command, and all of that is in the time. A machine already running (a pool host with the image pulled) only starts the Space.
Which machines were used?
New machines: AWS t4g.medium in us-west-2, Google Cloud e2-medium in us-west1 and Hetzner cx23 in fsn1, the types cua 0.9.0 picks for the default image. Running machines: an AWS c7g.2xlarge and a Hetzner cax31 pool host.
What about Azure and Modal?
Not measured. Azure isn't in a release yet, and Spaces on Modal weren't measured on this release.
Can I run this myself?
Yes. The commands under Reproduce use the published Cua Spaces 0.15.0 release and the public trycua/cua repository at the tag cua-spaces-v0.15.0. A `cua bench run` command that wraps them is coming; it isn't in a release yet.
Checked 2026-10-24. Sources: the samples and result files above, measured by Cua. All benchmarks.