Skip to main content
Everything under flowdeck ship needs two things: an App Store Connect account FlowDeck can authenticate as, and a repository that knows which app record it belongs to. This page covers both.
Both are read-only and safe to run at any time. Together they answer “can this project ship, and where to”.

One credential, and it is an API key

FlowDeck never asks for an Apple ID password. The only credential it stores is an App Store Connect API key you create yourself, kept in your login keychain. That is deliberate. An Apple ID gives away your entire Apple account; an API key is scoped to App Store Connect, revocable on its own, and documented, so it does not break when Apple changes something private. Create one in App Store Connect under Users and Access › Integrations, and download the .p8 file. Apple lets you download it once.

Connecting an account

The key is checked against Apple before anything is stored. A key that cannot authenticate, or that lacks permission to read apps, is refused rather than saved for you to discover later.
There is no --team-id. An API key belongs to exactly one account, and that account is exactly one team, so FlowDeck derives the Developer Team ID itself.

More than one account

Credentials are keyed by issuer ID, so a machine can hold as many as you have.
A project names its account explicitly, in .flowdeck/config.json. It is never inferred: two accounts can share a team, and the cost of guessing wrong is a build pushed to somebody else’s listing. If several accounts are connected and the repository has not chosen one, commands fail with shipAmbiguousAccount rather than picking for you.

Checking an account

isAdmin reports whether this key can create app records in App Store Connect, which is an Admin-only action on the web. It is a Bool?: absent means the check could not be made, not that you lack the permission.

Removing an account

This removes the keychain item and nothing else. The key itself stays live. A key cannot revoke itself and revocation is not in Apple’s public API, so revoke it in App Store Connect under Users and Access › Integrations when you mean to.

Linking a project to an app

An account can reach many apps. Linking records which one this repository ships to, in a small git-tracked file so the whole team inherits it.
Choosing the app is what chooses the account: --all-accounts tags each row with its issuer, so you do not have to know which account holds which app before you can pick one.

Where a project stands

An unlinked repository answers from local files alone, with no network call:
A linked one adds the app record and a row per platform:
currentVersion is the newest version in any state; liveVersion is the newest one on sale. They are equal when nothing new is in flight, and liveVersion is absent for a platform that has never shipped.

When the app record does not exist yet

Apple does not allow creating an app record through the API, for any key. It has to be done on the web. app init automates everything around that one step:
It registers the bundle ID through the API, prints the SKU to use, opens the App Store Connect form, then polls until the record appears and links it for you.
app init waits for a person to fill in a form. It is not suitable for CI or for an unattended agent run.

Next

With an account connected and a project linked, see TestFlight for building, uploading, and getting the build to testers.