Skip to content

The Card Place iOS gets ready for the App Store: listing in the repo, privacy manifest, screenshots by script - #203

Merged
kellylford merged 6 commits into
mainfrom
cardplace-ios-appstore
Oct 8, 2026
Merged

kellylford merged 6 commits into
mainfrom
cardplace-ios-appstore

Conversation

@kellylford

@kellylford kellylford commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Part of #202. The list of what was missing is in the comment on the issue.

What this adds

  • The store listing, as files to review. thecardplace/ios/store/en-US/ has one text file per field: description, keywords, subtitle, promotional text, and the notes for App Review. store/app-store.json has the rest: copyright, manual release, the category (Games, with Card and Board as subcategories), URLs, content rights, the review contact, the age rating answers (all None, so 4+), Accessibility Nutrition Labels, and price.
  • scripts/wire-appstore.py compares the listing in the repo with what App Store Connect has, and prints every difference. It only writes with --apply. Price and availability also need --set-price. --publish-accessibility publishes the accessibility labels, which Apple only allows once the app is on the store.
  • A privacy manifest, PrivacyInfo.xcprivacy: no tracking, no data collected, and UserDefaults declared (reason CA92.1) for the settings.
  • Screenshots by script. scripts/take-screenshots.sh runs the UI tests on a 6.9" iPhone and a 13" iPad simulator and keeps the screenshots they take in each game. scripts/upload-screenshots.py replaces each device's set.
  • thecardplace/privacy.html, a privacy policy page. It and the Card Place page's footer give support@theideaplace.net.
  • American spelling in everything a player or reader sees: the app's hub and help text, the store text, the Card Place and euchre pages, and the READMEs. Code comments and names such as sameColour are unchanged. The multiplayer forks' READMEs are left for a separate branch, because the fork guard refuses a branch that changes both a stable game and its fork.
  • The app's own text changed, so this is build 5.
  • RELEASE.md gets an App Store release section.
  • Two test fixes found while taking screenshots. The euchre UI test failed whenever the player was dealer and a computer ordered the card up straight away. And screenshots now wait for a changing label to finish its cross-fade.

Done in App Store Connect, with Kelly's go

  • Build 5 uploaded, processed, and chosen for version 1.0.
  • All of the listing written. A second pass of wire-appstore.py finds nothing left to change.
  • Free, in all 175 territories and any Apple adds later.
  • 12 screenshots uploaded; all processed.
  • Accessibility labels saved as drafts. They're published after release.

Left for Kelly

  • Merge this PR. That publishes the privacy page the listing points at, so it has to happen before submitting.
  • On the App Store Connect website, App Privacy: "Data Not Collected", then Publish.
  • Add for Review, then Submit.

Testing

  • swift test for the engines: no failures.
  • take-screenshots.sh on both devices runs every UI test; they all passed on the iPhone 17 Pro Max and iPad Pro 13" (M5) simulators. All twelve screenshots are the required sizes. I looked at them, including the hub's "its color partner".
  • The web game checks all pass on this PR.

🤖 Generated with Claude Code

kellylford and others added 4 commits October 8, 2026 15:09
… privacy manifest, screenshots by script

The store listing lives in thecardplace/ios/store/ the way the TestFlight test
information lives in wire-testflight.py: the prose as one text file per field,
everything else in app-store.json. scripts/wire-appstore.py shows what differs
from App Store Connect and only writes with --apply; price and availability
need --set-price as well.

The build gains PrivacyInfo.xcprivacy (no tracking, nothing collected,
UserDefaults for the settings, CA92.1) and goes to build 4.

scripts/take-screenshots.sh runs the UI tests on a 6.9" iPhone and a 13" iPad
simulator, which it creates if missing, and keeps the moments they already
photograph; upload-screenshots.py replaces each device's set. The euchre test
no longer fails when we deal and a computer orders up at once, and screenshots
wait out a label's cross-fade.

thecardplace/privacy.html is the privacy policy the listing points at, linked
from the Card Place footer. RELEASE.md gains an App Store section.

Part of #202.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…l on the pages; build 5

Color, behavior, favorite, summarized, recognize, labeled and the rest, in the
iOS app's hub and help text, the store description, the Card Place and euchre
pages, and the READMEs. Code comments and names such as sameColour are left.

The privacy page and the Card Place footer give support@theideaplace.net.
The description loses its last paragraph about the web games.

The app's own text changed, so this is build 5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fork guard refuses a branch that changes a stable game and its fork
together; the spelling fix for these three files will go in separately.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…er release

App Store Connect takes Card and Board only as subcategories of Games.
Accessibility declarations stay drafts until the app is on the store, so
publishing them is a separate step, --publish-accessibility.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kellylford and others added 2 commits October 8, 2026 16:49
…t upload, idempotent price

From an independent review of this branch:

- The App Review and TestFlight contact (name, phone, email) is read from
  ~/.thecardplace-keys/review-contact.json; neither script nor app-store.json
  carries it any more.
- upload-screenshots.py uploads the new set before deleting the old one, and
  waits for Apple to finish processing, stopping on any that fail.
- wire-appstore.py --set-price skips the price and availability when they are
  already free everywhere, instead of posting them again; a missing app info
  localization is an error rather than a silent skip.
- The euchre UI test accepts a computer ordering up at once on later hands too.
- take-screenshots.sh sorts runtimes by version number and clears the status
  bar override however it exits.
- The privacy page dates itself American-style and says the web games keep
  their settings in the browser.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Uploading six new beside six old would be refused at the eleventh. Only the
old ones that leave no room are deleted first; the rest go after the new set
has processed. Found in review, and run for real against both sets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kellylford

Copy link
Copy Markdown
Collaborator Author

Independent review by a separate agent: no blocking bugs. Fixed from it: contact details read from outside the repo; screenshot sets replaced within Apple's 10-per-set limit and only after the new ones finish processing (run for real on both sets); price and availability skipped when already set; euchre later-hand flake; screenshot script runtime sort and status-bar trap; privacy page date and browser-settings note. A second pass of the reviewer confirmed the fixes. All checks pass.

@kellylford
kellylford merged commit 2bdd0f6 into main Oct 8, 2026
8 checks passed
@kellylford
kellylford deleted the cardplace-ios-appstore branch October 12, 2026 22:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant