
For a Bitrise DEN self-hosted agent, request a Figment M-series Mac (from $95/month; physical provisioning is request-based and the exact chip, RAM, and disk are confirmed in the quote). If you want the machine set up for you, the Managed Build Mac at $249/month includes one M-series Mac, CI setup, backups, monitoring, and 30 minutes of monthly support. The $29/month virtual Intel macOS VM (2 vCPU, 8 GiB RAM, 80 GiB disk) can host a DEN agent for pipelines that build with Intel-compatible toolchains, including supported Xcode 26 or earlier releases; pick an M-series Mac for Apple-silicon-only tooling.
Bitrise cloud macOS stacks are convenient until concurrency slots fill up during release crunches. A self-hosted DEN (Dedicated Environments Network) agent routes those same builds to a Mac you rent, on a flat monthly line item, with tooling you control. This guide registers one Figment Mac in a Bitrise runner pool, routes an app to it, and works a real break-even against your current Bitrise minutes bill.
Primary references used here: Bitrise's DEN on-premise runners documentation and Apple's porting macOS apps to Apple silicon note on Intel Xcode support.
Bitrise cloud machines are a sensible starting point. The move to self-hosted makes sense when one or more of these is true:
Bitrise's documentation is explicit that the DEN agent is not plug-and-play: you install the toolchain you need. On a Figment Mac the base macOS is in place; Xcode, CocoaPods, and Fastlane install once and persist between runs.
Confirm these before running any install commands:
https://den.services.bitrise.io and https://build-log.services.bitrise.io (the two endpoints the agent actually talks to).sudo xcodebuild -license accept).In Bitrise, go to Workspace settings → Self-hosted agents, create a runner pool (for example, figment-m-series), and copy its agent intro secret. You will paste it once, during daemon install.
Run these on the Figment Mac. The commands match the current Bitrise install instructions:
# Add the Bitrise DEN tap and install the agent + Bitrise CLI
brew tap bitrise-io/den-agent
brew install bitrise-den-agent
brew install bitrise
# Register the launchd daemon. Replace YOUR_INTRO_SECRET with the pool token.
sudo "$(brew --prefix)/bin/create_bitrise_daemon.sh" \
--bitrise-agent-intro-secret=YOUR_INTRO_SECRET \
--enable-agent-self-update
The script writes a launchd plist and starts the service. Confirm the agent is up:
sudo launchctl list | grep bitrise
curl -sI https://den.services.bitrise.io | head -1
curl -sI https://build-log.services.bitrise.io | head -1
A missing process or a connection error on either endpoint explains an "offline" status in the Bitrise UI; a HTTP/2 200 or redirect is expected. Do not open these endpoints in any upstream allowlist unless the firewall is yours to change — Bitrise has no published IP allowlist to maintain on their side.
Routing has two parts. The pool assignment in the Bitrise web UI is the authoritative control.
bitrise.yml. For multi-app templates or review visibility, add a meta block. The exact machine_type_id value depends on your workspace tier, so copy it from the UI rather than inventing one:format_version: "13"
default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
meta:
bitrise.io:
# Copy stack and machine_type_id strings from the app's Stacks & Machines tab.
stack: osx-xcode-16
machine_type_id: <value from the Bitrise UI>
app:
envs:
- BITRISE_PROJECT_PATH: MyApp.xcworkspace
- BITRISE_SCHEME: MyApp
workflows:
build_and_test:
steps:
- activate-ssh-key: {}
- git-clone: {}
- cocoapods-install: {}
- xcode-build-for-simulator:
inputs:
- scheme: $BITRISE_SCHEME
- xcode-test:
inputs:
- scheme: $BITRISE_SCHEME
Replace BITRISE_SCHEME and BITRISE_PROJECT_PATH with the scheme and workspace your repository actually defines. Do not hand-edit secrets into YAML; keep API keys and signing material in Bitrise's secret store or a Keychain the daemon user can read.
Trigger a manual build in Bitrise and watch the log for the agent hostname line Bitrise emits at startup — it will match the Mac's hostname, not a label you invent. Then make sure the daemon user has what it needs:
# The daemon runs as its own user, not your login shell.
sudo xcode-select --switch /Applications/Xcode.app
sudo xcodebuild -license accept
# Tail the agent log (Apple silicon Homebrew path).
tail -f /opt/homebrew/var/log/bitrise-den-agent.log
For signing, install the signing certificate into the daemon user's login keychain and reference provisioning profiles as files checked into a secure store or synced with Fastlane match. Do not export the whole shell environment to a plaintext file; it can contain API tokens. Transfer secret names into the Bitrise app's Secrets tab and leave the values in a password manager you control.
Fail fast if a step errors. Every command above exits non-zero on failure, and Bitrise step failures stop the workflow by default — never treat a red build as a successful timing sample.
Bitrise prices cloud macOS builds per concurrent machine slot and per build minute; the exact numbers depend on your current plan, so pull them from your Bitrise billing page before you finalize this. The structure of the decision is simple:
Let R = your macOS per-minute rate in USD, M = your average build minutes per calendar month, and C = the price of a Figment Mac you would replace them with.
R × M.M ≥ 95 / R.M ≥ 249 / R.A concrete worksheet: at R = $0.07/min and M = 2,500 minutes/month, cloud cost is 0.07 × 2,500 = $175. That is above the $95 self-hosted line and below the $249 managed line, so a self-managed M-series Mac saves about $80/month, while the managed tier costs $74/month more than staying on cloud — buy it only if your team values the setup and monitoring time it replaces. Rerun the arithmetic with your actual rate card; do not assume a published per-minute price without checking it.
Capacity on one Mac is finite. How many parallel Xcode jobs a given machine sustains depends on its exact chip and RAM, which you confirm in your Figment configuration quote — the $95 entry price does not imply a specific RAM figure. Measure wall-clock build time at one, two, and three concurrent pipelines and stop adding slots when per-job time inflates. Past that point, add a second Figment Mac to the same runner pool and let Bitrise distribute jobs across both.
Request a Figment M-series Mac for your Bitrise runner pool, or start with the Figment Mac hosting overview to compare the $29 Intel VM, $49 i3 Mac waitlist, $95 M-series Mac, and the $249 Managed Build Mac side by side.
Related guides: