Repository navigation
TestFlight archive/export/upload pipeline (T-020) - #27
Merged
Merged
Conversation
Ship the app to a device owner (Dan) via TestFlight. Bundle ID + team were already in
project.yml; this adds the missing distribution pipeline:
Tools/build-testflight.sh xcodegen -> archive (Release, generic/iOS) -> export the App
Store .ipa. Build number = git commit count (unique + monotonic
without editing project.yml). -allowProvisioningUpdates mints the
distribution cert/profile on first run. Optional --upload via
altool + an App Store Connect API key.
Tools/ExportOptions.plist method app-store-connect, team 5HR8E5CWR7, automatic signing,
manageAppVersionAndBuildNumber=false so our build number ships.
docs/testflight.md one-time App Store Connect setup, build/upload, inviting Dan
(internal vs external + public link), and the gotchas (90-day
build expiry, the Local Network permission prompt).
Verified as far as the account allows: ARCHIVE SUCCEEDED and signs. Export is currently blocked
on two account-side steps (accept the updated Program License Agreement; register the app record
in App Store Connect) -- documented, not code.
Claude-Session: https://claude.ai/code/session_01F7YsQgso3KNpeXbP5vNVj6
…90474) An iPad-capable bundle (TARGETED_DEVICE_FAMILY 1,2) must declare orientations or App Store ingestion rejects it for iPad multitasking. iPhone gets portrait + both landscapes; iPad all four. Claude-Session: https://claude.ai/code/session_01F7YsQgso3KNpeXbP5vNVj6
…ompt) The app uses only plain HTTP to local devices + the OS's standard TLS, both export-exempt. ITSAppUsesNonExemptEncryption=false pre-answers App Store Connect's compliance question so each build processes without manual intervention. Claude-Session: https://claude.ai/code/session_01F7YsQgso3KNpeXbP5vNVj6
Skeyelab
added a commit
that referenced
this pull request
Aug 23, 2026
TestFlight archive/export/upload pipeline (T-020)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ship the app to a device owner (Dan) via TestFlight. Bundle ID + team were already in
project.yml; this adds the missing distribution pipeline and the two Info.plist keys AppStore ingestion requires. Verified end to end — build 45 uploaded to App Store Connect
successfully.
What's here
Tools/build-testflight.sh—xcodegen→ archive (Release, generic/iOS) → export theApp Store
.ipa→ optional--uploadviaaltool+ an App Store Connect API key. Buildnumber = git commit count (unique + monotonic without editing
project.yml).-allowProvisioningUpdatesmints the distribution cert/profile on first run.Tools/ExportOptions.plist—app-store-connect, team5HR8E5CWR7, automatic signing,manageAppVersionAndBuildNumber=falseso our build number ships.docs/testflight.md— one-time App Store Connect setup, build/upload, inviting a tester(internal vs external + public link), and the gotchas (90-day build expiry, the Local
Network permission prompt).
project.yml— two ingestion-required Info.plist keys:UISupportedInterfaceOrientations(+~ipad) — an iPad-capable bundle must declareorientations or ingestion rejects it (error 90474).
ITSAppUsesNonExemptEncryption: false— the app uses only plain HTTP + the OS's TLS(both exempt), so this pre-answers the export-compliance question on every future build.
Verification
Ran the pipeline against a real account: ARCHIVE SUCCEEDED, EXPORT SUCCEEDED, and
altoolUPLOAD SUCCEEDED (build 45, Delivery UUID recorded). The build processed cleanly inApp Store Connect (icon, orientations, encryption compliance all accepted).
https://claude.ai/code/session_01F7YsQgso3KNpeXbP5vNVj6