Skip to content
Latchkey LogoLatchkey home

RunsOn vs Blacksmith for GitHub Actions runners

RunsOn vs Blacksmith is a choice between two cost models rather than two rate cards: RunsOn is a flat annual license from 300 euros that installs into your own AWS account and leaves the compute on your AWS bill, and Blacksmith is a managed fleet at $0.004 a Linux minute with 3,000 free minutes a month. The rate comparison favors RunsOn heavily and it only counts if you want an AWS footprint to own.

Monthly bars: RunsOn $163 as $10 of EC2, $124 macOS and a $29 license; Blacksmith $188; Latchkey $149
10,000 Linux minutes at 2 vCPU plus 2,000 macOS minutes a month, at figures read 20 September 2026. RunsOn and Latchkey have no macOS runner, so that half of both bars is GitHub-hosted; the RunsOn compute bar is spot EC2 and excludes NAT, S3 and data transfer.

RunsOn installs a stack into your AWS account and runs ephemeral EC2 runners there, on spot with automatic on-demand fallback, on any EC2 shape your quotas allow. You pay AWS directly for the instances with no markup, and RunsOn for a license: 300 euros a year for under 50,000 runners a month, rising through 900 and 1,800 euros to 3,600 for enterprise volume, free for non-commercial use, with a 15-day trial that deploys into your real account rather than a sandbox.

Blacksmith sells managed runners on its own bare metal in four regions, at a single published rate per platform, with 3,000 free minutes a month and a GitHub App to install. There is no cloud account to own, no quota to raise and no stack to upgrade, and there is also no way to put a runner inside your VPC. The simplicity is most of what you are buying.

Every cell below was read from the vendor's own public pricing or documentation page on 20 September 2026. Where a vendor does not publish a number, the cell says "not published" instead of carrying a guess.

RunsOn, Blacksmith and Latchkey side by side (read 20 September 2026)

RunsOnBlacksmithLatchkey
Price per minute, 2 vCPU Linux x64No per-minute fee. Your EC2 bill: RunsOn publishes $0.0010 a minute at spot for an m7i-flex.large in us-east-1 including a 30 GB gp3 volume, and $0.0016 on demand for the instance alone$0.004 (2 vCPU, 8 GB RAM, 80 GB disk)$0.0025 (2 vCPU, 8 GB RAM, 100 GB disk)
Price per minute, 4 vCPU Linux x64$0.0017 a minute at spot for an m7i-flex.xlarge on the same published table$0.008 (4 vCPU, 16 GB RAM, 80 GB disk)$0.005 (4 vCPU, 16 GB RAM, 100 GB disk)
Platform feeA flat annual license per legal entity: 300 euros a year under 50,000 runners a month, then 900, 1,800 and 3,600. Free for non-commercial useNone$5 to $49 a month by plan
Free tier15-day trial into your own AWS account, and a free license for nonprofit, open-source, educational and personal non-commercial projects3,000 free minutes a month, printed on every runner card30-day trial, then 2,000 included minutes a month on Developer, 4,000 on Launch, 6,000 on Scale
Billing granularityAWS bills the instances by the second; the license does not vary with minutes at allNot publishedPer minute
Runner sizes and OSAny EC2 shape your quotas allow, Linux x64 and arm64, Windows and GPU; its published table runs to 96 vCPU. Its docs state macOS is not yet supported2 to 32 vCPU on Linux x64 and arm64; Windows Server 2025 at 2 to 32 vCPU in public beta; macOS M4 at 6 and 12 vCPU2, 4, 8 and 16 vCPU, Ubuntu 24.04 on x86_64 only. arm64, Windows and macOS are not offered
Cache: type, limit, persistenceMagic Cache backs actions/cache with an S3 bucket in your own VPC, described as effectively unlimited with a 10-day default expiry and no transfer cost inside the VPC; sticky EBS disks and local NVMe are optionsColocated cache intercepts actions/cache, 25 GB free per repo per week; sticky disks are ext4 volumes, 5 per job, evicted after 7 days idle, $0.50/GB/monthSize not published. latchkey-dev/cache-action@v1 swaps one line for actions/cache, keeping path, key and restore-keys; entries are isolated per organization, versioned by OS, kept 14 days; a failed restore warns rather than failing the job
Docker build accelerationBuildx with the type=gha backend through Magic Cache, an S3 backend, an ephemeral ECR registry, or sticky EBS disks for large layer setsuseblacksmith/setup-docker-builder@v2 and useblacksmith/build-push-action@v2, with layers on a persistent sticky disklatchkey-dev/docker-cache-action@v1, layers held in a Latchkey-managed private registry per organization
Concurrency limitsYour EC2 service quotas and spot capacity, not a plan tierNone imposed, per the runner docsNot published; warm-pool capacity varies by plan
Where jobs runYour AWS account, your VPC, your region, on instances that terminate after the jobBlacksmith's own regions: Ashburn, Phoenix, Amsterdam and FrankfurtLatchkey's own AWS estate on m6a-class hosts, one job per runner, private network, destroyed after the job
Self-healing or retriesNot offeredNot offeredBuilt in: transient failures are diagnosed and retried inside the run
Setup change requiredInstall the stack in AWS, then a runs-on label such as runs-on=${{ github.run_id }}/runner=2cpu-linux-x64Install the GitHub App, then change the runs-on labelA runs-on label change. GitHub organization accounts only

