What one CI run costs on nine sandboxes
One target machine of 2 vCPU / 4 GB. One real job: the better-auth CI pipeline, clone to typecheck, ten tasks. Our own harness, our own runs, and every price read off the vendor's own page.
Measured 19 September 2026
How we measured it
- The machine. 2 vCPU / 4 GB on every provider, asked for the way that provider asks for it.
- The job. better-auth CI, 10 tasks, at one pinned commit, so a task here and a task there do the same work.
- The runner. The open hpc-sandbox-benchmarks task runner, unchanged, so these times compare with anyone else's.
- The toolchain. The same Node and the same pnpm are installed on every box before the clock starts, so an image's own versions are not a hidden variable.
- The fairness controls. Worker counts pinned to the core count, CPU affinity pinned where a box reports more cores than it sells, and one memory ceiling for every provider.
- The sample. The median of two runs per provider per task, three for Fly. Setup is untimed; only the task is timed.
Cost of one CI run
| Provider | Per hour | One CI run | Cost per run | vs Impello | Boot | Runs |
|---|---|---|---|---|---|---|
| Impello | $0.0540 | 342.8 s | $0.0051 | 1.00× | 1.2 s | 2 |
| Blaxel | $0.1656 | 307.5 s | $0.0141 | 2.75× | 2.1 s | 2 |
| E2B | $0.1656 | 440.6 s | $0.0203 | 3.94× | 1.4 s | 2 |
| Modal (V1 sandbox) | $0.2380 | 341.1 s | $0.0226 | 4.39× | 1.7 s | 2 |
| Modal (V2 sandbox) | $0.2380 | 415.5 s | $0.0275 | 5.34× | 1.5 s | 2 |
| Vercel Sandbox | $0.3408 | 356.3 s | $0.0337 | 6.56× | 0.5 s | 2 |
| Fly.io Sprites | $0.3150 | 519.9 s | $0.0455 | 8.85× | 2.4 s | 3 |
| Railway Sandbox | $0.4233 | 571.5 s | $0.0672 | 13.07× | 1.4 s | 2 |
| Daytona | $0.1656 | — | not measured | — | 1.8 s | — |
Daytona is priced but not measured. Its sandboxes ship a default egress allow list that resets the connection to the Prisma binary host, so the install step never finishes. Lifting it needs a paid network tier, and the limit cannot be overridden per sandbox.
Every task, second by second
| Task | Impello | Blaxel | E2B | Modal (V1 sandbox) | Modal (V2 sandbox) | Vercel Sandbox | Fly.io Sprites | Railway Sandbox | Daytona |
|---|---|---|---|---|---|---|---|---|---|
| git clone | 2.4 | 1.7 | 2.3 | 2.4 | 1.7 | 1.3 | 2.8 | 2.5 | 2.1 |
| cold install | 38.2 | 37.0 | 38.7 | 48.0 | 41.5 | 38.5 | 121.2 | 52.5 | — |
| build | 125.4 | 113.1 | 165.2 | 115.5 | 148.9 | 132.5 | 161.6 | 207.5 | — |
| lint (biome) | 7.1 | 6.5 | 8.3 | 9.4 | 11.1 | 7.3 | 9.4 | 12.1 | — |
| lint (deps) | 17.1 | 15.4 | 21.8 | 16.9 | 19.5 | 15.7 | 21.5 | 23.7 | — |
| lint (format) | 4.9 | 4.0 | 5.7 | 4.3 | 5.4 | 4.7 | 5.6 | 6.6 | — |
| lint (spell) | 11.9 | 9.1 | 13.5 | 9.9 | 12.7 | 11.0 | 13.0 | 12.7 | — |
| lint (types) | 59.7 | 55.3 | 83.0 | 70.3 | 88.3 | 66.9 | 91.6 | 112.8 | — |
| lint (packages) | 5.8 | 5.1 | 6.9 | 6.8 | 7.8 | 6.0 | 8.2 | 19.8 | — |
| typecheck | 70.3 | 60.5 | 95.1 | 57.7 | 78.7 | 72.4 | 85.1 | 121.2 | — |
| total | 342.8 | 307.5 | 440.6 | 341.1 | 415.5 | 356.3 | 519.9 | 571.5 | — |
Seconds, median across runs. The install and the build dominate every column: they are 55% of the job on the fastest box and 58% on the slowest.
What each machine reported
| Provider | Cores seen | RAM seen | Disk | Operating system | Kernel |
|---|---|---|---|---|---|
| Impello | 2 | 3.85 GB | 65G | Debian GNU/Linux 12 (bookworm) | 6.1.158+ |
| Blaxel | 2 | 3.85 GB | 2G | Debian GNU/Linux 12 (bookworm) | 6.1.166 |
| E2B | 2 | 3.84 GB | 11G | Debian GNU/Linux 12 (bookworm) | 6.1.158+ |
| Modal (V1 sandbox) | 2 | 4 GB | 8589934592G | Debian GNU/Linux 12 (bookworm) | 4.19.0-gvisor |
| Modal (V2 sandbox) | 2 | 4 GB | 8589934592G | Debian GNU/Linux 12 (bookworm) | 4.19.0-gvisor |
| Vercel Sandbox | 2 | 4.18 GB | 32G | Amazon Linux 2023.12.20260817 | 6.18.49 |
| Fly.io Sprites | 8 | 15.62 GB | 99G | Ubuntu 26.04.1 LTS | 6.12.105-fly |
| Railway Sandbox | 2 | 4.21 GB | 29G | Ubuntu 26.04.1 LTS | 6.18.46-railway |
| Daytona | 48 | 188.68 GB | 10G | Debian GNU/Linux 12 (bookworm) | 6.17.0-1010-oracle |
These are the numbers the sandbox itself reports, not the size we asked for. Daytona, Modal and Fly show more than they sell: the first two show the host behind a quota, and a Fly sprite simply has no size to ask for.
How each price was worked out
Each rate below is the vendor's own published price for 2 vCPU / 4 GB, read on 19 September 2026. Nothing here is a list price we were quoted, and no discount is applied to ours.
| Provider | Per hour | Egress | The basis |
|---|---|---|---|
| Impello | $0.0540 | free | flat $0.054/h for the 2 vCPU / 4 GB size, read off impello.ai own calculator; no data-transfer meter |
| Blaxel | $0.1656 | free | $0.0000115/GB RAM-s, CPU bundled 1 core per 2 GB; internet egress listed as Included |
| E2B | $0.1656 | free | $0.0504/vCPU-h + $0.0162/GiB-h; no data-transfer line on the pricing page or docs.e2b.dev/billing |
| Modal (V1 sandbox) | $0.2380 | free | same rate card as modal-vm |
| Modal (V2 sandbox) | $0.2380 | free | Sandbox rate card: $0.00003942/core-s, and one Modal core is 2 vCPU, + $0.00000667/GiB-s; no egress fee |
| Vercel Sandbox | $0.3408 | $0.15 / GB | Active CPU $0.128/vCPU-h + memory $0.0212/GB-h; Sandbox Data Transfer $0.15/GB out, downloads free |
| Fly.io Sprites | $0.3150 | free | Sprites: $0.07/CPU-h + $0.04375/GB RAM-h, plus $0.000683/GB-h hot storage; "Sprites bandwidth isn't metered today" |
| Railway Sandbox | $0.4233 | $0.05 / GB | Sandboxes bill the VM rate card: $50/vCPU-month ($0.00001929/vCPU-s) + $50/GB-month ($0.00000001929/MB-s), egress $0.05/GB |
| Daytona | $0.1656 | free | $0.0504/vCPU-h + $0.0162/GiB-h; billed dimensions are vCPU, RAM and disk only |
What we found
Price is the gap, not speed
At this size the three fastest boxes finish within 12% of each other. The rate cards are 3 to 8 times apart. The cheapest rival costs 2.75 times as much for the same finished CI run.
A stock CI run does not fit in 4 GB
turbo defaults to ten workers, and ten parallel package builds are killed for memory on every provider that truly enforces 4 GB. The harness pins the worker count to the core count, on every provider alike. That is a finding about the spec, not about any vendor.
Some sandboxes show you the host, not your quota
Daytona reports 48 cores and 189 GB behind a 2-core limit, and Modal does the same. Any tool that sizes its worker pool from nproc then fans out 48 ways and dies. The harness pins CPU affinity, so every provider runs the job as a 2-core machine.
Modal bills sandboxes on a different row
The sandbox rate is $0.00003942 per core-second against $0.0000131 for standard compute, and one Modal core is two vCPU. Our first table used the standard rate and understated Modal by 25%. This one does not.
A Fly sprite has no size, and the machine is a lottery
Sprites ignore the CPU and RAM you ask for: you get 8 vCPU and 8 to 16 GB, and Fly bills the CPU and memory the job actually uses. Five runs of the same job took 490, 510, 627, 736 and 766 seconds, a spread of 56%, so Fly here is the median of three runs and not of two.
Three vendors bill the CPU a job uses
Railway, Vercel and Fly meter active CPU rather than wall clock. The rates here assume a run that keeps both vCPUs busy, which is what this job does. A sandbox that sits waiting for a model or a user costs them much less. That is a real advantage for an idle agent box, and none for a build.
Egress is not the differentiator people think
Six of the eight vendors do not meter data out of the sandbox at all. Only Vercel ($0.15/GB) and Railway ($0.05/GB) do. We bill per second of compute and nothing else.
What this does not prove
One job on one size. A different workload moves the times, and a bigger box moves them again. Two runs per provider is a median, not a distribution, and Fly shows why that matters. Prices change, and these were read on one day. Daytona has no time here at all, so treat its row as a rate card and nothing more.
We publish it because it is ours to check: the same harness, the same job, the same size, on every box we could buy.