# Cirrus CI alternative for macOS: where those jobs go

> A Cirrus CI alternative for the macOS half of your pipeline, with every published GitHub Actions macOS shape and rate read on 2026-09-20.

Source: https://latchkey.dev/learn/runners/cirrus-ci-alternatives-for-macos  
Updated: 2026-09-20

The only Cirrus CI alternative question still open is the macOS one. Cirrus CI stopped running jobs on 1 June 2026 and Cirrus Runners is closed to new customers, and while the Linux half of a Cirrus pipeline has more destinations than you need at a tenth of the price, the macOS half is where the invoice lives. The disclosure that belongs at the top rather than the bottom: Latchkey has no macOS runner at any price, so it cannot take that half from you.

Two products ended on two timetables, and confusing them sends you to the wrong page. On 7 April 2026 Cirrus Labs announced it had agreed to join OpenAI as part of the Agent Infrastructure team. The same post says "Cirrus CI will shut down effective Monday, June 1, 2026", which is the hosted platform that reads your `.cirrus.yml`. Cirrus Runners, the separate product that attaches macOS and Linux runners to GitHub Actions, is "no longer accepting new customers" and is supported "for existing customers through their existing contract periods".

So a Cirrus CI user has already been cut off, and a Cirrus Runners user has until the contract ends. Either way the macOS jobs are the part worth pricing first, because GitHub lists $0.062 a minute for a 3-core or 4-core macOS runner against $0.006 for Linux 2-core x64, and rounds every job up to the whole minute on top. The step-by-step translation out of `.cirrus.yml` is in [migrate from Cirrus CI](/learn/runners/migrate-from-cirrus-ci); this page is only about where the macOS work lands.

Five vendors publish a macOS runner, a shape and a rate, and the table below is all five. Their machines are not the same machine, so the vCPU and memory sit next to the price.

## Which Cirrus product you are actually replacing

Cirrus CI was a platform: a `.cirrus.yml` in the repository, its own task graph, its own caches, its own artifacts. Replacing it means writing a workflow file, not changing a label, and the deadline for that has passed. Cirrus Runners is the opposite shape: ordinary GitHub Actions jobs pointed at a runner label, so replacing it is a label change and a bill comparison, on whatever timetable your contract gives you.

One practical note for both: the documentation has already gone. Checked on 2026-09-20, `cirrus-ci.org` does not resolve and `cirrus-ci.com` does not answer. The only authoritative description of what your macOS tasks did is the file in your own repository, so read it before it is the thing you are trying to remember.

## The five published macOS destinations

Ranked by the rate each vendor published on 2026-09-20, with the shape that rate buys. The shapes vary by a factor of two in cores and by more than that in memory, so the cheapest row is not automatically the cheapest job. Linux destinations, and the eight-vendor matrix behind them, are in [GitHub Actions runner alternatives](/learn/runners/github-actions-runner-alternatives).

| Destination | Published macOS shape | Per minute | Best for | What to check first |
| --- | --- | --- | --- | --- |
| Namespace | 4 vCPU, 7 GB, Apple Silicon | $0.04 prepaid | The cheapest published macOS minute | macOS concurrency is a published vCPU ceiling of 12, 24 or 48 by plan, and overage is $0.06 |
| GitHub-hosted | `macos-latest`: 3-core M1, 7 GB, 14 GB SSD | $0.062 | Leaving without adding a third party | 5 concurrent macOS jobs on Free, Pro and Team, 50 on Enterprise, shared with larger runners |
| Blacksmith | `blacksmith-6vcpu-macos-latest`: 6 vCPU, 24 GB, 150 GB | $0.08 | A Cirrus pipeline with Linux and Windows tasks too | Apple Silicon M4 only, and the org needs its GitHub App installed |
| WarpBuild | M4 Pro, 6 vCPU, 14 GB | $0.08 | Restoring a prepared machine state per job | Snapshots are metered on top: $0.04 per restore and $0.025 per hour of storage |
| Depot | `depot-macos-latest`: 8 CPU, 24 GB, 400 GB | $0.08 | The largest published macOS disk and memory | Its own docs say macOS capacity is not fully elastic, so expect queue time at peak |

