Self-hosted macOS runners for GitHub Actions
A self-hosted macOS runner is a Mac you control that executes your GitHub Actions jobs instead of GitHub's shared cloud machines. You register the runner once, point your workflow at it, and your builds run on hardware that stays warm between jobs.
Why teams move off hosted macOS runners
GitHub bills macOS runners at about $0.08 to $0.16 per minute, roughly ten times the Linux rate. That pricing is fine for occasional builds and expensive for a team shipping every day. Three things change when the machine is yours:
- Cost stops scaling with usage. A flat monthly box costs the same whether you run 1,000 or 20,000 minutes.
- Caches survive. DerivedData, CocoaPods, SwiftPM and npm caches stay on local SSD, so incremental builds skip most of the work a fresh runner repeats.
- The environment is stable. You pin Xcode once instead of adapting to hosted image updates on someone else's schedule.
The tradeoffs, stated plainly
Self-hosting is not free of downsides. Jobs serialize on one machine, so heavy parallel matrices need more units. You are responsible for runner security if you build untrusted pull requests, which is why GitHub recommends self-hosted runners for private repositories. And somebody has to own macOS updates, Xcode installs and the runner service staying alive.
MacRun exists to take that last part off your plate: you get the dedicated machine and the flat price, and we handle provisioning, supervision and wipes.
What the workflow change looks like
Registering the runner is a one-time command. After that the pipeline change is two lines:
jobs: build: - runs-on: macos-14 + runs-on: [self-hosted, macOS, macrun-unit-01]
Everything else, including your existing steps, secrets and artifacts, stays the same. The full walkthrough is in the setup guide.
Build it yourself or lease it
If you already have spare Apple hardware and someone to maintain it, self-hosting on your own Mac is a reasonable option. If you would rather skip buying hardware, racking it and babysitting the runner service, a dedicated leased machine gets you the same economics without the operations work. Run your own numbers on the cost calculator.
Frequently asked questions
What is a self-hosted macOS runner?
+
It is a Mac you control that runs your GitHub Actions jobs instead of GitHub's shared hosted machines. You install the Actions runner agent, register it with your repository or organization, and target it from your workflow with a runs-on label.
Is a self-hosted macOS runner cheaper than GitHub-hosted?
+
It depends on volume. GitHub-hosted macOS costs about $0.08 to $0.16 per minute. A flat $79 per month dedicated runner breaks even near 988 minutes per month at the low rate, and everything past that is free.
Are self-hosted runners safe for public repositories?
+
GitHub recommends self-hosted runners for private repositories, because a fork's pull request can otherwise run untrusted code on your machine. If you must use them on public repos, require approval for fork workflows and isolate the runner from anything you care about.
Do I need to keep the runner service running?
+
Yes, the runner has to be online to pick up jobs. On MacRun a supervision daemon watches the service and restarts it within about 30 seconds if it crashes, so you do not have to monitor it.