Published · 2d agoBuild3 min read
The App Store bottleneck is not the build, it is the 2FA prompt sitting inside your CI job
A developer running 12 iOS apps swapped fastlane's expiring session cookies for a non-expiring App Store Connect API key. The trap on the way there comes back as a silent 401.
Written for builders.See today for builders
What happened
- The author states he currently manages 12 iOS apps.
- When shipping iOS apps in volume, the bottleneck is not development but submission.
- The manual submission sequence is: open Xcode, click Archive, log into App Store Connect, wait for the 2FA SMS, pick a build, hit 'Submit for Review'.
- For a single app the manual sequence is no big deal, but once managing five or ten apps at once it becomes pure recurring labor, every week.
- Anything that depends on 2FA cannot be handed to a bot.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
A developer writing on dev.to has published the auth layer of a pipeline that puts iOS apps into App Store review without anyone logging into App Store Connect, and the interesting part is not the automation but the diagnosis: he argues the bottleneck in shipping iOS apps at volume is submission, not development [2]. That matters because the standard tool for the job, fastlane's `deliver`, is built on a session cookie, and when the cookie expires it fires an interactive auth prompt, which on CI is a dead end [6].
Look at the manual path he describes: open Xcode, click Archive, log into App Store Connect, wait for the 2FA SMS, pick a build, hit Submit for Review [3]. For one app that is a nuisance. At five or ten apps managed at once it becomes recurring labor, every week [4]. The structural point is sharper than the tedium: anything that depends on 2FA cannot be handed to a bot [5]. A human has to be awake and holding a phone.
The replacement is an App Store Connect API key, the `.p8` file. Issue it once and you can call the API without two-factor authentication, and it does not expire until you explicitly revoke it [7]. According to the author, that single property is what lets an agent run "submit for review" at 2 a.m. with no one present [8]. He says he manages 12 apps, some shipping a new version the same day, and that a shell loop over an `app_ids.txt` file submits all of them in parallel while he drinks coffee [1][9]. His framing: opening Xcode every time is a task, whereas "anyone (or anything) with the API key can submit" is an environment [19].
Storage is two files under `~/.appstoreconnect/`: a `keys.json` holding `key_id`, `issuer_id` and `key_path`, plus the `.p8` private key itself, which App Store Connect lets you download exactly once [14]. The submission tool he uses is 272 lines of Python exposing three verbs, `apps`, `status` and `submit`, and he says it covers nearly every operation the review lifecycle needs [13]. It sits as layer three of a three-layer split: `xcodebuild archive` or `eas build --local` for the binary, `eas submit` for transfer, then the API client for state checks, metadata edits and review submission [12].
Now the part worth budgeting time for. Apple's ES256 JWT requires the raw r-concatenated-with-s signature encoding defined in RFC 7518, and Python's crypto library returns DER by default, so passing it through unchanged guarantees a broken token [10]. The API does not say "invalid signature." It returns 401 Unauthorized, which makes the cause invisible on first contact [11]. The author's headline puts the cost of that at two hours [18].
Treat the revenue arc around this with the usual caution: it is self-reported and single-sourced. He describes going from roughly 100,000 yen a month as a student to 600,000 by stacking side gigs, then to zero after a layoff, then past 1.2M a month six months later around an autonomous Claude Code setup [15]. That is double his pre-layoff peak [17], and he attributes it to increasing the number of things that work in his place rather than his own hours [16].
What to watch: whether the promised part two publishes the JWT signing code, since the DER-versus-raw detail is the whole difficulty [10]. And a governance question the piece does not address: a credential that never expires and needs no second factor is exactly as durable in someone else's hands as in yours [7].
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
The author states he currently manages 12 iOS apps.
- [2]
When shipping iOS apps in volume, the bottleneck is not development but submission.
- [3]
The manual submission sequence is: open Xcode, click Archive, log into App Store Connect, wait for the 2FA SMS, pick a build, hit 'Submit for Review'.
ReportedView cited source - [4]
For a single app the manual sequence is no big deal, but once managing five or ten apps at once it becomes pure recurring labor, every week.
ReportedView cited source - [6]
fastlane's deliver is convenient, but every time the session cookie expires an interactive auth prompt fires, which on CI is a dead end.
ReportedView cited source
Sources & coverage · 1 publisher
The reporting this story was synthesized from, earliest first. Every link goes to the original.
- dev.toLily2d agoTwo Hours Lost to a Silent 401: Submitting 12 iOS Apps to the App Store With No Human in the Loop (Part 1)
Cited in this coverage: dev.to post by the author

