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.
Measured Build app 0.15.0, cua 0.9.0Raw data (CSV)
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).
Caveats
- 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.
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 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 |
Reproduce
# 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 --deleteMethod: 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).
Caveats
- 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.
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 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 |
Reproduce
# 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 --deleteHelper scripts: pack.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 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.
Checked 2026-10-25. Sources: the samples and result files above, measured by Cua. All benchmarks.