Take the store screenshots during the release, and upload them - #164
Draft
andiwand wants to merge 1 commit into
Draft
Take the store screenshots during the release, and upload them#164andiwand wants to merge 1 commit into
andiwand wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6de18f86bd
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
andiwand
force-pushed
the
claude/app-screenshots-metadata-ul8mq3
branch
from
August 16, 2026 15:09
6de18f8 to
ab5d603
Compare
andiwand
force-pushed
the
sync-the-test-folder
branch
from
August 16, 2026 15:09
9caa01b to
1ddc055
Compare
andiwand
force-pushed
the
claude/app-screenshots-metadata-ul8mq3
branch
from
August 16, 2026 15:40
ab5d603 to
d6323f4
Compare
The store copy is written and committed; the pictures beside it were made by hand, and the eleven storefronts shared one English set of them. A screenshot is not written, it is taken: it is worth what the build it came off is worth, and a picture of 1.38 sitting in git through 1.41 is a picture of an app nobody can install. So they are taken during the release run, from the build going out, and handed to deliver from there. The run archives the set it took, on a dry run too, which is how to look at them before the store does. `fastlane ios screenshots` drives the app on a 6.9" iPhone and a 13" iPad in the nine store locales the app is translated into; hi and sv are given the English set, because the app has no UI in either. Four pictures each: the onboarding pages, a text document, a spreadsheet with its sheet tabs, and a presentation. Nothing is tapped to get there. The document browser is Apple's UI in eleven languages, so the app takes `-ODRScreenshot <screen>` in Debug builds and puts itself on that screen instead - one launch per picture, each waiting on the view saying it has something to show rather than on a number of seconds. The documents are localized too, which is most of what a reader has to show, and small enough to be worth generating: `scripts/make-screenshot-documents.py` writes twenty-seven packages of about 1.7 KB, and `EXCLUDED_SOURCE_FILE_NAMES` keeps them out of the archive that ships. `scripts/store-screenshots.py` owns what a full set is - which locales, which screens, and the sizes App Store Connect accepts, read off each PNG rather than off the simulator's name, since that changes with every Xcode. The `listing` job stages the set for both apps: they are one app built twice, and the banner Lite carries is not in a screenshot either way. A listing upload with nothing captured still writes the text, so fixing a word does not cost a quarter hour of simulators. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YANh5F8FnQHJUrPL2TiFn4
andiwand
force-pushed
the
claude/app-screenshots-metadata-ul8mq3
branch
from
August 16, 2026 15:50
d6323f4 to
35e717e
Compare
andiwand
marked this pull request as draft
August 16, 2026 16:02
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.
Stacked on #163, which carries #162. The diff is the one commit; the store copy and the test folder are those two.
The copy beside them is written, so it lives in git and the release uploads what is committed. A screenshot is not written, it is taken: it is worth what the build it came off is worth, and a picture of 1.38 sitting in git through 1.41 is a picture of an app nobody can install. So these are taken during the release run, from the build going out, and handed to
deliverfrom there. Nothing is committed;.gitignorealready said as much.bundle exec fastlane ios screenshotsWhat a set is
Four pictures per device — the onboarding pages, a text document, a spreadsheet with its sheet tabs, and a presentation — on a 6.9" iPhone and a 13" iPad. Both, because an app that runs on both has to hand in both.
Nine of the eleven store locales are photographed in their own language.
hiandsvare given the English set, because the app has no Hindi or Swedish UI either — copied in rather than left out, since a localedeliveruploads nothing for keeps whatever the last release put there.Nothing is tapped to get there
The way to a document is the document browser, which is Apple's UI in eleven languages and a different tap in each. So the app takes
-ODRScreenshot textin Debug builds and puts itself on that screen: one launch per picture, and each waits for the view to say it has something to show rather than for a number of seconds — translating a document takes as long as the simulator takes.ScreenshotMode.swiftis the whole of it, and it readsnilin a Release build.The documents in the pictures are localized too, which is most of what a reader has to show.
scripts/make-screenshot-documents.pywrites 27 packages of about 1.7 KB, byte for byte reproducible so a rerun that changes no wording leaves no diff, andEXCLUDED_SOURCE_FILE_NAMES = "sample-*"keeps them out of the archive that ships. Their wording is short and plain on purpose — it is a document over someone's shoulder, not copy that has to sell anything.The release run
A
screenshotsjob besidebuildrather than behind it: it signs nothing, it just drives simulators, and it takes about as long. It runs on a dry run too, and archives the set as an artifact — which is how to look at the pictures before the store does.scripts/store-screenshots.pyowns what a full set is: which locales, which screens, and the sizes App Store Connect accepts. It reads the size off each PNG rather than trusting the simulator's name, because what a simulator is called changes with every Xcode and how many pixels it has does not; theFastfilelooks for the newest one the runner has and says what is installed instead when it finds none. Thelistingjob then stages the set for both apps and uploads it with the text it already uploads.Both apps get the same pictures. They are one app built twice, and the one thing that differs on screen — the banner Lite carries — is not in a screenshot either way. The set is taken with the Pro scheme, which links no ad sdk and so cannot raise a consent form in front of the camera.
A listing upload with nothing captured writes the text alone, so fixing a word in a description by hand does not cost a quarter hour of simulators. A release run always captures first, so it always sends both.
Checked
hiandsvcome out ofen-US, and the staged names sort into the order the store showsmimetypefirst and uncompressed, well formedcontent.xml,styles.xmland manifestFastfileparses and the simulator resolution picks the right two out of realsimctl list devicesoutputproject.pbxprojreopens with the UI test target, its dependency, its sync group andTEST_TARGET_NAMEintactscripts/format.shnow skipsSnapshotHelper.swift, which is fastlane's file kept as they ship it (MIT, not our MPL); every other Swift source stays in the checkTwo things a Linux container cannot do: compile the UI test target and look at what comes out. So
build_testnow builds the screenshot target on every pull request — a target that no longer compiles should not wait for a release to say so — and the firstdry_runrelease run is the first look at the pictures. Expect to iterate once on framing there.One more thing worth a second pair of eyes: the sample documents are worded in nine languages by me, and did not get the translator-and-reviewer pass the store copy in #162 got.
🤖 Generated with Claude Code