GitHub Actions is GitHub's built-in CI/CD system — it spins up a fresh virtual machine, runs whatever commands you tell it to, and tears the machine down when it's done. It supports Linux, Windows, and macOS runners. The macOS runners are the interesting part here, because they're actual macOS machines with Xcode's command-line build tools available, which means they can build and sign iOS apps — not just run tests.
The headline rule: public repos are free
On a public repository, standard GitHub-hosted runner minutes — including macOS — don't cost anything, on any plan, including the free plan. This has been true for a long time and, as of GitHub's 2026 pricing update, standard runner usage on public repos explicitly remains free. It's a genuine free tier, not a trial or a limited allowance that runs out.
One nuance worth knowing: this free-on-public-repos rule covers standard runners. GitHub also offers "larger runners" (more CPU/RAM, for heavier workloads) — those are billed regardless of whether the repo is public or private. A default macOS build for signing and archiving a typical app doesn't need a larger runner, so this rarely matters in practice, but it's the one exception to "public repo = free."
What changes on a private repo
If your repository is private, you get a monthly allowance of free minutes instead of unlimited free usage, and the size of that allowance depends on your GitHub plan:
| Plan | Included minutes / month |
|---|---|
| Free | 2,000 |
| Pro | 3,000 |
| Team | 3,000 |
The number that actually matters for iOS builds, though, is how fast macOS runners burn through that allowance — because they don't count as one minute per minute.
macOS minutes cost roughly 10x
GitHub prices runner minutes per-OS, and applies a multiplier against your included minutes: Linux runners run at the baseline rate, and macOS runners run at roughly 10x that rate. In practical terms, a 6-minute macOS build eats through the same allowance as roughly 60 minutes of Linux CI would.
Applied to the table above, that means a Free-plan private repo effectively gets around 200 macOS-runner-minutes worth of free build time per month before you're billed per minute past it (Pro/Team works out to roughly 300). For a single app with occasional releases, that can be enough — for anything with frequent CI runs, it goes fast.
The practical upshot: if you're fine building in the open, a public repo gets you unlimited macOS build minutes at zero cost, indefinitely. If you'd rather keep the code private, everything about the pipeline still works the same way — you're just drawing from a metered allowance instead of an unlimited one, and it still usually works out cheaper than a rented cloud Mac subscription. Repo visibility only changes CI minute pricing here; your signing certificates and credentials live in encrypted GitHub secrets either way, never exposed in the repo or logs regardless of visibility.
What this doesn't cover
Two things people sometimes assume are included but aren't:
- The Apple Developer Program fee. Still $99/year, paid directly to Apple, completely separate from anything GitHub does. Free build minutes remove the Mac requirement, not Apple's own membership fee.
- Storage and artifact retention. GitHub Actions has separate limits/pricing for storing build artifacts and logs long-term — not usually a concern for a simple build → sign → upload pipeline where nothing needs to stick around after it's uploaded to App Store Connect, but worth knowing it's a distinct line item if you're archiving builds for later.
Numbers and pricing tiers on GitHub's side can and do shift — this reflects GitHub's published billing documentation as of when this was written, so it's worth a quick check against GitHub's current billing docs if it's been a while.
Wired up correctly from the start
The Macless workflow file is built around the public-repo free tier by default, with the setup guide covering exactly what changes (and what it costs) if you need to go private. Same pipeline that shipped Citolex.
See what's included — $99