Semaphore vs GitHub Actions: A Platform Swap, Not a Runner Swap
Semaphore is a full CI platform, not a drop-in runner. Its x64 rate is higher than GitHub-hosted list; its arm64 rate is 40% lower. Neither is why you would move.
Semaphore brings its own pipeline definition, orchestrator, and UI. Adopting it means rewriting workflows, migrating secrets, and repointing required status checks, which puts it in a different category from the runs-on swap that a managed runner represents.
Its published rates are also not a straightforward win: Ubuntu x64 at 2 vCPU is $0.0075/min against GitHub-hosted $0.006, so on x64 it is more expensive per minute. Ubuntu ARM at $0.003/min is 40% cheaper than GitHub-hosted arm64.
Standard GitHub-hosted runners are free and unlimited on public repositories, and public repos get 4 vCPU and 16 GB rather than the 2 vCPU and 8 GB private repositories receive. No paid runner beats free, so everything below assumes a private repository past its included minutes.
Published rates and limits
| GitHub Actions | Semaphore | |
|---|---|---|
| Ubuntu x64, 2 vCPU | $0.006/min | $0.0075/min |
| Ubuntu x64, 4 vCPU | $0.012/min | $0.015/min |
| Ubuntu ARM, 2 vCPU | $0.005/min | $0.003/min |
| Ubuntu ARM, 8 vCPU | $0.014/min | $0.012/min |
| macOS | $0.062/min (3-4 core) | $0.09/min (4 vCPU) |
| Self-hosted | Free, you run the agent | $0.0025/min, any machine |
| Free tier | 2,000-50,000 min by plan | $15 credits/month |
| Cache | 10 GB per repository | 9.6 GB per project |
| Concurrency | By plan | 20 concurrent jobs |
| Adoption cost | n/a | Rewrite pipelines and migrate checks |
The self-hosted rate is the interesting number
Semaphore charges $0.0025/min for a self-hosted agent on any machine you supply. That is a control-plane fee comparable to WarpBuild BYOC, and for a team that already runs its own infrastructure it undercuts every fully managed rate here while keeping a hosted orchestrator.
What a platform migration actually costs
- Pipeline syntax is the visible part and the smallest part of the work.
- Secrets, OIDC trust relationships, and deploy credentials must be recreated and re-approved, frequently by a different team.
- Required status checks reference check names; renaming them mid-migration blocks merges until branch protection is updated.
- Run both platforms in parallel on the same commits until the new one has been green for a full sprint. Cutting over after one green run is how migrations get reverted.
How to evaluate a managed runner honestly
Runner vendors compete on a headline per-minute rate, and the rate is rarely what decides the bill. Measure the whole job, on your own pipeline, before committing.
- Compare at equal machine shape. A cheaper per-minute rate on fewer vCPUs or less RAM is not cheaper per unit of work.
- Check billing granularity. Per-minute rounding costs real money on a wide matrix of short jobs; per-second does not.
- Include queue and boot time. A runner that is cheaper per minute but slower to start can cost more per merge.
- Count your re-runs. If a meaningful share of your runs are retries of a failed job, you are paying for the same work twice at whatever rate you negotiated, and no rate card prices that.
- Verify the free tier is recurring. A one-time credit is not a free tier.
The verdict
Staying on GitHub Actions and wanting cheaper or faster compute: this is the wrong page. A managed runner is a one-line change; Semaphore is a platform migration.
Genuinely evaluating a platform move: judge it on orchestration, UI, and support, because the per-minute comparison is a wash at best and unfavourable on x64.
ARM-heavy or self-hosted-capable: Semaphore ARM at $0.003/min and self-hosted at $0.0025/min are competitive numbers, and the strongest financial case for it.