Ask AI
Run iOS and Xcode builds on GitHub Actions with your own Mac
Build and test iOS and macOS apps on your Mac, with the Xcode you already have.
Install Codemany on an Apple silicon Mac that has Xcode, then set runs-on: [self-hosted, codemany, xcode] on the job. The job runs on your Mac with your Xcode, simulators and tools, in a fresh single-use runner. GitHub still schedules it and shows the logs.
Why build on your own Mac
- Your Xcode, already installed. Jobs use the Xcode, simulators and Homebrew tools on the Mac. Nothing is preinstalled.
- Warm tool cache. Downloads from
actions/setup-*steps stay in a shared cache between jobs. - Your code stays on your machine. Codemany talks to GitHub directly from your Mac, and your GitHub token is never sent to Codemany's servers.
- A flat price. $20/month includes 2 machines, instead of paying per macOS minute (cut GitHub Actions costs).
Set up Xcode builds
Install Xcode
Install Xcode on the Mac and choose it with
xcode-select.Install Codemany
Download Codemany, sign in with GitHub and pick your repositories (Get started).
Check the tools
Open Settings › This Mac › Tools, or run
codemany doctor, to see that Codemany found your Xcode.Ask for Xcode in the job
Add the
xcodelabel toruns-on, as below, and push a commit.
Pick an Xcode with labels
Codemany adds two labels on any Mac with an Xcode: a plain xcode, and one that follows the Xcode chosen with xcode-select, for example xcode-26.0.
xcodewhen any Xcode will do, so Xcode updates never strand the job.xcode-26.0when the build needs that Xcode. After a switch, jobs asking for the old one wait instead of using the wrong toolchain.ARM64is always there: Codemany runs on Apple silicon, which matters for simulator builds.
Every label: Advanced › Runner labels.
Example workflow
name: ios
on: [push]
jobs:
test:
runs-on: [self-hosted, codemany, xcode]
steps:
- uses: actions/checkout@v4
- name: Test on a simulator
run: |
xcodebuild test \
-scheme MyApp \
-destination 'platform=iOS Simulator,name=iPhone 17'
Pin the version with runs-on: [self-hosted, codemany, xcode-26.0].
Simulators and signing
Jobs run as your user, so xcodebuild sees the simulators, certificates and provisioning profiles already set up on this Mac. Codemany doesn't send them anywhere; what it does send is listed in Security & privacy.
A runner that goes offline for 2 minutes is stopped, with leftover processes such as simulators, and replaced. Each job gets a fresh runner whose folder is wiped afterwards (single-use runners).
Codemany can install CocoaPods, fastlane, xcbeautify, SwiftLint and XcodeGen with Homebrew on request, as your user, never root (Tools and caching).
How many builds at once
Each job needs about 4 GB of memory, 2 CPU cores and 15 GB of disk. An 8 GB Mac runs 1 job at a time; a 16 GB Mac runs 3. codemany capacity prints how many fit. To run more, add another Mac.
Questions
Can I pin an Xcode version?
Yes. Ask for xcode-26.0 (or the version you need) instead of xcode. The job waits for a Mac with that Xcode selected.
What happens when I update Xcode?
The version label follows xcode-select. Jobs asking for plain xcode keep running; jobs pinned to the old version wait.
Can pull requests from forks use my signing certificates?
Public repos are off unless you turn one on, because anyone can open a pull request that runs their code. Only run workflows you would run in your own terminal (Runner security).
Is it cheaper than GitHub-hosted macOS runners?
Codemany is a flat $20/month for 2 machines, with a 14-day free trial. Compare with your own numbers in the savings calculator.
Related guides: self-hosted runner on a Mac and self-hosted runner on Linux.