Why we added Blacksmith to GitHub Actions: 1,527 jobs, performance, and cost

We do not force the same CI stack into client and internal environments. Many client pipelines begin in GitLab or CodeCommit and follow CodePipeline → CodeBuild → ECR/ECS or CodePipeline → CodeBuild → CodeDeploy/EC2. Keeping source, IAM, network access, and deployment history inside AWS is often the point.
Applications built by 801 PLANET start elsewhere: GitHub → GitHub Actions → Blacksmith → ECR/ECS. GitHub Actions remains the workflow control plane; Blacksmith executes the jobs. AWS access comes from short-lived GitHub OIDC credentials rather than long-lived access keys.1
This is not a recommendation to standardize every environment on Blacksmith. It records what we observed in a real account, how much support the public performance claims have, and where CodeBuild or a self-managed BuildKit service becomes the better choice. The supplied Findy Tools review is members-only beyond its title and public author information, so we did not use it as quantitative evidence.2
Both paths deploy to AWS, but their control planes differ. In the upper lane, CodePipeline accepts changes from GitLab or CodeCommit and invokes CodeBuild. The container branch pushes an image to ECR for ECS to pull, while the instance branch hands the release to CodeDeploy and EC2.

In the lower lane, GitHub Actions controls the workflow and Blacksmith executes the BuildKit job. Docker layers are reused from cache close to the runner. GitHub OIDC assumes a short-lived IAM role, the image is pushed to ECR, and ECS pulls that image. The bars on the right show the compressed ECR sizes of four images checked under the same commit tag.
The two pipelines start from different constraints
| Area | Common client configuration | 801 PLANET applications |
|---|---|---|
| Source and control plane | GitLab or CodeCommit + CodePipeline | GitHub + GitHub Actions |
| Build execution | AWS CodeBuild | Blacksmith managed runners |
| Image and deployment | ECR → ECS or CodeDeploy → EC2 | ECR → ECS |
| Identity boundary | CodeBuild service role and AWS IAM | GitHub OIDC assumes an AWS role |
| Primary constraint | Control and audit inside the VPC and AWS account | GitHub developer flow, fast feedback, no runner operations |
Blacksmith does not replace GitHub Actions as a CI product. It keeps GitHub workflows and actions, then changes the runs-on target to a Blacksmith runner. The official quickstart also says that Blacksmith is limited to GitHub organizations and is unavailable for personal repositories.3
runs-on: blacksmith-2vcpu-ubuntu-2404
The small migration surface is valuable. It disappears when GitLab or CodeCommit is the source of truth. In those environments, CodeBuild or an existing GitLab Runner usually leaves a simpler configuration and audit path.
What six months of production data tells us
From January 23 to July 23, 2026, the unfiltered organization view in Blacksmith CI Analytics recorded 1,527 jobs. Median job duration was 255 seconds, or 4m 15s. The p90 was 5m 40s, p95 6m 46s, p99 12m 45s, and maximum 27m 22s.

This screen cannot prove that Blacksmith made us a specific multiple faster. We did not preserve an equivalent pre-migration baseline that reran the same commits on GitHub-hosted runners. The 13.75% failure rate is not a Blacksmith incident rate, either. It combines failed tests, application errors, workflow mistakes, and deliberate failures across the organization. It is an operational signal for finding the repositories and jobs to fix.
Over the same selected period, Docker Analytics recorded 1,487 builds, a 9.28% failure rate, and 14.8 GB of average cache use. Most builds clustered under one minute, with a long tail extending to roughly seven minutes.

