Build1 distinct publisher3 min readUpdated
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.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
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].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
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'.
fastlane's deliver is convenient, but every time the session cookie expires an interactive auth prompt fires, which on CI is a dead end.
An App Store Connect API key (the .p8 file) removes the problem at the root: issue the key once and you can hit the API without two-factor authentication, and there is no expiration, as it lives until explicitly revoked.
Apple's ES256 JWT requires the raw r-concatenated-with-s encoding defined by RFC 7518; Python's crypto library returns DER by default, so using it as-is guarantees a broken JWT.
The failure from a wrongly encoded signature returns as '401 Unauthorized' rather than 'Invalid signature', so on first encounter the cause is completely invisible.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One self-published walkthrough, strong only where code is shown
A single dev.to post is the entire evidence base. Its strongest section is genuinely verifiable: the ES256 raw r‖s requirement, the named RFC 7518 section, the DER byte structure, and the verbatim _jwt() implementation can be checked independently, as can the printed keys.json layout. Everything else — 12 apps, a 272-line script not included in this part, autonomous 2 a.m. submissions, and the revenue figures — is unsupported self-report with no logs, Apple documentation links, or corroborating publisher.
One self-reported solo deployment
Adoption evidence amounts to a single practitioner disclosing his own setup across a claimed 12-app portfolio. There are no other users, no organizational deployments, no released package, and no submission records confirming that agent-triggered review submissions completed. The underlying App Store Connect API key mechanism is Apple platform functionality, but this cluster supplies no data on how widely it is used in place of fastlane session auth.
Credential swap dressed as an income multiple
The technical claims are proportionate and arguably understated in usefulness: the DER-versus-raw-r‖s trap and the opaque 401 are real, specific, and cheap to verify. The overstatement sits in the framing that wraps them — a non-expiring .p8 and a 272-line script are presented as the emblematic cause of a 12x, ¥1.2M-a-month revenue outcome, and autonomous 2 a.m. submission is asserted as demonstrated capability without a single completed-submission record. Net positive but modest, because the core mechanism does hold up.
Self-promotional practitioner post with a serialized hook
The author is the subject of the story and benefits from its spread: the piece opens and closes on his own monthly revenue figures, positions an 'autonomous Claude Code environment' as the cause, and is labeled Part 1 with an explicit promise to reveal the trap and the real code in the next installment. That is a clear engagement and personal-brand incentive on a community platform with no editorial gatekeeping. Offsetting it slightly, the technical content publishes working code and a specific failure mode rather than withholding everything behind the teaser.
Confident on mechanism, weak on everything claimed around it
Confidence is asymmetric. The credential and JWT-encoding mechanics are stated precisely enough, with code and a standard citation, to be trusted and tested. The portfolio scale, the agent autonomy, the tool's completeness, and the entire financial narrative rest on one self-interested source with a single publisher in the cluster, so overall confidence stays below the midpoint.
build
Split Flutter CI from CD, or pay macOS rates on every pull request1 distinct publisher
build
The prompt never arrived: a Windows batch shim was worth 15 of 24 runs in an agent eval1 distinct publisher
build
Pricing the three routes to shipping iOS without a Mac, honestly1 distinct publisher
build
A memory note is not a gate: blocking credential reads with a PreToolUse hook1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 20, 2026