CI cost figures are vendor list prices verified April 2026. Actual cost depends on plan, concurrency, and discount terms. Some links are affiliate links. See disclosure.

Last verified April 2026 · 10 min read

Self-hosted runners: when they pay back, when they don't

THE THESIS

Most engineering organisations that self-host GitHub Actions runners pay more in total cost than if they had stayed on GitHub-hosted runners or switched to an external managed runner. This page is the one the self-hosted-runner vendors cannot write, because they all need you to believe self-hosting is the rational default.

§ 01

The self-hosted pitch vs the reality

The pitch: unlimited minutes, free software, your own hardware, complete control. It sounds compelling, and at extreme scale it is sometimes true. At the scale most teams operate, it is a cost trap.

The reality has five components that the pitch elides:

Engineer time is not free

A platform engineer costs $130,000-180,000 per year in salary plus benefits. Even 0.1 FTE dedicated to runner maintenance is $13,000-18,000 per year. This dwarfs the compute savings for most teams.

Maintenance burden scales with fleet size

Security patches, AMI updates, autoscaling edge cases, spot interruption handling, certificate rotation, monitoring alerts. Each runner you add is a recurring maintenance commitment.

Spot reliability is never quite what you expect

Spot interruptions during builds cause workflow failures that require re-runs. Each re-run costs additional minutes. A 5% spot interruption rate on a 20,000-minute-per-month fleet costs 1,000 additional minutes in re-runs.

Security patching is your responsibility

With hosted runners, GitHub patches the OS and runner agent. With self-hosted, every CVE is yours to remediate. For public repositories, self-hosted runners on the default branch are a code-execution risk: a malicious PR can run arbitrary code on your runner.

The 2026 platform fee closed the gap further

GitHub now charges $0.002/min on self-hosted runner minutes. This added cost did not exist before March 2026. For a team at 25,000 minutes per month, it adds $50/month permanently.

§ 02

The break-even model

40-DEV TEAM, 25,000 MIN/MONTH ON SELF-HOSTED (c6i.xlarge SPOT)

EC2 c6i.xlarge spot (~$0.05/hr, continuous)~$31/mo
Operational overhead (2hr/mo @ $130/hr)$260/mo
2026 GH Actions platform fee (25,000 x $0.002)$50/mo
TOTAL: self-hosted$341/mo
GitHub-hosted Linux (25,000 x $0.008)$200/mo
Depot (25,000 x $0.004 + $50 base)$150/mo
BuildJet ARM (25,000 x $0.002)$50/mo

At 25,000 minutes per month, self-hosting costs $191/month more than GitHub-hosted and $291/month more than BuildJet ARM, before accounting for spot interruption re-runs and security patching time. The self-hosted option is not cheaper. It is materially more expensive when engineer time is counted at its real cost.

The break-even point against GitHub-hosted (assuming one hour/month maintenance at $130/hr) is approximately 70,000-80,000 minutes per month. At that scale, it is still only cheaper if the maintenance estimate is accurate, which it often is not in the first year of operation.

§ 03

When self-hosted does pay back

Enterprise teams with 100+ engineers and a dedicated platform team

At 200,000+ minutes per month with a platform team that amortises operational overhead across 5+ systems, self-hosted can win. Shopify's case study (Buildkite on their own agents) is the archetypal version: their scale justified the investment.

GPU or specialised hardware workloads

No hosted runner provider offers GPU instances at competitive rates for ML training pipelines or CUDA-intensive test suites. Self-hosting NVIDIA A10G or A100 instances on AWS is the only practical option for ML teams running GPU workloads in CI.

Compliance or air-gapped requirements

SOC 2 Type II, ISO 27001, FedRAMP, or industry-specific compliance requirements sometimes mandate on-premises or VPC-isolated infrastructure for build environments. In these cases, self-hosting is not optional.

macOS builds at scale

macOS is 10x the cost on GitHub-hosted runners ($0.08/min). For a team running 20,000 macOS minutes per month, that is $1,600/month. Self-hosting Mac Minis (MacStadium Orka or bare metal) typically brings this to $400-600/month at scale. Above 5,000 macOS minutes per month, the macOS self-host case often wins.

