Repository navigation
[ios] Release configuration: icon and splash, real legal pages, EAS build profiles - #20
Merged
Merged
Conversation
Release configuration for the App Store build (refs #6). Icon and splash: generated from assets/generate-assets.py rather than hand-drawn, so the mark can be adjusted and re-rendered. The mark is a speech bubble with three rising dots — the product is coaches who message you, and the roster now spans drummers, songwriters and yoga instructors, so nothing about it is gym-specific. icon.png is written without an alpha channel because the App Store rejects icons that have one. Legal: mobile/app/(tabs)/settings.tsx pointed at https://cabofit.app/terms and /privacy, which do not exist. The webapp now serves /terms and /privacy as standalone unauthenticated routes, and the two documents were rewritten from the SMS-era text to cover what the app actually does: auto-renewing subscriptions billed per coach through the Apple ID (the disclosure App Review requires), and the reference photo the visualiser can use — stored, used only under an explicit likeness consent, deleted when that consent is withdrawn. EAS: eas.json adds development/preview/production build profiles, which `eas init` does not create. resolveProjectId() is documented and hardened to warn instead of silently minting no token.
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.
Refs #6. Does not close it — the acceptance criteria need
npx expo run:ioson a physical device, which I cannot run. See "What remains" at the bottom.Rebased onto
9324694, so the realextra.eas.projectIdfrom the owner'seas initis preserved untouched; myapp.jsondiff is only the icon/splash/adaptive-icon lines.Icon and splash
Generated, not hand-drawn:
mobile/assets/generate-assets.pyrenders all fourassets from one description, so the mark can be adjusted and re-rendered rather
than edited as a binary.
mobile/assets/icon.pngmobile/assets/adaptive-icon.pngmobile/assets/splash.pngresizeMode: containover#0B0B0Fso it fits any aspectmobile/assets/notification-icon.png#7C5CFFThe mark is a speech bubble with three rising dots. The product is coaches who
message you, and the roster is no longer fitness-only — drummers, songwriters,
yoga instructors — so there is deliberately nothing gym-shaped in it. The bubble
carries an amber → violet → cyan sweep, the same spread
tintForCategory()usesfor coach categories, on the app's
#0B0B0Fground.This needs the owner's eye before submission — it is the one thing here I
cannot verify by running a check.
Real legal URLs
settings.tsxpointed athttps://cabofit.app/termsand/privacy, which donot exist. The webapp now serves both as standalone unauthenticated routes
(
/terms,/privacy, viaLegalPage), andmobile/src/lib/legal.tspoints theapp at them, overridable with
EXPO_PUBLIC_LEGAL_BASE_URLwhen a custom domainappears.
The two documents were rewritten from the SMS-era text. They are shared with the
signup modals, so there is one version of each. Both cover:
expects: what the subscription unlocks and for how long, that the price is
shown on the coach's page before purchase, that payment is charged to the
Apple ID at confirmation, that it renews within 24 hours of the period end
unless auto-renewal is turned off at least 24 hours before, how to manage and
cancel it in Apple ID Account Settings, that unused free-trial time is
forfeited on purchase, and that deleting the app does not cancel anything.
[visualiser] Reference photo upload and likeness consent (V1) #11 describes: the reference photo is used to generate images of you, is
stored and linked to the profile, is used only while the separate likeness
consent is on (otherwise generations stay on the faceless scene-only model),
and withdrawing consent deletes the stored photo and immediately reverts later
generations. Explicitly not used for training, facial recognition, identity
verification, or biometric matching.
goals, push tokens, IAP receipts) and the real processor list (Supabase, GCP,
OpenAI, Replicate, Expo/Apple push, Stripe, Twilio for legacy SMS).
Two things to look at before submitting:
contact address and there is none in the repo — swap it for a support alias if
you would rather not publish that one.
mobile/src/lib/legal.tsdefaults to the deployed Cloud Run hostname(
workout-motivation-webapp-3sleoawqya-uc.a.run.app). The webapp has to beredeployed for
/termsand/privacyto exist — right now that host servesthe SPA fallback for those paths.
EAS build profiles
eas initdid not write aneas.json, so this adds one:development(devclient, internal distribution, device rather than simulator — the profile a
push-capable device build needs),
preview, andproductionwith anauto-incrementing build number.
resolveProjectId()innotifications.tsreadsConstants.expoConfig.extra.eas.projectIdfirst and falls back toConstants.easConfig.projectId; with the id now inapp.json, the first path isthe one that resolves for
expo run:ios, the second covers a build made by EASitself. It now warns when it resolves to nothing rather than quietly requesting a
token with no project.
Bundle id check (read-only)
Queried the App Store Connect API with the owner's key.
com.cabo.coachesisnot registered — the account holds 15 bundle ids and 6 apps, none under
com.cabo.*, and no app named Coaches. There is a wildcard*App ID, whichcannot be used for push or for App Store distribution. Registering it (with the
Push Notifications capability) belongs to #7; I created and modified nothing.
Checks
cd mobile && npx tsc --noEmit— clean.cd _infra && terraform validate— Success (afterterraform init -backend=false).cd webapp && npx vite build— builds, including the new routes.example_roster.sql, the function gateway, the mock model):viz-realtime-probe17/17,flow-probe31/34,rls-probe37/41.The 7 failures are in code this branch does not touch —
git diff origin/maincovers no file under
functions/,supabase/, ormobile/e2e/, and theprobes import nothing from the app source — so they are pre-existing here, not
regressions. For whoever chases them:
rls-probe×4: anonymous coach-detail join fails withpermission denied for table creator_profiles.…120100_creators_and_coach_subscriptions.sqlgrantsSELECT on that table to
authenticatedbut never toanon, so anunauthenticated browse of a coach cannot embed the creator.
flow-probe×3: the nudge-dispatcher section. Itsuser_profilessetup(
nudge_hour,quiet_hours_start/end) does not land, sodue_coach_nudgesreturns nothing and the sweep considers 0.
ports 8790/8791 were already taken; I had to run my gateway on another port,
which is why a first pass looked far worse than it was.
What remains
expo run:ioson a physicaldevice reaching the roster,
ensurePush()returning'granted', and a realExponentPushToken[...]row inpush_devices— is still outstanding. Theoriginal blocker (no project id) is gone; what is left is that I have no
device.
npx expo run:ios --device, oreas build --profile development --platform ios, is the run that closes it.com.cabo.coacheson the Apple Developer account ([iap] App Store Connect subscriptions, product mapping, and notification webhook (I2) #7). A devicebuild with push will not provision until it exists.
/termsand/privacyresolve before review.