How to install on macOS
Install via Homebrew
Section titled “Install via Homebrew”brew install boring-design/tap/elastic-fruit-runnerBuild from source
Section titled “Build from source”git clone https://github.com/boring-design/elastic-fruit-runnercd elastic-fruit-runnermake buildThe binary will be in output/elastic-fruit-runner.
Configure
Section titled “Configure”Create ~/.elastic-fruit-runner/config.yaml. See the configuration reference for all options.
mkdir -p ~/.elastic-fruit-runnerA minimal example:
orgs: - org: your-org auth: pat_token: ghp_xxx runner_group: Default runner_sets: # macOS runners via Tart VMs - name: efr-macos-arm64 backend: tart image: ghcr.io/cirruslabs/macos-tahoe-xcode:26.3 labels: [self-hosted, macos, arm64] max_runners: 2
# Linux arm64 runners via Docker - name: efr-linux-arm64 backend: docker image: ghcr.io/actions-runner-controller/actions-runner-controller/actions-runner-dind:latest labels: [self-hosted, linux, arm64] max_runners: 4 platform: linux/arm64
# Linux amd64 runners via Docker (Rosetta 2 emulation) - name: efr-linux-amd64 backend: docker image: ghcr.io/actions-runner-controller/actions-runner-controller/actions-runner-dind:latest labels: [self-hosted, linux, amd64] max_runners: 4 platform: linux/amd64
idle_timeout: 15mPrevent sleep (headless / always-on servers)
Section titled “Prevent sleep (headless / always-on servers)”If the Mac is used as a dedicated runner host (e.g. a Mac mini or a MacBook with the lid closed), you need to disable system sleep and disk hibernation so Docker and Tart stay responsive after idle periods. See the dedicated guide: Prevent a MacBook from sleeping.
Run as a service (recommended)
Section titled “Run as a service (recommended)”brew services start elastic-fruit-runnerOpen http://127.0.0.1:8080 and use the setup code from the service log. See Use the operations console.
Check status:
brew services info elastic-fruit-runnerStop:
brew services stop elastic-fruit-runnerRun manually (foreground)
Section titled “Run manually (foreground)”elastic-fruit-runnerWith a specific config file:
elastic-fruit-runner --config /path/to/config.yamlView logs
Section titled “View logs”Logs are written to the Homebrew log directory when running as a service:
tail -f /opt/homebrew/var/log/elastic-fruit-runner.logOn Intel Macs:
tail -f /usr/local/var/log/elastic-fruit-runner.logLogs are JSON-formatted. Use jq for filtering:
# Show only errorstail -f /opt/homebrew/var/log/elastic-fruit-runner.log | jq 'select(.level == "ERROR")'
# Show runner set activitytail -f /opt/homebrew/var/log/elastic-fruit-runner.log | jq 'select(.runnerSet != null)'When running manually, logs go to stdout.
Update
Section titled “Update”Follow How to upgrade Elastic Fruit Runner to check running jobs, upgrade the binary, and verify the Console.
Uninstall
Section titled “Uninstall”brew services stop elastic-fruit-runnerbrew uninstall elastic-fruit-runnerrm -rf ~/.elastic-fruit-runner