HiveJournal flavor — TestFlight → App Store runbook
Why this exists (2026-07-16): store presence is the credibility gate for competing in the journaling market. The comparison SEO cluster (
/compare/journaling,/best-journaling-apps-2026) honestly lists "no native app in the stores" as our top gap, and any future paid acquisition test is blocked on it. This is the P0 product task "Mobile: ship HiveJournal flavor to TestFlight → App Store".This is the HiveJournal-flavor sibling of WORKOUT_WINDOW_PHASE0_TESTFLIGHT.md — same EAS flow, default flavor, and it's easier: no identity overrides needed,
app.jsonalready carries the store-grade config.
What's already done (verified 2026-07-16)
- Code: the full journaling loop is shipped on mobile (entries list/detail/ editor, notebooks, goals, sleep, search, share) — see MOBILE_WEB_GAP.md "What mobile already has".
- Identity (
app.json): name/slughivejournal,com.hivejournal.appbundle id + Android package, icon/splash/adaptive-icon assets, camera + photo-library permission strings,applinks:associated domains + Android intent filters forhivejournal.com/share, EASprojectId+owner: jurowski,ITSAppUsesNonExemptEncryption: false(skips the export compliance prompt). - Flavor:
APP_FLAVORunset → HiveJournal is the default flavor (app.config.jsonly overrides forworkoutwindow), so the plainproduction/previewEAS profiles build this app. - EAS profiles (
eas.json):production(+preview) now carry the real production env — prod Supabase URL + anon key (public-by-design; it ships inside the binary either way) andEXPO_PUBLIC_API_URL=https://hivejournalbackend-production.up.railway.app.appVersionSource: remote+autoIncrementhandle build numbers. - Legal URLs: privacy + terms are live at
hivejournal.com/privacyand/terms(needed for the store listing).
Status update — 2026-07-29 (post-hardening)
Nothing above regressed; the app got more store-ready since 2026-07-16.
- Contributor hardening landed (Silver /
silverz86), all directly de-risking Phase A dogfood + Phase C review: Turnstile bot-protection in auth (#1489), safe-area chrome + overlay placement + sleep/drop API (#1644), and auto-sign-out when the API rejects a stale token (#1655). - SDK is current — Expo
~54.0.30/ RN0.81.5. Staleness is not a blocker. - Not real blockers (checked): the ~240 mobile
tscerrors are almost all test-harness type-noise (Cannot find name 'jest'/'describe'— missing@types/jestin the typecheck config), not app regressions, and Metro/EAS builds don't runtsc; the 2console.logs are in Workout Window screens (a separate flavor), not the HiveJournal app. - Still NOT shipped —
lib/journaling-compare.tsstill readsnative mobile app in development, which is the tell that Phase D was never done.
The real bottleneck is accounts/access, not engineering. The steps below gate on owner-held credentials (Apple Developer, EAS project membership, Play Console), not on code.
Split of work — who does what
Silver can do now (no accounts needed — the highest-leverage lane):
- Prep the full store-listing artifact set (the long pole that isn't accounts): screenshots (6.7"+5.5" iOS; phone+7"/10" Android), description leading with "free full journaling," keywords (journal, diary, mood tracker, AI journal), privacy/data-safety answers (cite the RLS/backend-only model). Capture from a dev build.
- Run the full physical-device dogfood gate (APP_STORE_DEPLOYMENT.md) on a dev/preview build, so a TestFlight build is known-good the moment it exists.
- Optional cleanups (not blockers): add
@types/jestto green the mobiletsc; the 2 WWconsole.logs.
Needs the owner (Sandon) — the actual unblock, in order:
- A. Apple Developer account active + register the app in App Store Connect
under
com.hivejournal.app(TestFlight internal needs registration, no review). - B. Add Silver to the EAS project (
owner: jurowski) + the Apple Developer team so he can runeas build/eas submit— or run those two one-liners yourself (Phase A below). - C. Google Play Developer account ($25 one-time) + create the app in Play Console.
Single most important move: decide who holds/runs the store accounts (A+B). Everything engineering is done or Silver-doable; the app sits behind Apple Developer + EAS access.
The human steps (in order)
Phase A — TestFlight internal (no Apple review)
- Apple Developer account active; app registered in App Store Connect
under
com.hivejournal.app(name "HiveJournal"). Internal TestFlight requires registration but no review. - Build + submit:
(EAS handles signing; first run walks through credentials.)cd apps/mobile npx eas build --platform ios --profile production npx eas submit --platform ios --latest - In App Store Connect → TestFlight → add yourself (+ testers) as internal testers; install via the TestFlight link.
- Dogfood the journaling loop against prod for a few days — auth, entry CRUD, notebooks, search, share links, dark mode, poor network. The APP_STORE_DEPLOYMENT.md checklist is the full pre-store gate; TestFlight-internal only needs it to work.
Phase B — Play internal testing (parallel, no review)
npx eas build --platform android --profile production
Upload the AAB to Play Console → internal testing track; installs via opt-in link.
Phase C — store review submission (after dogfood holds)
- Store listing: screenshots (6.7" + 5.5" iOS; phone + 7"/10" Android), description leading with free full journaling (the comparison-page claim), keywords (journal, diary, mood tracker, AI journal), support URL, privacy nutrition labels (auth email, journal content — cite the RLS/ backend-only model).
- Age rating questionnaire; content is user-generated → note the moderation/ report path.
- Submit for review on both stores.
Phase D — the payoff loop (don't skip)
- Flip the comparison-cluster cells in
apps/frontend/src/lib/journaling-compare.ts: the "Native iOS / Android apps" row (in development→yes) andHIVEJOURNAL_SELF.honestGaps/platforms. Those pages advertise the gap by design — shipping is what un-advertises it. - Update the
/featurescatalog + footer with store badges/links. - Mark the P0 task done; voice-entry capture (Tier 1) becomes the next journaling-market lever (paid on Rosebud, free here).
Gotchas
- TestFlight needs a device build from the
productionprofile — thepreviewiOS profile issimulator: true; don't use it for TestFlight. - Local
.envnever reaches EAS builds (gitignored) — env must come from the eas.json profiles (done) or EAS project env vars. - The WW flavor ships separately on its own timeline
(WORKOUT_WINDOW_PHASE0_TESTFLIGHT.md);
a new slug/bundle-id needs its own EAS project (
eas init) — called out there.