The true cost of self-hosting
A cheaper instance does not always mean a cheaper CI job once you account for idle capacity, networking, and storage.
The largest engineering organizations still self-host CI, and the economics were sound until developers adopted coding agents and hardware became harder to secure.
Across 315 organizations, jobs per org have grown 4.8x since May 2025, while developers grew 1.4x. As models get smarter and cheaper, the volume of code to validate rises with both, and we do not see it slowing down.
At the same time, frontier labs are buying current-generation machines ahead of everyone else, and the hyperscalers expect the shortage to last years.
Idle machines, networking, and storage have always been charged separately, but they are often left out of cost comparisons. This page accounts for those charges alongside the cost of running on older-generation machines and managing idle capacity.
- 1Claude 4 and Claude Code GA · May 22, 2025
- 2GPT-5 · Aug 7, 2025
- 3Claude Sonnet 4.5 · Sep 29, 2025
- 4Claude Opus 4.5 · Nov 24, 2025
- 5Claude Opus 5 · Jul 24, 2026
- 6GPT-6 Astra · Sep 3, 2026
Latest-generation machines are hard to get
On every public cloud, across the major US and EU regions, latest-generation hardware is hard to get on demand. AWS describes its capacity as largely committed through 2027, while Google and Microsoft have both reported turning away cloud business.
CI demand arrives in bursts that lose out to the steady production workloads hyperscalers hold capacity for. The machine you request is often not the machine you get, so you either wait for it or use something older.
You wait
The request sits in InsufficientInstanceCapacity until the generation you asked for becomes available, leaving the job waiting in the queue. On the self-hosted fleets we measured, weekly P95 queue time exceeded twelve minutes, while the same organizations on Blacksmith wait seconds.
| Weekly P95 queue | Self-hosted | Blacksmith |
|---|---|---|
| AWS customer | 2m 03s | 15s |
| GCP customer | 12m 11s | 11s |
AWS customer

- Self-hosted
- 2m 03s
- Blacksmith
- 15s
GCP customer

