Install, upgrade and switch Xcode versions and their simulator runtimes from the terminal, on your Mac and on self-hosted CI Macs.
Why it exists
xcodes is the established tool for this job. It also carries its own implementation of Apple’s login, which has to be fixed each time Apple changes it, and hardware security keys are not supported.
xcodectl has no Apple login code of its own to break. You sign in on Apple’s own web page, in a small window, with a two-factor code or a YubiKey.
What it does
- Sign-in that keeps working
- On Apple's own page, with a two-factor code or a FIDO2 key.
- Fast downloads
- 16 parallel connections, resumable, expanded in process with unxip.
- Upgrades in one command
- Each installed Xcode moves to the newest release of its major.
- Simulator runtimes
- List, install, remove and prune, most without signing in.
- Release notes in the terminal
- In color, compared between versions, or summarized.
- Built for CI and agents
- One pipe moves the session. JSON output for scripts.
The session is the secret
The Keychain keeps the session, never the password. That one choice also solves CI: a runner gets a signed-in session through a single pipe, with no Apple ID in an environment variable.
# on your Mac, into a self-hosted runner
xcodectl auth export | ssh runner xcodectl auth importCompared to xcodes
| xcodectl | xcodes | |
|---|---|---|
| Sign-in | Apple’s own page in a window | Its own implementation of the login |
| Hardware keys | YubiKey and other FIDO2 keys | Not supported |
| Keychain holds | The session | Your Apple ID password |
| Upgrade in place | Yes, runtimes included | No |
| Intel Macs | No | Yes |
| GUI app | No | Xcodes.app |