§ 04

Implementation options by operational burden

Actions Runner Controller (ARC)

HIGH SETUP, LOW ONGOING

Kubernetes-native auto-scaling runner fleet. The most production-grade option. Requires EKS or GKE, KEDA for scaling, and good Kubernetes operational knowledge.

Operational cost: 1 FTE-week setup, 0.1 FTE ongoing

philips-labs/terraform-aws-github-runner

MEDIUM SETUP

Terraform module for AWS Lambda-driven runner lifecycle. Creates ephemeral EC2 runners on demand, terminates after job. Spot support included.

Operational cost: 2-3 days setup, monthly maintenance patches

RunsOn

LOWEST SELF-HOST OVERHEAD

A managed control plane for AWS self-hosted runners. Bridges the gap between fully managed (Depot) and DIY (ARC). Your EC2, their orchestration.

Operational cost: 1-2 hours setup, minimal ongoing

Karpenter-managed runner pools

HIGHEST COMPLEXITY, BEST COST AT SCALE

Most elegant auto-scaling solution on AWS. Karpenter manages node lifecycle for spot interruptions, instance diversification, and bin-packing. EKS-native.

Operational cost: 1-2 FTE-weeks setup, 0.2 FTE ongoing

§ 05

Before you decide: the honest checklist

Are you consuming more than 80,000 minutes per month?

Below this, the math almost never works in self-hosted's favour when engineer time is counted.

Do you have a dedicated platform engineer or team?

Running self-hosted runners without dedicated staffing is a recipe for outages.

Have you evaluated Depot, BuildJet, or Blacksmith?

External runners solve 80% of self-hosted's cost advantage without the operational burden.

Have you considered the 2026 platform fee in your model?

$0.002/min on self-hosted minutes materially changes the break-even at most team sizes.

Have you counted spot interruption re-runs in your minute estimate?

Spot interruptions at 5% cause approximately 5% additional minutes in re-runs.

DIGITAL SIGNET · PIPELINE AUDIT

Considering self-hosted? We run the numbers before you commit infrastructure.

Digital Signet models the full cost of self-hosted vs hosted options against your real workload, including engineer time, platform fees, and spot interruption re-runs. We tell you the honest break-even, not the vendor pitch.

Get an Audit

FAQ

When does self-hosting GitHub Actions runners make sense?+
Self-hosting makes sense when: (1) you consume more than 80,000-100,000 minutes per month AND have a dedicated platform engineer, (2) you need GPU or specialised hardware, (3) compliance requires on-premises infrastructure, or (4) you build macOS apps at scale. Below these thresholds, external runners almost always win on total cost.
What is the real cost of self-hosted runners?+
A 40-developer team running 25,000 minutes per month on self-hosted runners typically pays $31/month EC2 spot cost, $260/month engineer maintenance time, and $50/month 2026 platform fee, totalling $341/month. The same workload on Depot costs roughly $150/month.
Is Actions Runner Controller (ARC) worth using?+
ARC is the most production-grade self-hosted option: ephemeral runners, Kubernetes-native autoscaling via KEDA, and well-maintained by GitHub. But it requires EKS or GKE and a team with Kubernetes operational knowledge. The setup cost is roughly one FTE-week. Consider RunsOn if you want AWS-native self-host without the Kubernetes complexity.
Can I use spot instances for GitHub Actions runners?+
Yes, with caveats. Spot interruptions cause workflow failures that require re-runs. Structure your instance pool with 3-5 diversified instance families to reduce interruption probability. Use graceful termination handling in your runner configuration. Expect 3-7% of builds to require re-runs due to interruption.
Should I self-host to avoid the 2026 platform fee?+
No. The 2026 platform fee ($0.002/min on self-hosted runner minutes) applies whether you use ARC, philips-labs, or any other self-hosted configuration connected to GitHub Actions. You cannot avoid it by self-hosting.