Two cost models, one month

Because RunsOn charges a license rather than a rate, the two are only comparable once you put a month against both. Take the workload every comparison here uses, 10,000 Linux minutes at 2 vCPU plus 2,000 macOS minutes, and remember that RunsOn does not support macOS, so those minutes stay on GitHub-hosted exactly as they do for Latchkey.

10,000 Linux minutes at 2 vCPU2,000 macOS minutesLicense or planMonthly total
RunsOn on Starter$10 of EC2 at the published spot figureNot supported: $124 on GitHub-hosted$29, the $350 annual license spread over 12 months$163
Blacksmith$28 after 3,000 free minutes$160 at $0.08/minNone$188
Latchkey$25 at $0.0025/minNot offered: $124 on GitHub-hosted$5 to $49 a month$149 plus the plan

Two honest caveats on that RunsOn row. The $10 is RunsOn's own published figure for us-east-1 spot including a 30 GB gp3 volume, and it excludes everything else an AWS account charges for: NAT gateways if your runners sit in private subnets, the S3 bucket behind Magic Cache, data transfer, and the on-demand fallback you will land on whenever spot capacity is short, which is $0.0016 a minute rather than $0.0007. The license also scales by runners per month rather than minutes, so a busy monorepo firing 60,000 jobs a month is on the 900 euro tier whether those jobs take one minute or ten.

The second caveat is the one that does not appear on any invoice: a RunsOn runner is a self-hosted runner as far as GitHub is concerned, which is why GitHub charges nothing for the minutes, and also why GitHub's own advice applies. Its documentation says "We recommend that you only use self-hosted runners with private repositories", because a fork can run untrusted code on your machine. RunsOn gives you ephemeral per-job instances, which is the right mitigation, and it is still your account and your blast radius. Latchkey's own plan is $5 to $49 a month on top of that compute, and its 2,000 to 6,000 included minutes are not netted off, so the figure is gross on both counts.

Speed

Not benchmarked yet; the runner benchmark report will replace this section. We have not run the same workload on these runners ourselves, and until we have, there is no number here worth quoting.

The cheap way to get a real answer is to point one slow job at each candidate for a week, because runner selection is per job and the Actions run log gives you the timings for free.

Reliability, and who gets paged

Uptime is unpublished on both sides, beyond Blacksmith listing 99.9% as an Enterprise plan feature. The more useful question is who is on the hook when runners stop appearing. On Blacksmith that is Blacksmith, and your escalation path is a support ticket. On RunsOn it is you: spot capacity, EC2 quotas, AMI updates, stack upgrades and VPC changes are all yours, and RunsOn ships observability hooks precisely because you are the operator.

What both share is the behavior of a failed job. A registry timeout, a missing shared library or an out-of-memory kill fails the job, bills whatever it burned, and waits for a person to press re-run. On RunsOn that bill is an EC2 line rather than a runner line, which makes it easier to miss and no cheaper. Exit code 137 in GitHub Actions and error while loading shared libraries are the two that most often look like a runner fault on either side.

