Skip to content

release: prepare the 1.0 App Store submission - #16

Merged
weskcode merged 6 commits into
mainfrom
release/1.0-app-store
Sep 8, 2026
Merged

weskcode merged 6 commits into
mainfrom
release/1.0-app-store

Conversation

@weskcode

@weskcode weskcode commented Sep 8, 2026

Copy link
Copy Markdown
Owner

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.md

Every App Store Connect field, in the order Connect asks for it, as copy-paste blocks. Character counts validated:

Field Count Limit
Name — SunHat: Weather Reminders 25 30
Subtitle — Forecast alerts for your plans 30 30
Promotional text 153 170
Keywords 97 100
Description 2467 4000

Also 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.md

Beta 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

NSPrivacyTrackingDomains is empty and Apple expects it non-empty whenever NSPrivacyTracking is true. 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.

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.
@weskcode
weskcode merged commit 83899d3 into main Sep 8, 2026
1 check passed
@weskcode
weskcode deleted the release/1.0-app-store branch September 8, 2026 21:53
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