- Self-hosted
- 12m 11s
- Blacksmith
- 11s
You settle
The pool that reliably fills is one or two generations old, and each generation back is slower per core. The same job takes longer on every run, so a cheaper hour can mean a more expensive job. Every self-hosted team we talk to runs a fallback list spanning several generations.
The median job on Blacksmith runs for 1m 22s and costs $0.011. The chart shows that same job on each machine, timed and priced using us-east-1 on-demand list rates. On the same hardware, the per-hour gap would be 2.7x, but on the hardware you actually get, it is about 1.7x per job.
- c8i / m8i 2025
69% 1m 59s · $0.006 - c7i 2023
63% 2m 10s · $0.006 - c7a / m7a 2023
61% 2m 15s · $0.008 - m7i 2023
58% 2m 22s · $0.008 - c6a / m6a 2022
55% 2m 30s · $0.006 - c6i / m6i 2021
49% 2m 49s · $0.008 - c5 2017
40% 3m 24s · $0.010 - m5 2018
36% 3m 47s · $0.012
Idle machines are billed like busy ones
The job prices above count only the minutes spent running the job, leaving out the time the machine spent booting, waiting for work, or held in reserve for a peak. A self-hosted fleet pays for all of it because it is sized for a peak that lasts only a few minutes on most days.
Across the organizations on Blacksmith, a team in one timezone peaks at about 3x its daily mean and is nearly idle overnight. A global team spreads demand more evenly and is the best case for self-hosting, but it still peaks near 2x.
What the autoscaler recovers
We replayed a week of per-minute demand from the 128 largest organizations on Blacksmith against three ways of running a fleet. The busy-share readout shows the median organization’s share of paid minutes spent doing work under each configuration.
Autoscaling with less than 20% headroom puts jobs back in the queue because a cold machine takes minutes to join. At 47% busy, every working minute carries about one idle minute with it, taking the c6a job from $0.006 to $0.014. Hardware that was 1.7x cheaper per job is now about 1.2x more expensive than the same job on Blacksmith, before networking and storage.
Spot cuts list price by 60 to 70% and worked while hyperscalers had capacity nobody else wanted. That spare capacity is gone, and by August, spot on AWS had become hard to get at all. Teams that moved to Blacksmith from spot fleets were being preempted too often to scale reliably.
- vCPUs busy
- Paid for and idle
Every GB through the NAT is billed
The instance price does not cover moving bytes into and out of the machine. AWS and GCP charge a NAT fee on every GB in or out, with egress charged on top for uploads. Runners with public IPs skip the NAT fee, but that puts every CI machine on the public internet, which most security teams will not allow.
Across millions of jobs we run, the average job moves about 400 MB in and 25 MB out. At AWS list rates, those bytes cost about $0.02 through a NAT gateway, more than the machine time for the job itself.
The organization behind the idle chart runs close to a million jobs on a weekday and moves 25 TB doing it, adding up to about $1,220 a day in NAT and egress fees at AWS list rates.
Blacksmith does not charge for ingress or egress, and our caching avoids much of that traffic in the first place.
- Pulled in
- Sent out
Network-backed volumes slow down your CI
Disk speed sets the pace of most CI jobs, and on a cloud runner, the disk is usually a network volume such as gp3 on AWS or Persistent Disk on GCP.
Every read and write travels over the network to a volume tuned for durable systems such as databases, with little you can change about that on the hyperscalers. Workloads with many small writes feel it most, including Docker builds that unpack image layers into tens of thousands of small files and write new layers back.
Default gp3 is cheap and slow, adding to the runtime of every CI job. You will likely provision more IOPS and throughput to make it faster, but that can leave the disk costing more per job than the machine it is attached to. In this example, the disk costs $0.0073 per job against $0.006 for the c6a.
Blacksmith runs every job on local NVMe SSDs at no extra charge.
| Disk, 100 GB | Spec | Per job | Vs Blacksmith |
|---|---|---|---|
| gp3, default | 3K IOPS, 125 MiB/s | $0.0005 | 64% slower |
| gp3, tuned | 16K IOPS, 1,000 MiB/s | $0.0073 | 25% slower |
| io2 | 16K IOPS | $0.071 | not measured |
| Local NVMe instance | c6id over c6i | $0.0015 | not measured |
gp3, default

- Spec
- 3K IOPS, 125 MiB/s
- Per job
- $0.0005
- Vs Blacksmith
- 64% slower
gp3, tuned

- Spec
- 16K IOPS, 1,000 MiB/s
- Per job
- $0.0073
- Vs Blacksmith
- 25% slower
io2

- Spec
- 16K IOPS
- Per job
- $0.071
- Vs Blacksmith
- not measured
Local NVMe instance

- Spec
- c6id over c6i
- Per job
- $0.0015
- Vs Blacksmith
- not measured
The full cost of self-hosting
A self-hosted minute is cheaper than a Blacksmith minute, but that comparison leaves out the slower machines you end up on, the warm pool you keep idle, and the networking and storage an average CI job pays for. These figures exclude operational overhead and engineering time. Take it from us: running CI infrastructure at scale is an interesting systems problem, but keeping it reliable is not something you do on the side.
We keep looking for ways to help you run less CI without making your code less robust. If you want the cost comparison modeled on your own fleet and job mix, contact us and we will build it with you.
| Cumulative cost | Per job |
|---|---|
| Active compute only{4 vCPU c6a · us-east-1 on-demand} | $0.006 |
| With idle capacity{47% of paid minutes busy} | $0.014 |
| With NAT and egress{400 MB in · 25 MB out per job} | $0.035 |
| With storage{100 GB gp3 · 16K IOPS · 1,000 MiB/s} | $0.042 |
| Blacksmith{4 vCPU · local NVMe and network included} | $0.011 |