When to choose RunsOn

  • You already run AWS and know the answer to "who owns this account". That is the whole prerequisite, and it is a real one.
  • Your volume is high enough that a flat license beats a metered rate: at 100,000 Linux minutes a month, a 350 dollar annual license plus roughly $100 of spot compute is a fraction of any per-minute rate on this page.
  • You need jobs inside your VPC, static egress IPs, GPU instances, or an EC2 shape nobody sells as a managed runner.
  • Your cache is the bottleneck and you would rather it lived in your own S3 bucket, unlimited and free to transfer inside the VPC, than in a 25 GB weekly allowance.
  • Your project is nonprofit, open-source or educational, where the license is free and the only cost is your AWS bill.

When to choose Blacksmith

  • You want zero infrastructure. No AWS account, no quotas, no stack upgrades, no spot interruptions to reason about.
  • You need macOS or Windows from the same vendor as your Linux runners. RunsOn documents that macOS is not yet supported.
  • Your volume is modest. 3,000 free minutes a month plus $0.004 after that beats a 350 dollar annual commitment until you are running a few thousand minutes every month.
  • You want arm64 cheaply at $0.0025 a minute without choosing an instance family.
  • You would rather the vendor got paged than your platform team.

Switching: the exact diff

Both are label changes, and the labels look nothing alike. Blacksmith names a size; RunsOn encodes the runner definition in the label itself under Flex, or points at a Terraform-managed fleet under Fleet. The RunsOn edit is preceded by a stack install in AWS, which is the part that takes an afternoon rather than a minute.

.github/workflows/ci.yml
 jobs:
   test:
-    runs-on: ubuntu-latest
+    runs-on: blacksmith-4vcpu-ubuntu-2404

   build:
-    runs-on: ubuntu-latest
+    runs-on: runs-on=${{ github.run_id }}/runner=4cpu-linux-x64

   build-fleet:
-    runs-on: ubuntu-latest
+    runs-on: runs-on/fleet=linux-small/env=production

The verdict

On compute alone RunsOn wins this comfortably, because spot EC2 at RunsOn's own published figures is a fraction of any managed per-minute rate and the license does not grow with your minutes. That result is only available to a team that wants to own an AWS account, its quotas, its upgrades and its security boundary, and the moment nobody wants to own those things the calculation inverts: Blacksmith is a GitHub App and a label, it has macOS and Windows where RunsOn has neither, and its 3,000 free minutes cover a small team outright. The honest split is volume and appetite. High volume with a platform team goes to RunsOn; modest volume, or a team that would rather ship than operate, goes to Blacksmith. Neither repairs the job that failed for a mechanical reason, and on RunsOn that failure hides inside an EC2 invoice instead of a runner one.

Frequently asked questions

What is RunsOn and where do the runners run?
RunsOn is a self-hosted runner platform you install into your own AWS account. It provisions ephemeral EC2 instances per job, on spot with automatic on-demand fallback, across Linux x64 and arm64, Windows and GPU shapes, on any EC2 type your account quotas allow. The jobs run in your VPC, the instances terminate after the job, and AWS bills you directly with no markup from RunsOn, which charges a flat annual license instead.
Is RunsOn cheaper than Blacksmith?
On Linux compute, by a wide margin: RunsOn publishes $0.0010 a minute at spot for a 2 vCPU instance including its root volume, against Blacksmith's $0.004. On a month of 10,000 Linux minutes that is roughly $10 plus $29 of amortized license against $28 after Blacksmith's free minutes, so the gap only opens up at volume. Add your own NAT, S3 and on-demand fallback before treating the published figure as your bill.
Does RunsOn support macOS runners?
Not yet. Its runner documentation states that RunsOn covers Linux x64 and arm64, Windows and GPU, and that macOS is not yet supported. That matters for anyone with an iOS pipeline, because those jobs stay on GitHub-hosted at $0.062 a minute or move to a vendor that sells macOS, such as Blacksmith at $0.08 a minute on M4.
What do I still have to operate with RunsOn?
The AWS account and everything in it: the CloudFormation stack and its upgrades, EC2 service quotas, spot capacity and the on-demand fallback, the S3 bucket behind Magic Cache, networking if you want static egress IPs, and custom AMIs if the stock images do not fit. RunsOn ships CloudWatch and OpenTelemetry hooks because you are the one monitoring it. That work is the difference between its compute price and a managed rate.

Related guides

References

RunsOn is cheaper per minute if you want to own the AWS account. Latchkey is $0.0025/min at 2 vCPU with nothing to operate. Start free → 30-day trial · No credit card