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
We cannot make builds for PR branches. Testers are unable to verify features in isolation before merge.
Team is unaware of what is inside a build. No notifications (except generic Apple emails) and no changelogs.
02. The Solution
Implementation
- • Injects PR metadata into each build
- • Enables "What to Test" descriptions
- • Handles TestFlight group distribution
- • Posts to
#buildson CI completion - • Includes PR title, branch, build number
- • Links to TestFlight
RESULTING FLOW
TRIGGER: CI COMPLETION
branch: feature/particles
ACTION: INSTALL FROM TESTFLIGHT
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 REQUIREDFastlane + Slack is the solution. That's happening regardless. The only remaining question is how we structure the TestFlight apps:
Single App
com.studioatelico.bobiumbrawlers
- All builds (main + PRs) in one place
- Zero extra config
- Switching builds = 4 taps
- No simultaneous comparison
Two Apps
Prod / Dev Split- 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.
All builds in one place. Minimal setup. Switching between builds takes a few taps in TestFlight.
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.