Blacksmith's dashboard breaks down job duration, failure rate, caches, and repository cost in one place.4 It makes long p95 and p99 jobs and repositories with expanding caches easier to find than workflow logs alone. For us, observability was part of the managed-runner decision rather than a cosmetic add-on.
Three levels of evidence behind the speed claims
"Up to 40x faster Docker builds" is not a guarantee for every workload. Blacksmith's documentation describes it as a 2x to 40x improvement reported by customers.5 Separating the test conditions and source incentives produces a more useful picture.
| Source | Published result | How we use it |
|---|---|---|
| Blacksmith cache engineering post | A 114 MB cache download rose from 49.8 MB/s to 327.5 MB/s | About 6.6x in one example. It shows the effect of co-locating runners and cache, but it is vendor data.6 |
| Agentgateway field report | An E2E job fell from 10–11 minutes to 2–3 minutes | About 3–5x. It is an independent report, with disclosure that Blacksmith sponsors the open-source project.7 |
| Self-managed remote BuildKit | Six Go services fell from about 2 minutes to 10–17 seconds | Persistent caching can be reproduced. A large Node image in the same test became about three minutes slower because of --load transfer.8 |
| 801 PLANET account | 4m 15s median and 1,487 Docker builds | It describes steady-state operation. We do not calculate an improvement without a pre-migration baseline. |
The shared mechanism is straightforward. When an ephemeral runner disappears, BuildKit's workspace and the dependency caches created by RUN --mount=type=cache disappear with it. Blacksmith persists repository-scoped Docker layers and makes them available to later runners. A self-managed version requires a remote buildkitd, persistent storage, garbage collection, concurrency control, isolation, and recovery.
The gain can be large when cache reuse and single-core CPU performance dominate. It may be small or negative when a workflow spends its time loading a large image back into the runner with --load, transferring to a remote registry, or waiting on integration tests. Compare p50, p95, cache hit rate, and cost per successful job on the same commits, not the largest marketing multiple.
Final image size belongs in the runner comparison
The four final images in ECR ranged from 79.9 to 330.5 MB compressed. The files and production dependencies retained in each runner stage explain most of that spread.
On July 23, 2026, we queried four internal ECR repositories in the Seoul region with read-only access. We inspected DescribeImages.imageSizeInBytes and the OCI manifest layer list for the same commit tag in every repository. Account IDs and repository names remain private. These are compressed registry sizes, not the uncompressed number shown by local docker images or the disk footprint of a running container.9
| Final image role | Main content retained in the runner stage | Compressed ECR size | Layers | Largest compressed layer |
|---|---|---|---|---|
| Web | Next.js standalone, public, and static output | 81.3 MB | 10 | 41.4 MB |
| API | Production dependencies, NestJS dist, and Prisma | 245.2 MB | 17 | 114.6 MB |
| Single-JS runtime | Node.js runtime and dist/main.js | 79.9 MB | 7 | 49.9 MB |
| Automation orchestrator | Production dependencies plus Temporal and database workspace output | 330.5 MB | 20 | 192.3 MB |
All four Dockerfiles use multi-stage builds. They copy the lockfile and workspace package.json files before source code, then run pnpm install. That ordering lets an application-only change reuse the dependency layer. The root .dockerignore also removes node_modules, existing dist and .next output, infrastructure code, documentation, and .github from the build context. Docker recommends the same pattern: put expensive, stable steps early and keep the context small.10
The final runner stage determines the result. The web image copies Next.js standalone and static output and weighs 81.3 MB. The API keeps production dependencies, compiled output, and Prisma files and reaches 245.2 MB. The single-JS image adds only dist/main.js to the Node.js runtime and weighs 79.9 MB. The orchestrator retains production dependencies and outputs from its Temporal and database workspaces and reaches 330.5 MB. Multi-stage builds exclude builder tooling in every case, yet the runtime boundary still creates a spread of more than 4x.11
Our workflows use docker/build-push-action with push: true, sending the result directly to ECR instead of loading a large image back into the runner with --load. A dependency change can still invalidate and transfer a layer larger than 100 MB. A nearby Blacksmith cache cannot repair poor application-layer boundaries or shrink a heavy runtime image.
Runner time alone is not enough for the pilot. Alongside cold- and warm-cache duration for the same commits, record compressed ECR size, the largest changed layer, push time, and time until the new ECS task becomes ready. A fast cache and a small deployable image answer different questions.
Separate unit-rate math from the invoice
As of July 23, 2026, a standard GitHub-hosted Linux 2-core runner is $0.006 per minute, while a Blacksmith Ubuntu x64 2 vCPU runner is $0.004 per minute.1213 The AWS CodeBuild pricing example uses $0.005 per minute for general1.small.14
If the same 10,000 billed minutes were charged before plan allowances, cache, and logging, the compute-only comparison would look like this:
| Execution layer | Published rate | Compute for 10,000 minutes | Additional considerations |
|---|---|---|---|
| GitHub-hosted Linux 2-core | $0.006/min | $60 | Plan-included minutes, Actions cache and artifact storage |
| Blacksmith Ubuntu x64 2 vCPU | $0.004/min | $40 | Docker layer cache at $0.50/GB-month; static IP at $100/IP-month |
CodeBuild general1.small example | $0.005/min | $50 | 100 free minutes; CloudWatch Logs, S3, KMS, and CodePipeline |
This isolates rate cards; it is not a TCO ranking. CPU generation, memory, minute rounding, actual runtime, network, and cache behavior differ. CodeBuild also offers a Docker image server with a shared layer cache, billed while the server runs and at a lower cache-at-rest rate during cooldown.14 At Blacksmith's current cache price, the observed 14.8 GB average is a simple $7.40 per month equivalent.
Our invoices were smaller. From March through July 2026, the five charges were $4.31, $6.26, $22.13, $4.65, and $9.97. They total $47.32, or $9.46 per month on average.

