A Cirrus Runners alternative for macOS GitHub Actions
Cirrus Runners popularised flat-rate Apple Silicon runners for GitHub Actions. Their site currently announces that Cirrus Labs is joining OpenAI. If you are planning what happens to your macOS lanes, this page maps the pieces that matter. Cirrus numbers are taken from their pricing page at the time of writing.
| Cirrus Runners (macOS) | Manzanita Standard | Manzanita XL | |
|---|---|---|---|
| Price | $150 / month / runner, unlimited minutes | $149 / month / runner, unlimited minutes | $299 / month / runner, unlimited minutes |
| Profile | 4 M4 Pro vCPU · 16 GB | 6 M4 Pro vCPU · 22 GB | 12 M4 Pro vCPU · 44 GB (full host) |
| Label | ghcr.io/cirruslabs/macos-runner:tahoe | manzanita-standard | manzanita-xl |
| Xcode | Image tag per macOS release | Xcode 26.6 on macOS 26.6.2, digest-pinned; manzanita-xcode16 for Xcode 16.4 | Same image as Standard |
| Low-priority lane | low-priority label | Not yet. Jobs above your concurrency queue in GitHub in order | |
| Linux / GPU runners | Yes | No. Manzanita is macOS only | |
| Annual discount | 15 % | Monthly only during the pilot | |
| Trial | Free trial | 14 days or 300 minutes, no card | |
Label mapping
- runs-on: ghcr.io/cirruslabs/macos-runner:tahoe
+ runs-on: manzanita-standard
- runs-on: [ "ghcr.io/cirruslabs/macos-runner:tahoe", "low-priority" ]
+ runs-on: manzanita-standard
If a lane still needs Xcode 16.4, use manzanita-xcode16 (macOS 15.7.7). If a job is memory-bound or builds a large universal binary, use manzanita-xl, which takes the whole host.
What changes in practice
- Per-runner concurrency is the same idea. One Manzanita runner runs one job at a time; buy two for two parallel jobs. The dashboard shows queue time behind your own concurrency separately from VM start time.
- Image contract is explicit. Every image has an ID, a digest, and a machine-readable manifest; the dashboard footer shows the digest your jobs ran on. See the changelog.
- Two-hour job cap. Split longer workflows into dependent jobs.
- No code signing in the pilot. Keep signing and notarization on a protected runner for now.
- Caching is
actions/cache. Nothing vendor-specific. Snippet in the SwiftPM caching guide.
Migration order that has worked
- Install the GitHub App on one repository and enable it in the dashboard.
- Add
${{ vars.MACOS_RUNNER || 'ghcr.io/cirruslabs/macos-runner:tahoe' }}as the label and set the variable tomanzanita-standardon a branch. - Compare wall-clock time on the Jobs page against the same workflow on Cirrus. Both are in GitHub's run history.
- Move the remaining repositories and remove the variable indirection once you are done.
Migrating a fleet of repositories and want us to look at the workflows first? Email hello@manzanita.run with the repository list.
Try it on your own workflow. One Standard runner is free for 14 days or 300 build minutes, no card. Change
runs-on to manzanita-standard and keep everything else. Start free · Read the docs