A small, native macOS app that publishes your iOS apps to TestFlight or the
App Store — pick an app, choose a version, hit upload. FlightKit drives
xcodebuild and the App Store Connect API for you (archive → export → upload →
wait for processing → optional App Store version attach), with a self‑healing
pipeline and a clear, copyable log.
No Xcode Organizer dance, no manual
altool. One window, one button.
- TestFlight or App Store per run. App Store additionally attaches the processed build to an editable App Store version (created if missing) — it is not submitted for review.
- Multiple environments per app (e.g. Test / UAT / Prod, each a configuration + bundle id) — publish one, or All in sequence.
- App Store Connect API key signing — uses your
.p8to create cloud‑managed distribution certificates & profiles; no interactive Apple ID needed. - Self‑healing pipeline — common failures (missing exportOptions, signing fallback, stale archive, package resolution) are retried automatically.
- Publish report — what you submitted vs what App Store Connect actually recorded, flagged if the store renumbered the build.
- Native log console — full text selection, ⌘F, follow‑tail toggle.
- Your apps and API keys stay on your machine (catalog in Application Support, keys in the Keychain).
brew tap ersel95/flightkit https://github.com/ersel95/FlightKit
brew install --cask flightkit- Open Releases and download
the latest
FlightKit-<version>.dmg. - Double‑click the
.dmgto mount it. - Drag FlightKit onto the Applications shortcut in the window.
- Eject the disk image and launch FlightKit from Applications (or Launchpad).
Release builds are signed with a Developer ID and notarized by Apple, so they launch on any Mac with no Gatekeeper warning — even offline (the notarization ticket is stapled). Nothing extra to run.
(Only builds you compile yourself from source are unsigned. If macOS ever blocks one, clear the quarantine flag:
xattr -dr com.apple.quarantine /Applications/FlightKit.app.)
- Add an app — pick its
.xcworkspaceor.xcodeproj, set the scheme, Team ID, and one or more environments (configuration + bundle id). - Configure the API key — App Store Connect → Users and Access → Integrations →
App Store Connect API. Create a key (Admin or App Manager) and paste the Key ID,
Issuer ID and
.p8contents. Stored in your Keychain. - Choose destination (TestFlight / App Store) and environment (or All).
- Set the marketing version and build number (Suggest next picks a safe one) and Upload.
- macOS 14+, Xcode 15+ installed (FlightKit shells out to
xcodebuild). - A valid App Store Connect API key. Creating cloud‑managed distribution certificates needs the Admin role; App Manager can upload but may not be able to create new certificates.
The Xcode project is generated from generate_pbxproj.py (so it never drifts and
isn't committed):
python3 generate_pbxproj.py # writes FlightKit.xcodeproj
open FlightKit.xcodeproj # or:
scripts/build-app.sh Release # -> dist/FlightKit.app
scripts/build-dmg.sh 1.0.0 # -> dist/FlightKit-1.0.0.dmgPush a tag and CI builds the DMG, publishes a GitHub Release, and bumps the Homebrew cask:
git tag v1.0.0 && git push origin v1.0.0MIT — see LICENSE.