INTERNAL MEMO ENG-OPS-004

TestFlight for Multi-Branch Builds

A proposal to enable TestFlight builds for PR branches, not just main.

01. Context & Friction

Current Implementation

  • CI builds Main branch to iOS. (PRs are artifacts only).
  • Uploads are automatic and happen nightly.
  • ! Builds are unlabeled and unrecognizable (e.g. "Build 9005").

Limitations

×
No Branch Builds

We cannot make builds for PR branches. Testers are unable to verify features in isolation before merge.

×
Unknown Build Content

Team is unaware of what is inside a build. No notifications (except generic Apple emails) and no changelogs.

02. The Solution

Implementation

Fastlane
  • • Injects PR metadata into each build
  • • Enables "What to Test" descriptions
  • • Handles TestFlight group distribution
Slack Webhook
  • • Posts to #builds on CI completion
  • • Includes PR title, branch, build number
  • • Links to TestFlight

RESULTING FLOW

TRIGGER: CI COMPLETION

BuildBot APP
🚀 PR #42 is ready for testing.
"Add particle effects system"
branch: feature/particles
Build 42001 available in TestFlight

ACTION: INSTALL FROM TESTFLIGHT

TestFlight > Previous Builds
Build 42001
PR #42: Add particle effects
INSTALL

03. Impact Analysis

Issue Resolution
Unknown build contents Resolved (Builds labeled with PR #)
Team awareness Resolved (Slack push notifications)
Side-by-side comparison See Section 04

Why not Firebase App Distribution?

It offers better install UX, but relies on Ad-Hoc provisioning with a 100 device/year hard limit. It also requires manual UDID management for every new tester device. Not scalable.

04. App Configuration

DECISION REQUIRED

Fastlane + Slack is the solution. That's happening regardless. The only remaining question is how we structure the TestFlight apps:

RECOMMENDED START
OPTION A

Single App

🦄
Bobium Brawlers
com.studioatelico.bobiumbrawlers
  • All builds (main + PRs) in one place
  • Zero extra config
  • Switching builds = 4 taps
  • No simultaneous comparison
OPTION B

Two Apps

Prod / Dev Split
🦄
Main
+
🧪
Dev
  • Keeps main clean as source of truth
  • Experimental/risky builds stay isolated
  • Side-by-side comparison (main vs PR)
  • Requires 2nd App Store Connect entry
  • Additional provisioning profile setup

05. Recommendation

Fastlane + Slack gets us 80% of the value with 20% of the effort. Both options below use this stack — the only difference is whether PR builds go into the same app as main, or a separate one.

OPTION A Single App

All builds in one place. Minimal setup. Switching between builds takes a few taps in TestFlight.

OPTION B Two Apps

Separate prod and dev. More setup, but keeps main clean and isolates experimental work.

We don't need to commit to two apps right now.

Start with Option A. If the single-app workflow becomes limiting over the next month, we can revisit Option B.