App ships universal (iPhone+iPad), so the App Store requires iPad
screenshots. Render the 3 store screens at 2048x2732 (iPad 12.9"/13").
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drop the In-App Purchases section from the privacy policy and the
'Remove Ads' bullet from the store description, since the app now ships
ad-supported only. Renumber policy sections; bump policy date to Jun 15.
Redeployed the policy to block-seasons.web.app.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The developer is an individual without a Korean business registration, so
the App Store / Play paid-apps (merchant) agreements can't be completed.
Hide the Remove Ads + Restore tiles and skip IAP init; ads always show.
AdMob revenue is independent of those agreements. Reversible: flip
kIapEnabled to re-enable once a merchant agreement exists. Bump to build 2;
drop the now-unused IAP review-screenshot generator.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Headless render of the Settings screen showing the Remove Ads purchase
point + price + Restore Purchases, for the App Store IAP review-screenshot
requirement. Forces a desktop target platform so the real IapService can
be constructed without the store plugin making async channel calls.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replaces the default Firebase placeholder so the App Store support and
marketing URLs (https://block-seasons.web.app) show a real Block Seasons
page. Deployed to Firebase Hosting root as index.html.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Deployed privacy-policy.html and app-ads.txt to block-seasons.web.app
(gru.farm root is an external site builder, not the NAS, so app-ads.txt
could not live there). Updated phase7 guide with the live URLs.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Headless screenshot harness renders Home, Gameplay, and a denser
score-chase board to PNGs at 1290x2796 (iOS) and 1080x1920 (Android),
in English with a real font loaded. Captures the boundary layer at 3x
inside runAsync (the only way it completes under the test binding).
Season-map cut deferred — its scrollable build stalls headlessly.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rewrote the Phase 7 guide to reflect completed Play setup (app, AAB,
payments profile, remove_ads) and lay out remaining ordered steps for
both stores with copy/answers inline. Added a hostable bilingual
privacy policy page and a 512x512 Play store icon.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Step-by-step owner guide to register the AdMob apps + 6 ad units, create the
remove_ads IAP in both stores, and the exact values to send back so the
TODO_REAL_* ad ids and native AdMob app ids get swapped in.
The flutter_test default font draws every glyph as a box, so the wordmark was
unreadable. Load the OFL Titan One TTF via FontLoader in the generator and
render 'Block Seasons' + tagline with it; fit the text within the 1024 width.
Font used only by the asset generator, not bundled in the app.
Firebase Analytics SDK initialized on the iOS simulator; debug build renders
gameplay and (per system log) disables GA4 collection. Evidence for the
analytics wiring milestone.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pure advanceStreak (1-day grace none, milestone flags at 3/7/14/30),
persisted in the save blob; StreakNotifier advances on every finished
attempt; home screen flame chip and milestone snackbar. Fix flutter
create's camelCased iOS bundle id and underscored Android application
id to the agreed lowercase form before any store registration.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>