# Shipping overview

This page covers shipping the **mobile app** to the app stores. The web tier
(marketing, brand, admin, **docs.drape.to**) ships via AWS Amplify — see
[Web deploys](./web-deploys.md). The **Mongo** backend deploys to Render (this
checklist's privacy URL still uses the Render host). The **Postgres** web API
deploys to ECS Fargate — see [Backend deploys](./backend-deploys.md) and the
[AWS system map](../architecture/aws-system-map.md).

The honest status for the mobile app: **iOS is close to submittable; Google Play
has had essentially no dedicated work.** Most of the app-side and code blockers are
already closed — what remains is mostly manual store-console work and standing up
Android from scratch.

```mermaid
graph LR
    Code["App / code blockers<br/>MOSTLY CLOSED"] --> iOS["Apple App Store<br/>close to submittable"]
    Code --> Android["Google Play<br/>needs Android from scratch"]
    iOS --> Consoles["Manual console work:<br/>privacy label · rating · screenshots"]
    Android --> Consoles
```

## Verified build config

Read from `frontend/app.json` and `frontend/eas.json`:

| Field | Value |
|---|---|
| App name / slug | Drape / drape |
| Version | 1.0.0 |
| iOS bundle id | `com.kcb1099.drape` |
| iOS build number | 1 (auto-incremented by EAS in production) |
| **Android package** | **Missing — no `android.package` in app.json** |
| Orientation | portrait (locked, in app.json and Info.plist) |
| Privacy policy URL | `https://drape-backend-avjg.onrender.com/privacy` |
| EAS project | owner `kcb1099`, project id present |
| EAS submit | iOS only (`ascAppId` set); no Android submit config |

iOS permission strings are all present and meaningful (camera, photo library,
photo-library-add). Android declares `CAMERA`, `READ_EXTERNAL_STORAGE`, and the
deprecated `WRITE_EXTERNAL_STORAGE`. The `ios/` directory is prebuilt; there is
**no `android/` prebuild yet**.

## What is already done

- In-app **account deletion** (`DELETE /api/account`) with a type-to-confirm UI.
- **Global error boundary** (exported from `_layout.tsx`) with Sentry capture.
- **Orientation lock**, 1024×1024 app icons, honest loading copy with a timeout.
- **Privacy policy + terms** served by the backend and shown in-app.
- **No Sign in with Apple needed** — there is no third-party social login, so
  Guideline 4.8 does not apply.

## The one prioritized list

### P0 — will cause rejection or blocks a build

1. **Add `android.package` to `app.json`** — no Android build exists without an
   applicationId. ~5 min, then a first Android prebuild.
2. **Complete the App Store App Privacy label and the Google Play Data Safety
   form** — a binary cannot be submitted on either store without them, and
   biometric/photo data makes accuracy mandatory. Include **PostHog analytics +
   session replay** in both. ~1–2 h each, manual.
3. **Enter privacy-policy and support URLs in both consoles; confirm the shipped
   `onrender.com/privacy` URL returns 200** (the app ships the raw Render
   subdomain, not the branded domain the hosting doc validated). ~30 min.
4. **Verify `EXPO_PUBLIC_SENTRY_DSN` is set as an EAS secret** — if it is absent,
   crash reporting is silently off in every production build. ~5 min.
5. **Verify a crash-free launch and a working try-on on a physical device**, and
   confirm the reviewer demo account is live with a body photo + consent. ~1–2 h.
6. **Set the age rating (12+) and add "18+ required" language** to onboarding and
   the store description — BIPA self-attestation is 18+. ~30 min.

### P1 — high risk of review friction

7. **Disable session replay in production** — currently on in production builds.
   Flip the production EAS profile env and confirm disclosure. ~15 min.
8. **Produce final store-ready screenshots** — completed renders (not loading
   states), partner brands only, neutral body photos; a full Android set too.
9. **Add upload safeguards** (no moderation or file-size limit today) and stage the
   App Review notes covering biometric handling and demo credentials.
10. **Remove or replace `WRITE_EXTERNAL_STORAGE`** — unused on Android 13+ and a
    flagged permission that triggers a Play declaration.
11. **Finalize non-spammy store copy** free of unverifiable AI claims.

### Hygiene (not blockers)

12. Untrack the two committed `.ipa` files (~91 MB); add `*.ipa` to `.gitignore`.
13. Backend launch-hardening (Render cold starts, orphaned jobs on spin-down, JWT
    revocation, an uptime monitor) — reliability, not a review gate at current
    scale.

## Per-store detail

- **[Apple App Store](./app-store.md)** — the item-by-item status for iOS.
- **[Google Play](./google-play.md)** — what Android needs, from an
  `android.package` up.

:::note[Docs vs reality]
Several store-readiness docs under `frontend/docs/` are dated 2026-05/06 and
predate fixes now in the code (they claim `eas.json` doesn't exist, the icon is
too small, etc.). Where those docs conflict with the current config, the config
wins — this page reflects the config.
:::
