Updated September 5, 2026

Manzanita vs GitHub-hosted macOS runners

Both run your existing GitHub Actions workflow. The differences are the machine, how Xcode is pinned, how you wait, and how you pay. Everything below is stated so you can check it against actions/runner-images, GitHub's billing page, and our docs.

AreaGitHub-hosted macos-latestManzanita manzanita-standard
HardwareShared Apple Silicon VM (3–4 vCPU on the standard SKU; larger SKUs via -xlarge labels)Dedicated M4 Pro profile: 6 vCPU · 22 GB (Standard) or 12 vCPU · 44 GB (XL)
XcodeOne major Xcode per macOS image; patch versions replace the previous one; -latest migrates to a new macOS over 1–2 monthsDigest-pinned image: Xcode 26.6 (17F113) on macOS Tahoe 26.6.2. Xcode 16.4 stays on its own label. Image IDs never change under you; see the changelog
IsolationFresh VM per jobFresh VM per job, destroyed after the job. Repository-scoped JIT credentials
Time to runnerDepends on shared pool demandVM start after a runner is assigned: 5 s median, 9 s p95 across our fleet for the 30 days ending September 5, 2026. Excludes waiting behind your own concurrency and GitHub's job matching (definition)
ConcurrencyPer-account limits; jobs above the limit queueOne job per purchased runner; jobs above that stay queued on GitHub with normal logs
PricingPer minute. GitHub lists the standard macOS runner at $0.062 per minute at the time of writing; larger SKUs cost more$149 per month per Standard runner, $299 per XL. No per-minute billing
Job limit6 hours2 hours per job during the pilot
Code signingSupportedNot supported in the pilot. Keep release and notarization jobs on a protected runner
Workflow changesOne line: the runs-on label

When the flat rate wins

Per-minute pricing is cheap when a repository builds a few times a day and expensive when it builds constantly. A single Standard runner at $149 equals roughly 2,400 minutes of GitHub's standard macOS SKU at $0.062. A team running two hours of macOS CI per working day crosses that in about three weeks; a merge queue or a coding agent that opens many PRs crosses it in days. Above that line the flat rate is the cheaper option, and the bill stops moving.

When GitHub-hosted is the better choice

Migrating one workflow

jobs:
  test:
    runs-on: ${{ vars.MACOS_RUNNER || 'macos-latest' }}
    steps:
      - uses: actions/checkout@v5
      - run: xcodebuild -version
      - run: swift test

Set a repository variable MACOS_RUNNER=manzanita-standard to route the next run to Manzanita, and clear it to route back to GitHub, without a commit. Details in the docs.

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

Related