Repository navigation
feat(release): publish fastlane changelogs and screenshots to Play - #59
Merged
mikebarkmin merged 1 commit intoAug 29, 2026
Merged
Conversation
`fastforge publish --targets playstore` only uploads the bundle and names the track release — it never calls the Play API for release notes or the store listing, so the changelogs `changelog.yml` has been generating into `fastlane/metadata/android/en-US/changelogs/` only ever reached F-Droid, and the screenshots never left the repository. Replace it with `fastlane supply`, which uploads the bundle and the whole metadata tree in a single Play edit, so the listing cannot drift from the binary it ships with. It reads the same fastlane layout that is already here, and picks the changelog matching the uploaded version code, which is the scheme `version_code.txt` already produces. The tree cannot be handed to Play unchanged: release notes are capped at 500 characters (three committed ones are over), screenshots may not carry an alpha channel, and their longest side may be at most twice the shortest — the phone screenshots are 1080x2424, or 1:2.24. Rather than degrade the F-Droid assets, `tool/prepare_play_metadata.py` writes a normalised copy that only Play sees: notes trimmed on a bullet boundary, screenshots flattened to RGB and letterboxed by repeating their edge pixels, so the padding continues the app bar instead of adding black bars. Anything hand-written that Play would reject, such as a title over 30 characters, fails the job instead of being silently fixed. Keeping the committed screenshots untouched also leaves `tool/build_site.sh`, which copies them onto the landing page, unaffected. Add `de-DE/changelogs/default.txt` so the German listing gets release notes rather than an empty "What's new"; the generated changelog is English only.
mikebarkmin
deleted the
claude/fastlane-google-play-changelog-screenshots-sf7ja4
branch
August 29, 2026 08: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.
Why
fastforge publish --targets playstoreuploads the bundle and names the track release — and nothing else. Readingcrates/app_publisher/src/playstore/mod.rs,perform_publishdoesinsert_edit→upload_bundle→update_track(body is just{track, releases:[{name, versionCodes, status}]}) →commit_edit. It never setsreleaseNotesand never callsedits.imagesoredits.listings.So
fastlane/metadata/android/has only ever been read by F-Droid. The "What's new" section in Play was empty because nothing was ever sending it.What changed
publish-playstorenow runsfastlane supplyinstead offastforge publish. Supply uploads the AAB and the whole metadata tree in a single Play edit, so the listing can't drift from the binary it ships. It reads the layout that already exists and pickschangelogs/<version code>.txtmatching the uploaded bundle — exactly whatversion_code.txt+changelog.ymlalready produce. Java, Flutter and Fastforge are dropped from the job (supply reads the version code from the upload response); Ruby and Pillow are added.The committed tree can't go to Play as-is, which is what
tool/prepare_play_metadata.pyis for:26.txt571,33.txt728,37.txt668Degrading the committed assets to Play's lowest common denominator would also hit
tool/build_site.sh, which copies those same screenshots onto classi.openpatch.org. So the script writes a normalised copy that onlysupply --metadata_pathconsumes:33.txt: 728 → 476, whole bullets intact)Anything hand-written that Play would reject — title over 30 chars, more than 8 screenshots per form factor, a wrong-sized icon — is a hard error rather than a silent fix, because that should be a human decision.
de-DE/changelogs/default.txtis added because the generated changelog is English-only, and supply would otherwise push an empty "What's new" to the German listing.Before merging
--validate_onlydry run that shows what would be sent without committing to Play.de-DE/changelogs/default.txtis placeholder German. Every German release gets the same "Fehlerbehebungen und Verbesserungen" text until per-releasede-DE/changelogs/<code>.txtfiles exist orchangelog.ymlemits both locales.Testing
tool/prepare_play_metadata.pyruns clean against the real tree (exit 0), plus synthetic edge cases: landscape padding, a 5000 px oversize, an undersized image, an over-length title, and 9 screenshots in one form factor. The letterbox output was rendered and inspected — the padding is not visible.The Play API round-trip is unverified; it can't be exercised outside a tagged release. The first release after this merge is the real test.