CI runners / Benchmarks

10 open‑source projects, timed on four platforms.

GitHub-hosted runners, Blacksmith, Vercel CI and boxd, every machine 2 vCPU. The same commands on each, timed from the push to a green check.

GitHub and Blacksmith as one job, Vercel CI as one task. boxd sharded, as it always runs.

Django19,899 tests
GitHub
12m 54s
Blacksmith
8m 35s
Vercel CI
11m 06s
boxd ×8
65s

boxd vs12× faster8× faster10× faster

Prettier102,413 tests
GitHub
9m 38s
Blacksmith
7m 47s
Vercel CI
6m 22s
boxd ×16
55s

boxd vs11× faster8× faster7× faster

GitHub CLI8,445 tests
GitHub
2m 10s
Blacksmith
5m 53s
Vercel CI
11m 40s
boxd ×8
18s

boxd vs7× faster20× faster39× faster

ripgrep1,222 tests
GitHub
73s
Blacksmith
56s
Vercel CI
73s
boxd ×8
11s

boxd vs7× faster5× faster7× faster

Excalidraw2,456 tests
GitHub
9m 48s
Blacksmith
8m 20s
Vercel CI
8m 48s
boxd ×32
89s

boxd vs7× faster6× faster6× faster

React6,990 tests
GitHub
13m 03s
Blacksmith
11m 05s
Vercel CI
15m+
boxd ×32
2m 08s

boxd vs6× faster5× fasterover 7× faster

Vue3,765 tests
GitHub
2m 32s
Blacksmith
2m 13s
Vercel CI
3m 13s
boxd ×8
25s

boxd vs6× faster5× faster8× faster

Pydantic13,509 tests
GitHub
2m 35s
Blacksmith
2m 47s
Vercel CI
2m 49s
boxd ×8
29s

boxd vs5× faster6× faster6× faster

Zod8,320 tests
GitHub
4m 54s
Blacksmith
3m 10s
Vercel CI
4m 59s
boxd ×8
72s

boxd vs4.1× faster2.6× faster4.2× faster

Svelte7,879 tests
GitHub
6m 24s
Blacksmith
5m 02s
Vercel CI
8m 53s
boxd ×8
2m 36s

boxd vs2.5× faster1.9× faster3.4× faster

Each project on its own scale. Times from the push to a green check, medians of the measured runs. ×N is the shard count. 15m+ never finished within Vercel CI's 15-minute task limit. Prettier's Vercel CI tasks for its memory-heavy suite had 4 CPUs.

The medians

6×
faster than one job on a GitHub-hosted runner
5×
faster than one job on a Blacksmith runner
7×
faster than one task on Vercel CI
3×
faster than the same shards on GitHub-hosted runners
2×
faster than the same shards on Blacksmith
2×
faster than the same shards on Vercel CI

Every number

Medians, from the push to a green check. ×N is the number of test shards.

GitHub-hostedBlacksmithVercel CIboxd
ProjectTestsOne jobShardedOne jobShardedOne taskShardedSharded
Django19,89912m 54s3m 06s×88m 35s2m 08s×811m 06s2m 46s×865s×8
Prettier102,4139m 38s2m 36s×167m 47s2m 05s×166m 22s2m 09s×1655s×16
GitHub CLI8,4452m 10s2m 02s×85m 53s1m 49s×811m 40s4m 21s×818s×8
ripgrep1,22273s2m 09s×856s65s×873s81s×811s×8
Excalidraw2,4569m 48s2m 39s×168m 20s2m 13s×168m 48s1m 54s×3289s×32
React6,99013m 03s3m 33s×1611m 05s2m 56s×1615m+4m 17s×322m 08s×32
Vue3,7652m 32s86s×82m 13s80s×83m 13s1m 43s×825s×8
Pydantic13,5092m 35s1m 58s×82m 47s86s×82m 49s73s×829s×8
Zod8,3204m 54s2m 06s×83m 10s2m 19s×84m 59s2m 26s×872s×8
Svelte7,8796m 24s3m 38s×85m 02s2m 30s×88m 53s4m 41s×82m 36s×8

15m+ is a run that never finished, because Vercel CI stops a task after 15 minutes. Prettier's Vercel CI tasks that run its patterns-dirs suite had 4 CPUs and 8 GB, because 4 GB ran out of memory.

How we measured it

Benchmark setup

Each project's Linux lint, format, typecheck and unit tests, with the same commands on every platform, timed from a push to main until the check turns green.

Full method and costs
Projects
10, at their 8 Oct commit
Machines
2 vCPU on every platform
Each number
Median of 2 or 3 runs
01
GitHub-hosted
2 vCPU, 8 GB

ubuntu-latest, as one job or one job per shard, each restoring its dependency cache.

02
Blacksmith
2 vCPU, 8 GB

The same workflows with only the runner label changed, on Blacksmith's cache. Sticky disks were left out.

03
Vercel CI
2 CPUs, 4 GB

The same commands as Turborepo tasks after one shared install: one task, or a checks task plus one per shard. Each push changed a file every task hashes, so every task ran.

04
boxd
2 vCPU, 8 GiB

One machine per test shard, created from main's last green snapshot with dependencies and build caches on disk.

05
Trigger
Push to main

No code change, the steady state between merges. GitHub and boxd ran on 8 Oct 2026, Blacksmith and Vercel CI on 28 Oct.

Fine print

Caveats

We pushed commits with no code change.

That's boxd's best case, because everything in the snapshot is still valid. On a real change boxd redoes part of its lint, typecheck and build work, so expect a smaller gap.

GitHub CLI's tests are mostly skipped.

Go skips tests whose code didn't change. boxd skipped almost all of them, GitHub 216 of 250, Blacksmith and Vercel CI none, which is why their single jobs are the slowest there.

Blacksmith's times vary a lot.

The same React job took 9 to 16 minutes across three runs, so we show medians.

Vercel CI caches whole tasks.

On a commit that changes no file it restores every task and is green in about 25 seconds. Any code change reruns every task in these setups, and that's what we timed.

Vercel CI stops a task after 15 minutes.

React's one task hit that limit every time, so it shows as 15m+. Prettier's memory-heavy test suite ran on 4 CPUs and 8 GB there, because 4 GB ran out.

Start nowRead the guide