Skip to content

Installed Software

RunnerHub build machines come pre-installed with all essential development tools for iOS, macOS, watchOS, tvOS, and Android development. No additional setup is needed—start building immediately.

Each machine runs one of four golden images keyed by Xcode version. See Golden Images for exact tool versions per image.

| Software | Version | Purpose | |----------|---------|---------| | Xcode | 16.3, 16.4, 26.4, or 26.5-beta | Complete IDE and compiler suite (select via environment.xcode) | | Command Line Tools | Matches Xcode | Compilers, headers, utilities | | Swift | Matches Xcode | Swift compiler and runtime | | Clang/LLVM | Matches Xcode | C/C++ compiler |

| Language | Version | Notes | |----------|---------|-------| | Node.js | 18, 20, 22 preloaded (Xcode 16.x); 20, 22, 24 preloaded (Xcode 26.x) | Managed by nodenv; activated per-job via environment.node. Other versions installed on demand. | | npm | Latest for Node version | Node package manager | | Yarn | Latest | JavaScript package manager (globally installed) | | Python 3 | Latest system version | Python runtime (via brew) | | Ruby | 3.3.6 (Xcode 16.3) / 3.3.11 (Xcode 16.4) / 3.4.9 (Xcode 26.4) / 4.0.2 (Xcode 26.5-beta) | Managed by rbenv; .ruby-version files auto-switch Ruby |

| Tool | Version | Platform | |------|---------|----------| | CocoaPods | Latest | iOS, macOS, watchOS, tvOS (installed as gem) | | Swift Package Manager | Built-in | Swift packages | | Bundler | Latest | Ruby gems | | Gradle | Latest | Android build (installed via brew) |

| Tool | Purpose | Installed | |------|---------|-----------| | Fastlane | iOS/macOS automation gem | Yes | | xcpretty | xcodebuild output formatter | Yes | | xcodegen | Xcode project generator | Yes | | xcbeautify | xcodebuild formatter | Yes | | SwiftLint | Swift linting | Yes | | SwiftFormat | Swift code formatter | Yes | | SwiftGen | Swift code generation | Yes | | Mint | Swift package manager CLI | Yes | | Carthage | Dependency manager | Yes |

All images include the following Homebrew formulae:

| Package | Purpose | |---------|---------| | swiftlint | Swift linting | | swiftformat | Swift code formatting | | swiftgen | Swift code generation | | xcbeautify | xcodebuild output formatting | | xcodes | Xcode version manager | | xcodegen | Xcode project generation | | mint | Swift package manager | | carthage | Dependency manager | | cmake | Build system | | wget | Download files | | imagemagick | Image manipulation | | jq | JSON query and transform | | yq | YAML query and transform | | gh | GitHub CLI | | nodenv | Node.js version manager | | node-build | Node.js compiler/installer (used by nodenv) | | rbenv | Ruby version manager | | ruby-build | Ruby compiler (used by rbenv) | | gradle | Gradle build system | | ktlint | Kotlin linting | | python3 | Python runtime |

All images include:

  • android-commandlinetools — Android SDK command-line tools
  • google-cloud-cli — Google Cloud SDK

| Tool | Purpose | |------|---------| | xcodebuild | Build iOS/macOS apps | | xcrun | Xcode command-line utility | | simctl | Simulator control | | codesign | Code signing | | notarytool | macOS app notarization | | xcresulttool | Xcode result analysis | | dwarfdump | Debug symbol inspection | | dsymutil | Debug symbol utility | | lipo | Universal binary tool | | install_name_tool | Binary linking tool | | otool | Object file tool | | nm | Symbol listing |

All images include multiple JDK versions:

  • JDK 17 — Default on Xcode 16.x images
  • JDK 21 — Default on Xcode 26.x images; available on all images
  • JDK 11 — Available on all images
  • JDK 25/26 — Available on Xcode 26.x images only

JAVA_HOME defaults to JDK 17 on Xcode 16.x images and JDK 21 on Xcode 26.x images. Switch versions by modifying JAVA_HOME in your pipeline or using jenv if needed.

Full Android SDK is pre-installed at ~/Library/Android/sdk. Includes:

  • Platforms: android-28 through android-36 (android-37 preview on 26.5-beta)
  • Build-tools: 28.0.3, 29.0.2, 30.0.3, 33.0.2, 33.0.3, 34.0.0, 35.0.0, 35.0.1, 36.0.0 (37.0.0 on 26.5-beta)
  • NDK: Multiple versions including 25.1.8937393, 27.3.13750724, 28.2.13676358, 29.0.13113456 (exact versions vary per image; see Golden Images)
  • CMake: 3.18.1, 3.22.1
  • Command-line tools: Latest via android-commandlinetools cask

ANDROID_HOME is pre-set to ~/Library/Android/sdk.

Flutter SDK is installed on demand by FVM based on your environment.flutter setting. This follows the Codemagic model and avoids volatile version dependencies. Once installed, Flutter and Dart are available directly on PATH.

Set environment.flutter in your YAML to specify the Flutter version:

jobs:
build:
environment:
flutter: "3.19.0" # FVM will install this version
steps:
- name: Get packages
run: flutter pub get
- name: Build iOS
run: flutter build ios

Important: FVM automatically manages Flutter SDK installation and configures PATH at job start. Use flutter and dart directly in your run: commands (no fvm prefix needed).

Note: FVM is pre-installed on all images. See the Flutter documentation for detailed setup.

