Skip to content

How to install on macOS

Terminal window
brew install boring-design/tap/elastic-fruit-runner
Terminal window
git clone https://github.com/boring-design/elastic-fruit-runner
cd elastic-fruit-runner
make build

The binary will be in output/elastic-fruit-runner.

Create ~/.elastic-fruit-runner/config.yaml. See the configuration reference for all options.

Terminal window
mkdir -p ~/.elastic-fruit-runner

A 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: 15m

Prevent 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.

Terminal window
brew services start elastic-fruit-runner

Open http://127.0.0.1:8080 and use the setup code from the service log. See Use the operations console.

Check status:

Terminal window
brew services info elastic-fruit-runner

Stop:

Terminal window
brew services stop elastic-fruit-runner
Terminal window
elastic-fruit-runner

With a specific config file:

Terminal window
elastic-fruit-runner --config /path/to/config.yaml

Logs are written to the Homebrew log directory when running as a service:

Terminal window
tail -f /opt/homebrew/var/log/elastic-fruit-runner.log

On Intel Macs:

Terminal window
tail -f /usr/local/var/log/elastic-fruit-runner.log

Logs are JSON-formatted. Use jq for filtering:

Terminal window
# Show only errors
tail -f /opt/homebrew/var/log/elastic-fruit-runner.log | jq 'select(.level == "ERROR")'
# Show runner set activity
tail -f /opt/homebrew/var/log/elastic-fruit-runner.log | jq 'select(.runnerSet != null)'

When running manually, logs go to stdout.

Follow How to upgrade Elastic Fruit Runner to check running jobs, upgrade the binary, and verify the Console.

Terminal window
brew services stop elastic-fruit-runner
brew uninstall elastic-fruit-runner
rm -rf ~/.elastic-fruit-runner