# Is a Space-hour cheaper on Hetzner or AWS?

Packed onto one machine with at least 25 idle Spaces of 1 vCPU and 512 MiB, a Space-hour cost at most $0.0016/Space-hour on a Hetzner cax31 and $0.0116/Space-hour on an AWS c7g.2xlarge at list prices (3 runs each, 2026-10-25). The account plan's 25-session limit stopped both, so both are upper bounds.

- Page: https://cua.ai/benchmarks/cost-per-sandbox-hour-hetzner-vs-aws
- Measured: 2026-10-25
- Raw data: https://cua.ai/benchmarks/cost-per-sandbox-hour-hetzner-vs-aws.csv
- Helper script: https://cua.ai/benchmarks/cost-per-sandbox-hour-hetzner-vs-aws/files/pack.py
- Hetzner cax31: build cua CLI bundled in Cua Spaces 0.15.0 DMG (GitHub release cua-spaces-v0.15.0, published 2026-10-24T19:42Z), `cua --version` = cua 0.9.0; n = 3
- AWS c7g.2xlarge: build cua CLI bundled in Cua Spaces 0.15.0 DMG (GitHub release cua-spaces-v0.15.0, published 2026-10-24T19:42Z), `cua --version` = cua 0.9.0; n = 3

## Results

Instance list price divided by the Spaces it held at once. Lower is better.

| Result | Value | n | Measured |
| --- | --- | --- | --- |
| Hetzner cax31 | $0.0016/Space-hour (max) | 3 | 2026-10-25 |
| AWS c7g.2xlarge | $0.0116/Space-hour (max) | 3 | 2026-10-25 |

## Method (Hetzner cax31)

Released cua 0.9.0 elastic pool. One pinned cax31 (8 vCPU Ampere arm64, 16 GB) host (`cua cloud hosts add`). Each run asks for 32 Spaces at once (16 concurrent `cua spaces create ghcr.io/trycua/linux:24.04-slim --on hetzner --instance-type cax31 --cpus 1 --memory-mb 512`), runs `cua sb exec <ref> -- echo ok` in every created Space, counts the Spaces that answer on that one host, then deletes them all. n=3 runs. $/Space-hour = the instance's on-demand list price / Spaces held at once (Hetzner Cloud API server_types cax31 fsn1 price_hourly gross $0.0400, read 2026-10-25).

## Environment (Hetzner cax31)

- Machine: Mac Studio (the client), Mac14,13
- Chip: Apple M2 Max, 12 cores
- Memory: 96 GB
- OS: macOS 26.6.2
- Where: client in California, home network
- Kind: container (gVisor) on one elastic pool host
- Cloud: hetzner
- Machine type: cax31 (8 vCPU Ampere arm64, 16 GB)
- Space shape: ghcr.io/trycua/linux:24.04-slim, 1 vCPU / 512 MiB booked each
- Autoscale: on, $0.40/h cap (blocks a 2nd host), host pinned via `cua cloud hosts add`
- Build: cua CLI bundled in Cua Spaces 0.15.0 DMG (GitHub release cua-spaces-v0.15.0, published 2026-10-24T19:42Z), `cua --version` = cua 0.9.0
- App: 0.15.0
- cua: 0.9.0

## Caveats (Hetzner cax31)

- The ceiling of 25 Spaces per machine is the account plan's live-session limit, not the machine's: further creates were refused with 'Your plan allows 25 live sessions'. So the cost per Space-hour is an upper bound.
- Price is the instance's on-demand list price only; extra.usd_per_space_hour_incl_public_ipv4 adds its public IPv4. Disk and traffic are not included.
- Spaces were idle apart from the exec check: booked-shape density, not a CPU-bound load.
- Hetzner bills each started hour.

## Reproduce (Hetzner cax31)

```sh
# Cua Spaces 0.15.0 from cua.ai/download (its cua CLI is cua 0.9.0)
curl -fLO https://cua.ai/benchmarks/cost-per-sandbox-hour-hetzner-vs-aws/files/pack.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 2
for r in 1 2 3; do python3 pack.py hetzner cax31 32 16 run$r --cpus 1 --memory-mb 512; done
cua cloud hosts rm <host> && cua cloud sweep --all --delete
```

## Method (AWS c7g.2xlarge)

Released cua 0.9.0 elastic pool. One pinned c7g.2xlarge (8 vCPU Graviton3, 16 GiB) host (`cua cloud hosts add`). Each run asks for 32 Spaces at once (16 concurrent `cua spaces create ghcr.io/trycua/linux:24.04-slim --on aws --instance-type c7g.2xlarge --cpus 1 --memory-mb 512`), runs `cua sb exec <ref> -- echo ok` in every created Space, counts the Spaces that answer on that one host, then deletes them all. n=3 runs. $/Space-hour = the instance's on-demand list price / Spaces held at once (AWS Price List API, c7g.2xlarge Linux on-demand us-west-2 $0.29/h).

## Environment (AWS c7g.2xlarge)

- Machine: Mac Studio (the client), Mac14,13
- Chip: Apple M2 Max, 12 cores
- Memory: 96 GB
- OS: macOS 26.6.2
- Where: client in California, home network
- Kind: container (gVisor) on one elastic pool host
- Cloud: aws
- Machine type: c7g.2xlarge (8 vCPU Graviton3, 16 GiB)
- Space shape: ghcr.io/trycua/linux:24.04-slim, 1 vCPU / 512 MiB booked each
- Autoscale: on, $0.40/h cap (blocks a 2nd host), host pinned via `cua cloud hosts add`
- Build: cua CLI bundled in Cua Spaces 0.15.0 DMG (GitHub release cua-spaces-v0.15.0, published 2026-10-24T19:42Z), `cua --version` = cua 0.9.0
- App: 0.15.0
- cua: 0.9.0

## Caveats (AWS c7g.2xlarge)

- The ceiling of 25 Spaces per machine is the account plan's live-session limit, not the machine's: further creates were refused with 'Your plan allows 25 live sessions'. So the cost per Space-hour is an upper bound.
- Price is the instance's on-demand list price only; extra.usd_per_space_hour_incl_public_ipv4 adds its public IPv4. Disk and traffic are not included.
- Spaces were idle apart from the exec check: booked-shape density, not a CPU-bound load.

## Reproduce (AWS c7g.2xlarge)

```sh
# Cua Spaces 0.15.0 from cua.ai/download (its cua CLI is cua 0.9.0)
curl -fLO https://cua.ai/benchmarks/cost-per-sandbox-hour-hetzner-vs-aws/files/pack.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 2
for r in 1 2 3; do python3 pack.py aws c7g.2xlarge 32 16 run$r --cpus 1 --memory-mb 512; done
cua cloud hosts rm <host> && cua cloud sweep --all --delete
```

## Questions

### Why are both upper bounds?

Both runs stopped at 25 Spaces per machine because the account plan allows 25 live sessions, not because the machines were full.

### Are the machines comparable?

Both have 8 vCPU and 16 GB: a Hetzner cax31 (Ampere, arm64) at $0.0400/machine-hour and an AWS c7g.2xlarge (Graviton3, arm64) at $0.2900/machine-hour, list prices read on the day.

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