The invoice window covers March through July, while Analytics covers January through July. The periods do not match. Median duration is not mean duration, so we also did not estimate total usage as 1,527 × 255 seconds. The defensible conclusion is limited: this was our actual spend at the current scale.
Where CodeBuild and Blacksmith diverge
| Decision factor | CodeBuild is the natural fit when | Blacksmith is the natural fit when |
|---|---|---|
| Source and workflow | GitLab, CodeCommit, and CodePipeline define the flow | A GitHub organization and GitHub Actions define the flow |
| AWS identity | A CodeBuild service role keeps control in the account | GitHub OIDC sub conditions scope access by repository and branch |
| Private networking | Builds need VPC access to RDS, internal ECS, or private repositories | External runners can deploy through OIDC and public AWS APIs |
| Docker cache | The team operates AWS cache or a Docker image server | The team wants repository-scoped persistent cache with managed runners |
| Operations | buildspec, IAM, CloudWatch, and CodePipeline form one operating model | Runner provisioning, disk, GC, and CI analytics belong with a provider |
| Governance | An AWS-only supplier boundary matters | A separate GitHub App and execution vendor can pass review |
CodeBuild projects can attach a VPC ID, subnets, and security groups to reach private RDS, ElastiCache, internal ECS, and private artifact repositories.15 Blacksmith offers a dedicated static egress IP, but the current public rate is $100 per IP each month.16 When private network access is mandatory, network design and security review should precede runner-minute math.
Blacksmith's security page states SOC 2 Type 2 and GDPR compliance, ISO 27001 data centers, and a fresh Firecracker microVM per job. Its GitHub App requests permissions needed to edit workflows and mint JIT runner tokens.17 Those claims are inputs to a vendor review, not a replacement for one.
Why Blacksmith fit our own stack
Our code review and source flow already live in GitHub, and we frequently build Docker images for ECR and ECS. For a small team, buying a managed execution layer was more sensible than operating Actions Runner Controller or an EC2 runner pool, including scaling, patching, disks, and BuildKit garbage collection. GitHub OIDC opens AWS access briefly, with role sub conditions tied to the repository and branch.
That choice does not put Blacksmith into every client pipeline. We keep CodePipeline and CodeBuild where GitLab, CodeCommit, private VPC access, and AWS service roles define the environment. The opposite design — bringing source and build fully inside a private platform — appears in our NKS modernization pipeline with GitLab and Jenkins.
Blacksmith fit our stack for three reasons: it retained the GitHub Actions files, removed Docker cache operations, and put jobs, caches, failures, and cost in one dashboard. Six months of data shows that this configuration runs in production. It does not prove a universal speed multiplier.
Run a two-week pilot before adopting it
- Select two Docker-heavy workflows and record baseline p50, p95, queue time, success rate, and monthly cost.
- Rerun the same commits on GitHub-hosted and Blacksmith runners, separating cold-cache and warm-cache results.
- Set a Docker cache ceiling with
max-cache-size-mb, then monitor cache hit rate and monthly GB together. Record compressed ECR size and the largest changed layer as well.5 - Review the AWS OIDC
audandsub, GitHub App permissions, pinned third-party actions, and static-IP requirements. - Do not assume a free allowance is a hard stop. Confirm budgets and shutdown behavior. A 2026 public account described receiving a $1,081 invoice after usage continued beyond the free allowance.18
Changing one workflow line is easy. The decision begins afterward. Measure whether reviewers wait less, and whether the cost of getting one successful change through CI without runner operations falls.
Frequently asked questions
What is Blacksmith
Blacksmith is a managed runner service for GitHub Actions. GitHub retains workflow control; Blacksmith supplies isolated execution, co-located dependency caching, persistent Docker layer caching, and CI Analytics. Teams adopt it by changing the runs-on label in workflows inside a GitHub organization.
Can Blacksmith replace AWS CodeBuild
Not universally. Blacksmith fits when GitHub Actions is the control plane and the team wants to remove runner operations. CodeBuild is usually simpler when GitLab or CodeCommit, CodePipeline, private VPC access, and AWS service roles define the system. They are execution layers attached to different control planes.
Can Blacksmith push images to ECR and deploy ECS
Yes. A GitHub Actions workflow assumes a narrowly scoped AWS IAM role through OIDC, then receives permissions to push to ECR and update ECS. Avoid long-lived AWS access keys in GitHub Secrets, and constrain the role's sub condition to approved repositories and branches.
Can a team reproduce Blacksmith's speed itself
The core mechanism is reproducible. A remote BuildKit daemon with persistent storage and nearby cache lets ephemeral runners reuse build state. The team then owns garbage collection, concurrent builds, isolation, patching, recovery, and cost visibility. Blacksmith's value is less the cache idea than operating that execution layer.
If you need to measure a GitHub CI bottleneck or draw the boundary between CodeBuild, managed runners, and self-managed BuildKit, our Cloud & Infrastructure work starts with the current workflow and AWS network. For the AWS-internal traffic path around ECR, continue with AWS's invisible costs.
References
We rechecked product behavior and pricing on July 23, 2026. The 801 PLANET figures come from the attached organization-wide dashboards and payment history. Repository-level source data and a pre-migration A/B baseline are outside this article.
Sources & notes18ExpandCollapse
Footnotes
-
GitHub Docs, Configuring OpenID Connect in Amazon Web Services. Assuming AWS roles without long-lived credentials and scoping
audandsub. ↩ -
Findy Tools, Blacksmith で手軽に GitHub Actions を高速化&コスト削減. Only the title and author are public; no gated quantitative claims were used. ↩
-
Blacksmith Docs, Quickstart. GitHub organization integration, runner-label migration, and organization-only limitation. ↩
-
Blacksmith Docs, CI Analytics. Job duration, failure rate, cache, and repository-cost views. ↩
-
Blacksmith Docs, 40x Faster Docker Builds. Repository Docker layer cache,
max-cache-size-mb, last-write-wins concurrency, seven-day inactive eviction, and $0.50/GB-month pricing. ↩ ↩2 -
Aaditya Sondhi, Blacksmith, Reverse engineering GitHub Actions cache to make it fast, July 23, 2025. Co-located MinIO cache and the 114 MB download comparison. ↩
-
John Howard, Fast GitHub Actions with Blacksmith, April 10, 2026. Agentgateway E2E before/after result and sponsorship disclosure. ↩
-
Javier Cabrera Arteaga, Remote buildkit agents to speed up Docker builds by 10 times, November 4, 2025. Persistent BuildKit experiment, Go improvement, and Node
--loadregression. ↩ -
AWS CLI, Amazon ECR
describe-images.imageSizeInBytesreports compressed registry size, which can be smaller than the uncompressed size shown by localdocker images. ↩ -
Docker Docs, Optimize cache usage in builds. Order expensive and stable steps first, copy package manifests before source, and keep the build context small. ↩
-
Docker Docs, Multi-stage builds. Copy only required artifacts from a builder stage into the final stage, leaving build tools and intermediate files behind. ↩
-
GitHub Docs, Actions runner pricing. Linux 2-core x64 per-minute rate. ↩
-
Blacksmith, Pricing. Ubuntu x64 2 vCPU rate, included minutes, cache, and static-IP add-ons. ↩
-
AWS, AWS CodeBuild pricing. On-demand minute billing, the
general1.smallexample, 100 free minutes, additional charges, and Docker image server. ↩ ↩2 -
AWS Docs, Use AWS CodeBuild with Amazon VPC. VPC, subnet, and security-group attachment for private resources. ↩
-
Blacksmith Docs, Static IP and Pricing. Organization-specific WireGuard tunnel and static-IP rate. ↩
-
Blacksmith, Secure GitHub Actions, updated August 8, 2025. GitHub App permissions, JIT token, Firecracker isolation, and compliance statements. ↩
-
Allen Pike, Forestwalk, Surprise! Pay $1000, June 8, 2026. A public account of continued usage and billing beyond the free allowance. ↩

