What changed
Cirrus Labs announced on 7 April 2026 that it joined OpenAI. Cirrus CI stopped on 1 June 2026. Cirrus Runners takes no new customers. Existing contracts run to the end of their term.
Tart moved to github.com/openai/tart, and OpenAI maintains it. On 5 June 2026 Tart changed to the Functional Source License 1.1 (FSL-1.1-ALv2). Each Tart version becomes Apache-2.0 two years after its release. The current release is 2.40.1, from the openai/tools Homebrew tap. The old cirruslabs/cli tap stopped at 2.32.1. Your Tart images continue to work with the tart CLI.
How ushr is different
Cirrus Runners supplies managed Apple Silicon macOS runners and Linux runners to existing customers. ushr does not supply hardware. You supply the Macs and Linux machines. ushr schedules GitHub Actions jobs onto them and starts a fresh VM for each job.
| Cirrus Runners | ushr | |
|---|---|---|
| Hardware, | Supplied by Cirrus Labs | You buy and run your own machines |
| Price | $150 per runner per month | US$49 per month for up to 3 hosts, US$19 per extra host, hardware not included |
| New customers (as of October 2026) | No | Yes |
| VM images | Tart | Tart, Lume or Docker |
The ushr free tier covers 1 host and 1 GitHub scope (an organisation, or a repository on a personal account). A paid workspace serves any number of scopes.
Price: per runner vs per host
These figures compare subscriptions only. The ushr column does not include the cost of the Macs, power or network.
Cirrus Runners charges a flat $150 for each concurrent runner per month. ushr Pro charges US$49 per month for up to 3 hosts, and US$19 per month for each extra host. A host can run more than one runner at a time.
The macOS licence allows up to 2 extra macOS instances in VMs on each Mac that you own or control. The licence permits these VMs for software development, testing during software development, macOS Server, or personal non-commercial use. It does not permit service bureau, time-sharing or similar services. macOS enforces the same limit of 2 VMs. One Mac host therefore runs up to 2 concurrent macOS runners.
Source for the Cirrus price: cirrus-runners.app/pricing (live page) and cirrus-runners.app, archived January 2026. These are Cirrus list prices. Cirrus also offers 15% off for annual billing and 50% off for nonprofits.
| Concurrent runners | Cirrus Runners | ushr subscription (hardware not included) | Macs you need |
|---|---|---|---|
| 2 | 2 × $150 = $300 | 1 host = US$0 (free tier) | 1 |
| 4 | 4 × $150 = $600 | 2 hosts = US$49 (Pro, up to 3 hosts) | 2 |
| 8 | 8 × $150 = $1,200 | 4 hosts = US$49 + US$19 = US$68 | 4 |
The free tier covers 1 host and 1 GitHub scope (an organisation, or a repository on a personal account).
Migration guide
1. Install ushr on each Mac
$ curl -fsSL https://get.ushr.io | sh
$ ushr loginushr login installs Tart from the openai/tools Homebrew tap if it is missing, enrolls the host, creates the GitHub App and starts the agent. The App key stays on the host.
2. Use the Tart image you already use
The Cirrus macos-runner images are Tart images. The ushr agent clones the image for each job and installs the Actions runner into the clone. If no image is present, ushr login offers to pull ghcr.io/cirruslabs/macos-runner:tahoe. To use a different tag or your own image, set it in ~/.config/ushr/agent.yaml:
driver:
type: tart
image: ghcr.io/cirruslabs/macos-runner:sonoma
capacity: 23. Change the runs-on labels
Cirrus Runners jobs target an image name as the label. ushr runners advertise the standard self-hosted labels. Change each Cirrus label to the matching ushr label set:
| runs-on today | runs-on with ushr |
|---|---|
| ghcr. | [self-hosted, macOS, ARM64] |
| macos-14, | [self-hosted, macOS, ARM64] |
| ubuntu-24. | [self-hosted, Linux, X64] |
| ubuntu-24. | [self-hosted, Linux, ARM64] |
ushr init rewrites GitHub-hosted labels such as macos-latest and ubuntu-24.04 in a repo's workflows. It does not change Cirrus image labels. Change those by hand, then run ushr init --dry-run to see what else it would rewrite.
$ ushr init --dry-run
==> .github/workflows/ci.yml: would rewrite 2 runs-on target(s)
==> Dry run — no files written.4. Cut over before your contract ends
Your Cirrus Runners contract runs to term. Move one repo at a time. Each job goes to the runner that matches its labels, so a moved repo runs on ushr while the others stay on Cirrus Runners.
Next steps
Read how ushr keeps your GitHub credentials on your hosts on the security page. For the GitHub self-hosted runner fee, read the runner fee explainer.