
Our monorepo has been growing quickly: more packages, more contributors, more history, and, unsurprisingly, more CI jobs. At some point, I noticed we were spending a surprising amount of time before those jobs did any actual work. The culprit was checkout.
We already run most of our CI on Blacksmith runners, and they ship useblacksmith/checkout, a drop-in replacement for actions/checkout built on top of their sticky disks. Switching to it was a one-line diff per workflow, so we rolled it out in a single pull request.
Mean checkout time went from ~69 seconds to ~20 seconds—about 33 hours of runner time reclaimed each weekday. 🔥
In a monorepo, checkout gets more expensive in two ways. The repository itself gets heavier: more commits, more refs, and more objects to transfer on every clone. At the same time, the number of jobs grows through matrix builds, per-package pipelines, and deploy workflows.
We run roughly 4,800 jobs a day. Most checkouts were tolerable, but some took 2.5+ minutes before the job even started. Those were the ones people noticed.
useblacksmith/checkout is a fork of actions/checkout—same inputs, same behavior from your workflow's perspective—except it doesn't clone from GitHub on every run.
Instead, it keeps a persistent git mirror of your repository on a sticky disk, a disk that survives between workflow runs and gets mounted into your runner:
git fetch --prune, transferring only the commits and refs that are new since the last run.actions/checkout behavior, so nothing blocks while the mirror warms up.The migration is straightforward:
- - uses: actions/checkout@v4
+ - uses: useblacksmith/checkout@v4
That's it. All the inputs (fetch-depth, submodules, token, and friends) work the same.
I pulled these numbers from real jobs on main after the change was merged. This isn't a controlled benchmark, but it reflects what developers actually experienced. I won't share the exact PR or project specifics because it's a private monorepo.
Checkout time across our Blacksmith jobs:
The p90 improvement matters more to me than the mean. A typical checkout being faster is nice, but the two-and-a-half-minute checkouts were the ones people actually noticed. Those now take about a minute.
For the Blacksmith-hosted jobs covered by this change, the aggregate savings are:
In dollars: at our smallest x64 runner rate ($0.004/min), that's about $176/month, or $8 every weekday. The sticky disk the mirror lives on costs $0.50/GB/month, and ours is 3.56 GB—so $1.78/month. Net: ~$174/month, ~$2,100/year.
And that's a conservative estimate because it only prices the checkout step itself. When we benchmarked the change in the original PR, whole jobs roughly halved. A faster checkout means the runner spends more of its billable time doing actual work instead of downloading git objects.
The dollars aren't really the point, though. Every PR and every deploy now gets faster feedback, and the improvement required very little migration work.
Not much to report, which is part of the appeal, but a few things worth knowing:
actions/checkout elsewhere.If you're already running CI on Blacksmith, yes. It's an easy change to test, the inputs are the same, and the fallback behavior kept the rollout low-risk for us.
If you're not using Blacksmith for CI yet, I think it's worth trying. We've had a good experience with it: the runners are faster, moving from GitHub-hosted runners is straightforward, and features like sticky disks unlock optimizations that would otherwise require more work.
For us, this was a small change with a surprisingly large cumulative impact. If checkout has become noticeable in your CI, it's probably worth measuring.

