The short answer
For most solo developers and small teams, GitHub Actions on the free or Team plan is the easiest default: your repo, your CI, one bill. Stay there until you either (a) start shipping a macOS or iOS app, (b) push past roughly 15,000–20,000 build minutes a month, or (c) run jobs that need your own hardware (GPU builds, large integration suites, regulated workloads). At that point, self-hosted runners or a non-GitHub CI service start to earn their keep.
Why the choice matters before you scale
CI is one of those tools you barely notice when it works and absolutely notice when it doesn’t. As an indie founder, your CI bill is doing real work for you — it catches broken deploys, runs your test suite on every pull request, and ships releases so you can stay focused on customers. Picking the wrong service rarely breaks the build; it just slowly eats margin as your team, traffic and build minutes grow.
Two questions drive almost every CI decision for a small team:
- Will I run anything that needs macOS? If yes, plan for it now. macOS minutes cost roughly ten times a Linux minute on GitHub-hosted runners.
- Will my build minutes roughly double in the next 12 months? If yes, you should design for self-hosting from day one, even if you start on hosted.
What the GitHub Actions free tier actually gives you in 2026
GitHub’s hosted runner prices dropped on January 1, 2026, by up to 39%. The proposed $0.002/minute platform fee for self-hosted runners — announced in December 2025 and widely reported — was postponed within 48 hours after community pushback and has not been billed as of mid-2026. Treat that postponement as a planning opportunity, not a permanent guarantee.
For private repositories:
- Free plan: 2,000 Linux minutes/month, 500 MB artifact storage.
- Team plan ($4/user/month): 3,000 Linux minutes/month, 2 GB storage.
- Enterprise ($21/user/month): 50,000 Linux minutes/month, 50 GB storage.
For public repositories, hosted runners remain free and unlimited on every plan. That single fact is the reason so many indie devs default to GitHub Actions — open source work and side projects essentially run on the house.
When you exceed the free allowance, current per-minute rates for hosted runners are roughly:
- Linux (Ubuntu): about $0.006/min on the 2-core tier.
- Windows: about $0.010/min.
- macOS: about $0.062/min.
These are meter prices after the January 2026 cut. They may evolve, so verify against GitHub’s published pricing before you commit to a budget model.
Real monthly cost for small teams (estimates)
These are realistic order-of-magnitude numbers, not promises. They assume Linux 2-core hosted runners at the post-cut rate, the Team plan, and around 21 working days per month.
- Solo developer, ~1,000 Linux minutes/month: roughly $0 — sits inside the 2,000-minute free tier.
- 5-person team, ~15,000 minutes, mostly Linux, some Windows: roughly $70–$80/month once free minutes are used.
- 10-person team, ~30,000 minutes, mixed Linux/Windows/macOS: roughly $300–$350/month.
- 50-person org, ~150,000 minutes with macOS in the mix: roughly $1,300–$1,400/month, which is usually the inflection point where self-hosting pays off.
The single biggest variable in those numbers is macOS. A 15-minute iOS build that runs 50 times a day on hosted macOS can cost more per month than several engineers’ hosted Linux combined.
Hosted GitHub Actions vs. self-hosted runners: the honest trade-off
Hosted runners are the easy button. GitHub provisions a fresh VM for each job, you don’t manage the box, and you only pay for the minutes you use. For a solo developer or a team of three, this is almost always the right call — your time is worth more than the few dollars of compute you save by self-hosting.
Self-hosted runners start to win when one or more of these is true:
- Your bill is climbing toward several hundred dollars a month and the workload is steady enough to keep a machine busy.
- You need specialized hardware — a beefier CPU, a GPU, more RAM, an Apple Silicon box for fast macOS builds.
- Cold starts are killing you. A warm self-hosted runner can begin a job in seconds, while hosted runners typically queue for 10–30 seconds while a fresh VM boots.
- You have jobs that touch sensitive data — secrets, regulated workloads, on-prem integrations — that shouldn’t leave your network.
The trade-offs are real and worth naming:
- You own the box. Patching, security updates, disk cleanup, Docker version churn — that’s on you.
- Autoscaling is harder. A hosted runner pool scales with you on a busy day. A self-hosted runner is a fixed resource unless you stand up something like Actions Runner Controller (ARC) or another autoscaler.
- Runner version hygiene matters. Self-hosted runners must be on v2.329.0 or later to register going forward (a hard cutoff that landed in March 2026). Pin your runner versions and have an upgrade runbook.
For a solo founder, the simplest self-hosting pattern is a single small VPS (the kind you’d use for staging) that runs the runner, with a queue of 1–2 jobs at a time. That covers most side projects and keeps your CI bill near zero while you stay elastic on hosted runners for spiky workloads.
Cold-start speed: the hidden cost of hosted runners
This is the underrated factor. Hosted runners spin up a new VM per job. For a 30-second lint job, that overhead is most of your bill and most of your wait. Self-hosted runners that stay warm respond in seconds, which matters more than people expect for PR feedback loops.
Practical fixes without leaving hosted runners:
- Cache aggressively — package managers (npm, pip, Gradle), Docker layers, and test fixtures. A six-minute install that becomes 30 seconds of cache restore is both faster and cheaper.
- Split small jobs from big jobs so lint and unit tests don’t queue behind a 20-minute release build.
- Use path filters so backend-only PRs don’t run the full frontend test matrix.
How to estimate your real monthly cost before you grow
A spreadsheet beats a calculator. Here’s the simple model that works for indie teams:
- Count your last 30 days of actual build minutes from your CI provider’s billing page, broken down by runner OS.
- Apply your current per-minute rate (and the macOS multiplier if applicable).
- Add 50% headroom for the next quarter’s growth — most teams underestimate how fast CI usage scales when they start shipping more frequently.
- Subtract your free allowance based on your plan.
- Compare that number to the cost of one always-on small VPS (often $10–$25/month) plus the engineering time to keep a self-hosted runner healthy.
If the self-hosted number wins by a clear margin and stays winning after you add 2–3× growth, self-hosting is worth it. If it’s a tie or close to a tie, stay hosted — your time is the more expensive line item.
When an alternative CI service makes more sense
GitHub Actions isn’t the only answer, and for some teams it isn’t even the best one. Common reasons to look elsewhere:
- You need faster builds on heavy monorepos. Some CI services offer more aggressive caching and better build farm topology out of the box.
- You’re already paying for another platform. If your team lives in GitLab or uses Bitbucket, the bundled CI may be cheaper than adding GitHub Actions on top.
- You ship iOS apps and macOS minutes are a budget killer. Some services offer Apple Silicon hosted runners at lower per-minute rates than GitHub, or bundle macOS into a flat subscription.
- You need compliance features GitHub doesn’t expose cleanly — audit logs, BYOK encryption, regional pinning.
The decision is rarely brand-versus-brand — it’s usually a fit question: does this service match the shape of your workload, your security needs and your team’s existing tools.
A simple decision framework
- Solo or 1–3 devs, mostly web, mostly Linux, < 5,000 min/month: stay on GitHub Actions free or Team. Don’t overthink it.
- Small team, mixed workloads, approaching 15,000 min/month: start caching aggressively, split jobs, and model your bill monthly. You’re in the “watch closely” zone.
- Mid-size team or any iOS/macOS work at scale: run a hybrid — hosted runners for spiky PR checks, self-hosted runners for predictable heavy jobs (release builds, integration suites, macOS). Budget for both.
- Regulated workloads or hardware you can’t get hosted: self-hosted only, with autoscaling and version pinning in place from day one.
FAQ
Is GitHub Actions actually free for private repos?
It includes a monthly free allowance (2,000 minutes on the Free plan, 3,000 on Team), and public repositories are unlimited. Once you exceed the allowance you pay per minute, so “free” really means “free up to a point.”
Will GitHub start charging for self-hosted runners?
A $0.002/minute platform fee for self-hosted runners was announced in December 2025 and postponed within 48 hours after community feedback. It has not been billed as of mid-2026. Plan as if it could return, but don’t pay it yet.
How many build minutes does a typical solo project use?
Most solo projects comfortably fit inside the 2,000-minute free tier. The crossover usually happens when you add comprehensive integration tests or a release pipeline that runs on every tag.
When is self-hosting actually worth it?
When your hosted bill is consistently several hundred dollars a month, when you need specialized hardware (Apple Silicon, GPUs, large memory), or when warm cold-starts meaningfully affect your developer experience.
Sources
- https://www.cicdcost.com/github-actions-pricing
- https://web.archive.org/web/20260319151853/https://github.blog/changelog/2025-12-16-coming-soon-simpler-pricing-and-a-better-experience-for-github-actions
- https://cicdcalculator.com/github-actions
- https://www.buildmvpfast.com/tools/api-pricing-estimator/github-actions
- https://theplatformengineering.substack.com/p/github-actions-2026-pricing-changes
- https://bybowu.com/news/github-actions-pricing-2026-the-practical-playbook







