Skip to main content

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. 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 and the AWS system map.

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.

App / code blockers
MOSTLY CLOSED

Apple App Store
close to submittable

Google Play
needs Android from scratch

Manual console work:
privacy label · rating · screenshots

Verified build config

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

FieldValue
App name / slugDrape / drape
Version1.0.0
iOS bundle idcom.kcb1099.drape
iOS build number1 (auto-incremented by EAS in production)
Android packageMissing — no android.package in app.json
Orientationportrait (locked, in app.json and Info.plist)
Privacy policy URLhttps://drape-backend-avjg.onrender.com/privacy
EAS projectowner kcb1099, project id present
EAS submitiOS 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

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

Hygiene (not blockers)

  1. Untrack the two committed .ipa files (~91 MB); add *.ipa to .gitignore.
  2. 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

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.