| Tool | Purpose | |------|---------| | Git | Version control | | curl | Download files | | wget | Download files (alternative) | | jq | JSON query and transform | | zip / unzip | Archive compression | | gzip / gunzip | Gzip compression | | tar | Archive tool | | sed, awk, grep | Text processing | | defaults | macOS defaults database | | plutil | Property list utility | | PlistBuddy | Plist editing | | security | Keychain and certificate management | | killall | Process termination | | lsof | List open files | | ps | Process status | | date | Timestamp utility | | md5 | File checksums |

Access any pre-installed tool directly in your build steps:

steps:
- name: Install pods
run: pod install
- name: Build with fastlane
run: fastlane build
- name: Run tests
run: xcodebuild test -scheme MyApp
- name: Process JSON
run: curl https://api.example.com/status | jq '.status'

Tools are ready to use—no brew install, npm install -g, or setup needed for pre-installed packages.

Install Node.js packages globally or locally:

steps:
- name: Install global CLI
run: npm install -g @my-org/my-cli
- name: Use it
run: my-cli build

Install Python packages:

steps:
- name: Install Python package
run: pip3 install requests
- name: Use it
run: python3 my_script.py

Install Ruby gems:

steps:
- name: Install gem
run: gem install some-gem
- name: Use it
run: some-gem command

Homebrew is read-only during job execution. brew install, brew upgrade, and brew uninstall are blocked. If you need a tool that isn't preinstalled, install it using a non-Homebrew path (e.g., direct download in your pipeline step) or request the tool be added to the golden image.

For example, compile from source:

steps:
- name: Install tool from source
run: |
curl -o /tmp/tool.tar.gz https://example.com/tool.tar.gz
cd /tmp && tar xzf tool.tar.gz
cd tool && ./configure && make
./tool --version

For tools not available through Homebrew, npm, pip, or gem, download and compile them:

steps:
- name: Download and build tool
run: |
curl -o /tmp/tool https://example.com/tool.tar.gz
cd /tmp && tar xzf tool.tar.gz
cd tool && ./configure && make
./tool --version

Node.js is managed by nodenv (backed by node-build) on all images. Several majors are preloaded at image-build time so they activate instantly without a network download:

  • Xcode 16.x images: majors 18, 20, 22 preloaded (default: 22)
  • Xcode 26.x images: majors 20, 22, 24 preloaded (default: 24)

Any other version (major or exact patch, e.g. 20, lts, 20.11.0) is fetched and compiled on demand by nodenv install when the job starts — this adds time but works for any version node-build supports.

To use a specific Node.js version, set environment.node in your pipeline YAML:

jobs:
build:
environment:
node: "20" # nodenv activates the latest installed patch for major 20
steps:
- name: Verify Node version
run: |
node --version
npm --version

When environment.node is set, the agent resolves and activates that version via nodenv before running job steps. See Golden Images for per-image details.

Ruby versions are managed by rbenv. If your project has a .ruby-version file at the root, it will be automatically applied when the agent clones the repository:

steps:
- name: Check Ruby version
run: ruby --version

The agent sources .zshenv on every SSH session, which runs eval "$(rbenv init - zsh)", ensuring the correct Ruby version is always active.

steps:
- name: Verify tool
run: |
which fastlane
fastlane --version
which xcodebuild
xcodebuild -version
steps:
- name: System info
run: |
system_profiler SPSoftwareDataType
brew list
gem list
pip3 list
java -version

| Tool | Purpose | |------|---------| | xctest | Built-in unit test framework | | instruments | Performance profiling | | xctestrun | Test execution |

The following tools are not installed on RunnerHub build machines:

  • Flutter SDK — Use FVM instead (see Flutter Development section above)
  • pnpm — not preinstalled, but pnpm-lock.yaml is supported by automatic caching. To use pnpm, install it as your first step: npm install -g pnpm.
  • nvm — Use environment.node + nodenv instead
  • Tuist — Use xcodegen instead
  • xcov — Use built-in Xcode code coverage tools
  • Apple's swift-format (hyphenated) — Use swiftformat (Homebrew package) instead
  • aws CLI — Use AWS SDK in your code instead
  • Azure CLI — Use Azure SDK in your code instead
  • Docker — Not available on cloud machines
  • Linux tools — macOS only

For needs not met by pre-installed software:

  1. npm/pip/gem: Use these package managers to install additional tools
  2. brew install: Blocked at the agent — brew install, brew upgrade, and brew uninstall are not permitted during job execution. Use npm, gem, pip, or download the tool directly in your pipeline step instead (see Other Tools via Homebrew above)
  3. Self-hosted agents: Use VM mode for full OS customization

Q: What Xcode version is running? A: Depends on environment.xcode in your YAML. Cloud machines offer Xcode 16.3, 16.4, 26.4, and 26.5-beta. See Golden Images.

Q: Can I use a different Node.js version? A: Yes. Set environment.node in your pipeline YAML (e.g., environment.node: "22.11.0"). The agent activates it via nodenv before running steps.

Q: How do I switch Ruby versions? A: Add a .ruby-version file to your repository root (e.g., 3.3.6). The agent auto-activates it via rbenv on each job.

Q: Is Homebrew functional? A: Read-only. brew install, brew upgrade, and brew uninstall are blocked at the agent. Tools must be either preinstalled in the golden image or installed by your pipeline using non-Homebrew methods.

Q: Can I install Docker? A: Not on cloud machines. Consider self-hosted agents if you need virtualization.

Q: Can I compile and use my own tool? A: Yes, download the source and compile it in your pipeline.

Q: What about Rust, Go, or other languages? A: Many languages can be installed via Homebrew or their own installers. Use in your pipeline as needed.