Apple Silicon runners, without a second CI platform.
Manzanita supplies ephemeral macOS machines to GitHub Actions. GitHub remains the control plane for workflow syntax, secrets, logs, artifacts, approvals, and job queues.
Quickstart
- Install the Manzanita GitHub App on only the repositories that need macOS CI.
- Start the trial. The 14-day clock begins with the first runner job, not registration.
- Change one line in your workflow:
jobs:
test:
runs-on: manzanita-standard
steps:
- uses: actions/checkout@v4
- run: swift testNo proprietary workflow file is required. Existing GitHub Actions, environments, caches, artifacts, and repository secrets continue to work.
Runner labels
| Label | Profile | Concurrency |
|---|---|---|
manzanita-standard | M4 Pro · 6–7 vCPU · 22 GB | One job per slot |
manzanita-xl | M4 Pro · 12–14 vCPU · 44 GB | One job per slot |
Jobs above purchased concurrency remain queued in GitHub. A slot is reserved concurrency, not a shared vCPU pool.
Images and toolchains
The pilot image is pinned to macOS Sequoia with Xcode 16.4 and Swift 6.1.2. Images are built ahead of time and canary-tested before production nodes pull them. Future Xcode versions will use explicit labels rather than silently moving a pinned image.
Job lifecycle
- The GitHub App receives
workflow_job.queued. - The scheduler selects an entitled slot and issues a short-lived JIT runner token.
- The node clones a prewarmed Tart golden image using APFS copy-on-write.
- The VM connects directly to GitHub, runs exactly one job, and uploads logs and artifacts there.
- The VM and token are destroyed. A clean replacement is prepared.
Caching
Use actions/cache immediately. Per-organization SPM, DerivedData, and CocoaPods cache volumes are planned for the production fleet. Cache volumes never cross organizations or repositories and are not part of the ephemeral workspace.
Security model
- One GitHub job per disposable VM.
- Repository-scoped GitHub App access.
- Short-lived JIT registration tokens.
- Workspace destruction after every job.
- Node control is outbound-only; customers do not expose inbound ports.
- Audit events for authentication, billing, and node enrollment.
Manzanita is dedicated-host CI infrastructure, not confidential computing. Sensitive secrets remain governed by GitHub Actions permissions and your workflow design.
Billing and fair use
| Plan | Price | Rules |
|---|---|---|
| Founding | $99/month/slot | First 10 organizations; maximum two founding slots |
| Standard | $149/month/slot | Third and later slots; ordinary M4 Pro profile |
| XL | $249/month/slot | Full-host profile |
Plans include unlimited CI minutes. To protect responsive queues, usage above 15,000 minutes per slot in 30 days starts a human capacity review. It does not create a per-minute overage charge. During contention, lower-utilization organizations receive scheduling priority while running jobs are never preempted. Founding onboarding is curated; unusually large historical Actions usage is routed to Standard, XL, or a multi-slot capacity plan.
The free trial is one Standard slot for 14 days or 300 build minutes, whichever happens first. Stripe owns cards, invoices, cancellation, and the Customer Portal.
Troubleshooting
Job stays queued
Confirm the GitHub App is installed for that repository, the label is spelled exactly, and your organization has an active trial or subscription. Jobs also queue normally when all purchased slots are busy.
Toolchain mismatch
Print xcodebuild -version and swift --version in the job. Pinning is deliberate; contact support before assuming xcode-select points at another beta.
Need help
Include the GitHub job URL, repository name, and approximate queue time. Do not send repository secrets.
Node heartbeat API
Fleet nodes report health over an authenticated outbound request. This endpoint is for enrolled operators, not customer workflows.
POST /api/node/heartbeat
Authorization: Bearer $MANZANITA_NODE_KEY
Content-Type: application/json
{"id":"mini-m2pro-01","status":"online","slots":[{"index":0,"state":"ready"}]}© 2026 Manzanita · 80 Willow Road, Menlo Park, CA 94025.