release: prepare the 1.0 App Store submission - #16
Merged
Merged
Conversation
Lower the deployment target from iOS 26.5 to 26.0. Nothing in the codebase requires a 26.x point release: the only version gates are @available(iOS 26, *) and two #available(iOS 18.0, *) checks, and all 25 Liquid Glass call sites across 19 files are valid from 26.0 onward. Holding at 26.5 excluded every 26.0-26.4 install for no compile-time reason. Add docs/APP_STORE_RELEASE_KIT.md — every App Store Connect field in the order Connect asks for it, as copy-paste blocks with validated character counts (name 25/30, subtitle 30/30, promotional text 153/170, keywords 97/100, description 2467/4000). Covers both en and es, since shipping a Spanish string catalog obliges Spanish store metadata and Spanish subscription localizations. Also the privacy nutrition labels, the subscription products with their required per-locale display names, the reviewer notes, and a checklist split by who can actually act on each item. Add docs/TESTFLIGHT_RELEASE.md — beta app description, the What to Test message for testers, the archive/upload sequence, and what must change before a TestFlight build can be promoted to the App Store. Keywords deliberately avoid repeating anything already in the app name or subtitle; Apple indexes those fields already, so repetition wastes the 100-character budget.
Everything needed for the 1.0 submission: release kit metadata for App Store Connect (name, subtitle, keywords, description, both in English and Spanish, all validated against Apple's character limits), a TestFlight guide with the What to Test message for beta testers, a marketing kit with launch copy for social platforms and Product Hunt, a privacy policy, and a terms of use page covering the auto-renewable subscription. Also fixes something that predates this work: .gitignore had a blanket docs/ rule from an earlier commit whose stated purpose was untracking screenshot binaries. That rule silently excluded the entire docs folder, including MONETIZATION_GOLIVE.md and IOS_VERSION_STRATEGY.md, both of which the project's own CLAUDE.md links to as if they were part of the tracked repo. None of it ever reached GitHub. Narrowed the rule to the two files that are genuinely internal audit logs.
AppSupportLinks pointed at sunhat.app for the privacy policy and terms URLs. That domain is not ours. It resolves to an unrelated product with its own backend, analytics, and support tooling. The site the app actually ships with is sunhat.apphq.online, where the privacy policy is already live. Also fixes a hardcoded support@sunhat.app in the in-app data recovery banner, a real user-facing message with the same wrong domain baked in as plain text rather than read from AppSupportLinks. Replaced with the support email the rest of the app already uses.
The active-subscription and billing-grace-period footers in the Ad-Free settings section used em dashes. Rewrote both as plain sentences and rekeyed the two String Catalog entries to match, keeping the existing Spanish translations, which never used an em dash and needed no change.
The project is not using Xcode Cloud, so the CI_BUILD_NUMBER branch in the Release build phase never ran. Simplified to the one path that does: read buildnumber.txt, increment it, write the result into CFBundleVersion.
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.
Everything needed to submit 1.0, plus one code change.
Deployment target: iOS 26.5 → 26.0
Nothing in the codebase requires a 26.x point release. The only version gates are
@available(iOS 26, *)and two#available(iOS 18.0, *)checks, and all 25 Liquid Glass call sites across 19 files are valid from 26.0 onward. Holding at 26.5 excluded every 26.0–26.4 install for no compile-time reason.docs/APP_STORE_RELEASE_KIT.mdEvery App Store Connect field, in the order Connect asks for it, as copy-paste blocks. Character counts validated:
SunHat: Weather RemindersForecast alerts for your plansAlso covers the age-rating questionnaire (including the third-party-advertising answer that matters), privacy nutrition labels split by tracking status, both subscription products with the per-locale display names Connect requires, reviewer notes, export compliance, and a checklist split by who can actually act on each item.
Spanish metadata is included because shipping a Spanish string catalog obliges Spanish store metadata and Spanish subscription localizations — a missing one is an automatic review flag.
Keywords deliberately avoid repeating anything already in the name or subtitle. Apple indexes those fields already, so repetition burns the 100-character budget.
docs/TESTFLIGHT_RELEASE.mdBeta app description, the What to Test message for testers, the archive and upload sequence, tester group setup, and what must change before a TestFlight build can be promoted to the App Store.
Still owned by you
NSPrivacyTrackingDomainsis empty and Apple expects it non-empty wheneverNSPrivacyTrackingistrue. That plus the three real AdMob IDs, the two subscription products, and the hosted legal pages are all listed in the kit's §9 checklist.