> Namespace and Blacksmith both sell a larger macOS card at $0.12 and $0.16 respectively, and GitHub sells a 12-core macOS runner at $0.077 and a 5-core M2 Pro at $0.102. Latchkey publishes no macOS runner, which is a real gap rather than a pricing decision: those jobs have to go to one of the five above.

## What the macOS half does to the month

Take a pipeline that burns 8,000 Linux minutes and 2,000 macOS minutes a month, which is a normal shape for a team shipping one iOS app beside its services. On GitHub-hosted that is $48.00 of Linux and $124.00 of macOS, so 72% of the metered bill is a fifth of the minutes. On Blacksmith the same split is $32.00 and $160.00, and macOS is 83%.

Namespace is still the cheapest total and it is the row with the most fine print, because its prepaid rates are the in-plan rate rather than a meter. That month is 112,000 unit minutes, 32,000 Linux and 80,000 macOS; the $100 Team plan covers 100,000 of them and the other 12,000 bill at the $0.0015 overage rate, so the invoice is $100 plus $18.00, not the $112.00 the rate card alone suggests. At $118.00 its macOS half is 68% of the bill. Depot lands at $208.00 plus its $20 plan fee, WarpBuild at $192.00 with no plan fee and snapshots metered separately.

## The label swap, for the jobs that already run on GitHub Actions

If you were on Cirrus Runners rather than Cirrus CI, this is the whole migration. Runner selection is per job, so move the slowest macOS job first, leave the rest, and compare a week of real runs before you touch anything else.

```.github/workflows/ios.yml
jobs:
  ios:
    runs-on: macos-latest                    # GitHub-hosted, 3-core M1, 7 GB
    # runs-on: blacksmith-6vcpu-macos-latest # 6 vCPU, 24 GB
    # runs-on: depot-macos-latest            # 8 CPU, 24 GB
    steps:
      - uses: actions/checkout@v5
      - run: sudo xcode-select -s /Applications/Xcode_26.app
      - run: xcodebuild test -scheme App -destination 'platform=iOS Simulator,name=iPhone 17'
```

## Four things that break on a macOS runner you did not build

A Cirrus macOS task ran on an image your team chose and, often, on hardware your team controlled. Every item below is the same class of problem: something the old image guaranteed that the new one does not.

- **Xcode.** Pin it with `xcode-select` rather than trusting the default. Each vendor ships its own image with its own set of versions, and "it worked on Cirrus" is not a version.
- **Nested virtualization.** GitHub documents that it is not supported on its arm64 macOS runners, a limit of Apple's Virtualization Framework. Anything that started a VM inside the job, which is exactly what a Tart-based pipeline may have done, needs a different plan.
- **Device identity.** GitHub documents that arm64 macOS runners have no static UDID, while its Intel macOS runners do. If your signing or provisioning flow registered a UDID, the Intel images are the ones that keep it.
- **Concurrency.** GitHub allows 5 concurrent macOS jobs on Free, Pro and Team and 50 on Enterprise, shared with larger runners. Namespace publishes a macOS ceiling in vCPUs instead: 12, 24 or 48 by plan. A matrix that fanned out freely on Cirrus can queue behind either.

## If you would rather keep the Tart stack

The announcement that ended the hosted service also relicensed the tools under it. Cirrus Labs says it will relicense Tart, Vetu and Orchard "under a more permissive license" and has "stopped charging licensing fees for them", so the Apple Silicon virtualization stack your macOS jobs ran on is still there, on your own Macs, at no license cost.

That is a genuine option and not a small one: you keep the images and the behavior you already debugged, and you take on the hardware, the capacity and the pager. It is the trade any self-hosted pool makes, worked through in [migrate from self-hosted runners](/learn/runners/migrate-from-self-hosted-runners), with the wrinkle that Apple hardware cannot be rented by the hour when the queue doubles.

## Where Latchkey fits, and where it does not

Latchkey sells managed Linux x86_64 runners at $0.0025 a minute for 2 vCPU with 8 GB, $0.005 at 4 vCPU, with 25 GB of cache per repository and 2,000 to 6,000 free minutes a month by plan. On the 8,000 Linux minutes above that is $20.00 plus the plan fee, which starts at $5 a month and is not netted off by the included minutes.

It cannot take the macOS jobs. There is no macOS runner and no way to point `runs-on` at one. If most of your Cirrus spend was macOS, the table above is your shortlist and Latchkey is at best the Linux half of a two-vendor answer. What it adds on that half is repair: a transient failure such as [a Docker Hub rate limit](/learn/failures/docker-hub-pull-rate-limit-in-ci) is diagnosed and retried inside the run rather than billing the failure and the re-run.

## The short answer

Cheapest published macOS minute, if you are on one of its paid plans and can live with a 4 vCPU 7 GB machine: Namespace at $0.04. No third party and the widest tooling support: GitHub-hosted at $0.062, dearer than Namespace and cheaper than the three at $0.08. Most machine per minute at that $0.08: Depot at 8 CPU and 24 GB, or Blacksmith at 6 vCPU and 24 GB if you want the GitHub App and the observability that comes with it.

Keep the stack you had: Tart on your own Macs, now unlicensed. Send the Linux half somewhere cheap and the macOS half somewhere real, and do not wait for the contract to expire before you price it.

## FAQ

### What is the cheapest published macOS runner for GitHub Actions?

On rates read 2026-09-20, Namespace at $0.04 a minute for 4 vCPU with 7 GB, which is its prepaid in-plan rate; past the plan it is $0.06. GitHub-hosted is next at $0.062 for a 3-core M1 with 7 GB, and Blacksmith, WarpBuild and Depot all list $0.08 for machines of 6 to 8 cores with 14 to 24 GB.

### Can I still use Tart now that Cirrus Labs is joining OpenAI?

Yes. The same announcement says Tart, Vetu and Orchard are being relicensed "under a more permissive license" and that the company has stopped charging licensing fees for them. The hosted services are what ended: Cirrus CI on 1 June 2026, and Cirrus Runners as existing contracts expire. Self-hosting the virtualization stack on your own Apple hardware stays open.

### How many macOS jobs can GitHub Actions run at once?

GitHub documents 5 concurrent macOS jobs on Free, Pro and Team plans and 50 on Enterprise, and notes that the ceiling is shared between standard runners and larger runners. Namespace publishes its macOS limit as a vCPU ceiling instead, 12, 24 or 48 by plan. Neither number moves with how many minutes you buy.

### How do I cut a macOS bill without leaving GitHub Actions?

Three moves, in order of payoff. Stop running macOS jobs on pull requests that do not touch the app, with a path filter. Cache the derived data and the pods directory, because a cold macOS minute costs ten Linux minutes. Then move the remaining macOS jobs to whichever of the five vendors above prices the shape you actually need, and keep the Linux jobs somewhere cheaper still.

## References

- [Cirrus Labs: joining OpenAI, the Cirrus CI shutdown date and the Cirrus Runners wind-down (verified 2026-09-20)](https://cirruslabs.org/)
- [GitHub Actions runner pricing: macOS and Linux per-minute rates, and whole-minute rounding (verified 2026-09-20)](https://docs.github.com/en/billing/reference/actions-runner-pricing)
- [GitHub-hosted runners: macOS shapes, nested virtualization and UDID limits (verified 2026-09-20)](https://docs.github.com/en/actions/reference/runners/github-hosted-runners)
- [Namespace pricing: macOS shapes, prepaid and overage rates, concurrency ceilings (verified 2026-09-20)](https://namespace.so/pricing)
- [Depot runner types: macOS runner shape, rate and capacity note (verified 2026-09-20)](https://depot.dev/docs/github-actions/runner-types)

---

Latchkey runs CI/CD that repairs its own failures. Agent entry points: https://latchkey.dev/agent.txt, https://latchkey.dev/openapi.json, https://latchkey.dev/llms.txt
