# 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).

- Page: https://cua.ai/benchmarks/cloud-first-space-time
- Measured: 2026-10-24 to 2026-10-25
- Raw data: https://cua.ai/benchmarks/cloud-first-space-time.csv
- Helper script: https://cua.ai/benchmarks/cloud-first-space-time/files/cloud_start.py
- AWS, new machine: 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; n = 10
- Google Cloud, new machine: 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; n = 10
- Hetzner, new machine: 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; n = 10
- AWS, machine running: 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; n = 12
- Hetzner, machine running: 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; n = 12

## 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.

## Environment (AWS, new machine)

- 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

## Caveats (AWS, new machine)

- 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.

## Reproduce (AWS, new machine)

```sh
# 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 --delete
```

## Method (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.

## Environment (Google Cloud, new machine)

- 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

## Caveats (Google Cloud, new machine)

- 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.

## Reproduce (Google Cloud, new machine)

```sh
# 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 --delete
```

## Method (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.

## Environment (Hetzner, new machine)

- 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

## Caveats (Hetzner, new machine)

- 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.

## Reproduce (Hetzner, new machine)

```sh
# 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 --delete
```

## Method (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).

## Environment (AWS, machine running)

- 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

## Caveats (AWS, machine running)

- 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.

## Reproduce (AWS, machine running)

```sh
# 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 --delete
```

## Method (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).

## Environment (Hetzner, machine running)

- 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

## Caveats (Hetzner, machine running)

- 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).

## Reproduce (Hetzner, machine running)

```sh
# 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 --delete
```

## 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.
