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.
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.
The break-even model
40-DEV TEAM, 25,000 MIN/MONTH ON SELF-HOSTED (c6i.xlarge SPOT)
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.
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.
Implementation options by operational burden
Actions Runner Controller (ARC)
HIGH SETUP, LOW ONGOINGKubernetes-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 SETUPTerraform 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 OVERHEADA 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 SCALEMost 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
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