e5b81f46b0
Closes the remaining store-compliance gaps before App Store / Play submission: - Account deletion (App Store guideline 5.1.1): DELETE /me removes the user row (usage cascades). The app exposes it through one quiet 'Account' caption link under the chat, visible only when signed in, driving two native dialogs (Sign out / Delete account with a destructive confirm) — no new views, no menus, minimalism intact. Deletion signs out and resets the app; copy notes that store subscriptions are cancelled in App Store / Play settings. - docs/store/privacy-policy.md: the complete data inventory (matching the actual schema), transient OpenAI processing with no training, no profiling or ads, GDPR legal bases and rights, in-app erasure. - docs/store/terms-of-service.md: not-therapy positioning with crisis guidance, AI-generated-content caveat, 18+ eligibility, auto-renewal/cancellation terms, liability, Swedish governing law. - docs/store/listing.md: App Store and Play copy written to the honest-claims rule (subtitle 'Think Beyond Thought', keywords, descriptions), plus App Privacy and Data safety questionnaire mappings. - LAUNCH.md updated: host the policy/terms, set store URLs, use the prepared listing copy. - Tests: 30 passing (adds DELETE /me coverage). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0118DaxZR36RpnY524vRqx3z
90 lines
4.0 KiB
Markdown
90 lines
4.0 KiB
Markdown
# Launch checklist — closed beta
|
||
|
||
The path from this repo to 20–50 test users. Everything below is
|
||
configuration and store work; the code is done (see Definition of Done in
|
||
the README).
|
||
|
||
## 1. AWS
|
||
|
||
- [ ] `cd infra && npx cdk bootstrap` (once per account/region).
|
||
- [ ] `npx cdk deploy` — note the outputs: `ApiUrl`, `UserPoolId`,
|
||
`UserPoolClientId`, `CognitoDomain`.
|
||
- [ ] Fill the `semantika/app` secret in Secrets Manager:
|
||
`OPENAI_API_KEY` (required for chat), `APPLE_SHARED_SECRET` and
|
||
`GOOGLE_SERVICE_ACCOUNT_JSON` (required before purchases work).
|
||
- [ ] Run `db/migrations/001_init.sql` against the Aurora cluster
|
||
(credentials in the RDS-managed secret; connect via a bastion or the
|
||
RDS query editor).
|
||
- [ ] Smoke test: `curl <ApiUrl>/suggestions` returns the starter list.
|
||
|
||
## 2. Sign-in
|
||
|
||
- [ ] Email sign-in works out of the box (Cognito hosted UI).
|
||
- [ ] Apple: create a Services ID + key in the Apple Developer portal, then
|
||
redeploy with CDK context `appleTeamId`, `appleKeyId`,
|
||
`applePrivateKeySecretName`.
|
||
- [ ] Google: create an OAuth client in Google Cloud, then redeploy with
|
||
`googleClientId`, `googleClientSecret`.
|
||
- [ ] For the beta, email-only is acceptable — Apple/Google can land in a
|
||
later build. Note: Apple's review requires Sign in with Apple if
|
||
other third-party logins are offered, so enable it before public
|
||
App Store release.
|
||
|
||
## 3. App configuration
|
||
|
||
- [ ] Put the CDK outputs into `apps/mobile/app.json` → `extra`
|
||
(`apiUrl`, `cognitoDomain`, `cognitoClientId`).
|
||
- [ ] Keep product ids as `semantika_monthly` / `semantika_yearly`.
|
||
|
||
## 4. Stores
|
||
|
||
- [ ] App Store Connect: create the app (bundle id `com.semantika.app`),
|
||
add auto-renewable subscriptions `semantika_monthly` ($5.99/month)
|
||
and `semantika_yearly` ($49.99/year) in one subscription group.
|
||
Generate the App-Specific Shared Secret → `APPLE_SHARED_SECRET`.
|
||
- [ ] Play Console: create the app (package `com.semantika.app`), add the
|
||
two subscriptions with the same ids and prices. Create a service
|
||
account with Play Developer API access → its JSON key becomes
|
||
`GOOGLE_SERVICE_ACCOUNT_JSON`.
|
||
- [ ] Store copy: use `docs/store/listing.md` (already written to the
|
||
honest-claims rule — inspiration, not proven effects; reflection
|
||
partner, not therapy).
|
||
- [ ] Fill the [PLACEHOLDERS] in `docs/store/privacy-policy.md` and
|
||
`docs/store/terms-of-service.md`, host them on a public URL (GitHub
|
||
Pages is enough), and set the URLs in both store consoles.
|
||
- [ ] App Privacy / Data safety forms: mappings are in
|
||
`docs/store/listing.md`. In-app account deletion (App Store 5.1.1)
|
||
is implemented: Account → Delete account.
|
||
|
||
## 5. Builds
|
||
|
||
- [ ] `cd apps/mobile && npx eas build --profile preview --platform all`
|
||
(in-app purchases require a real build, not Expo Go).
|
||
- [ ] iOS: distribute via TestFlight (internal, then external testers).
|
||
- [ ] Android: distribute via Play Console internal testing track.
|
||
- [ ] Purchases in test: use TestFlight sandbox accounts / Play license
|
||
testers — no real charges.
|
||
|
||
## 6. CI/CD
|
||
|
||
- [ ] Create the GitHub OIDC deploy role in AWS; set repo secret
|
||
`AWS_DEPLOY_ROLE_ARN` (and optionally the `AWS_REGION` variable).
|
||
- [ ] Merge this branch to `main` — CI runs lint/typecheck/tests,
|
||
`deploy.yml` deploys the stack automatically.
|
||
|
||
## 7. The beta itself (20–50 users)
|
||
|
||
Measure before building anything new:
|
||
|
||
- **Do they come back?** — active users over time (`usage` activity).
|
||
- **How deep do dialogues go?** — `messages_used` distribution.
|
||
- **When do they upgrade?** — `subscription` transitions relative to
|
||
`created_at`.
|
||
- **Which starter questions create value?** — conversations are never
|
||
stored, so ask the testers directly (short interviews or a 3-question
|
||
survey beats analytics here).
|
||
|
||
Exit criteria for V1 → V2 decisions: a clear picture of retention, dialogue
|
||
depth, upgrade timing, and which conversation types resonate. Only then
|
||
open the Version 2 list.
|