Mobile ⇄ Web Feature Gap — living tracker
What this is: the ongoing, prioritized backlog of what the web app (
apps/frontend) can do that the pre-release mobile app (apps/mobile, React Native / Expo) cannot yet. This is the gap-closing view. The status grid (every feature × every surface) lives in FEATURES_BY_INTERFACE.md — this doc reads from it and adds priority, rationale, and a re-audit cadence.Last audited: 2026-07-15 (by AI assistant, route-diff method below) Next audit: see the recurring product task "Mobile⇄web gap: re-audit + close top gaps".
Legend: ✅ shipped on mobile · 🟡 partial / read-only / deep-links-to-web · ❌ not on mobile · 🚫 not a mobile target (web/headset/admin-only by design)
How this doc is scoped
Mobile is a daily-companion surface: capture, coaching, presence, and light review — the things you reach for a phone to do. It is not meant to mirror every web surface. Three big web areas are deliberately web-first and should NOT be counted as mobile gaps:
- VR / WebXR surfaces —
/dashboard/vr,/cockpit,/dome,/stream/immersive,/inspiration/vr,/notebooks/vr,/circles/vr,/entries/[id]/vr. These target headsets, not phones. (A native mobile presence layer is its own track — see MOBILE_JQ_PRESENCE.md.) - Admin / operations — everything under
/dashboard/admin/*(111 pages). Super-admin tooling stays on the web. - DreamPro public science community — the citizen-science platform (world map, competition, sponsors, calculators, K-12) is a public-web surface; mobile only needs the personal DreamPro (dreams + steps), which it has.
Everything else below is a real parity candidate.
2026-07-16 re-scope — the journaling-market lens
The journaling-space marketing analysis (see the comparison SEO cluster:
/compare/journaling, /compare/hivejournal-vs-*, /best-journaling-apps-2026,
data in apps/frontend/src/lib/journaling-compare.ts)
adds a second prioritization axis on top of the daily-loop tiers: what
unblocks competing with Rosebud / Day One / Stoic. Concretely:
- Store presence is the gate, not a feature — every competitor is app-store native; our comparison pages honestly list "no native app in the stores" as our top gap. → P0 task "Mobile: ship HiveJournal flavor to TestFlight → App Store" (reuse the WW Phase-0 EAS flow; the journaling loop below is already shipped, so this is config + store checklist, not feature work).
- Voice entry capture (already Tier 1) gains a competitive rationale:
it's a paid feature on Rosebud ($12.99/mo) — shipping it free flips a
nocell in the comparison matrix. - JQ chat on mobile (Tier 1) is the AI-reflection parity play — Rosebud's whole product is conversational reflection on a phone.
When any of these ship, update the matrix cells + HIVEJOURNAL_SELF.honestGaps
in journaling-compare.ts — those pages advertise our gaps by design.
Tier 1 — core daily-loop gaps (close first)
These are things a mobile user hits in normal daily use where the phone is the better device, or where the absence breaks the core loop.
| Gap | Web route | Mobile | Why it's Tier 1 |
|---|---|---|---|
| Voice entry capture | /dashboard/entries/voice | ❌ | The phone is the best voice-capture device we have; this is the single most phone-native missing feature. |
| JQ AI Companion (chat) | JQ Chat drawer (web) | ❌ | JQ is the product's assistant spine; mobile has analysis read-only but no conversational JQ. |
Personal tasks UI (user_tasks) | /dashboard/tasks | ❌ | Core productivity loop; NL task capture is exactly a phone use-case. |
| Daily check-in | /dashboard/check-in | 🟡 (WorkoutWindow check-in only) | The general daily check-in flow (mood/energy/satisfaction in one place) isn't a standalone mobile screen. |
| Note analysis — full | /dashboard/analysis | 🟡 (read-only summaries) | Mobile shows summaries but not the interactive analysis (heatmap, drill-in). |
| Dashboard search + filter chips | /dashboard | 🟡 (basic list) | Recency / notebook / tag / @person chips missing — findability on a small screen matters most. |
Tier 2 — companion features (close next)
Valuable on mobile but not loop-breaking.
| Gap | Web route | Mobile | Notes |
|---|---|---|---|
| Weekly Review | /dashboard/review | 🟡 (read-only) | Read-only respect; no run/manage. |
| JQ Routines (toggle / cadence / Run Now) | /dashboard/jq-routines | ❌ | Background routine management. |
| Life Map (view + node drawer) | /dashboard/life-map | ❌ | At minimum a read-only viewpoint + node drill-through. |
| Highlights | /dashboard/highlights | ❌ | Curated moment surfacing. |
| Saved moments | /dashboard/saved-moments | ❌ | — |
| Calendar view | /dashboard/calendar | ❌ | Entries/tasks on a calendar. |
| Personal stats | /dashboard/me/stats | ❌ | Streaks / counts. |
| Activity feed | /dashboard/activity | ❌ | — |
| Messages | /dashboard/messages | ❌ | Direct messaging. |
| Odessa (story seed from journal) | /dashboard/odessa | ❌ | Personalized story generation. |
| AI background image gen | entry editor | ❌ | DALL-E cover/background. |
| Journal import | /dashboard/import, /import/apple-notes | ❌ | Day One / Apple Notes / CSV. |
| Coaching hub | /dashboard/coaching, /my-coaching, /coaching/partner | ❌ | Workout Window screens exist; the coaching hub/partner flows don't. |
| Subscription / billing | /dashboard/subscription | 🟡 (deep-links to web) | Stripe; deep-link is acceptable but note it. |
| Tone Packs | (gamification) | 🟡 (browse only) | No buy/upload. |
| JQ Bridge — full | /dashboard/jq-bridge | 🟡 (accept + view) | Create/edit/permissions/bridge-chat missing. |
| Circles | /dashboard/circles | ❌ | Group/community layer (non-VR part). |
| Family | /dashboard/family | ❌ | Members + routines + check-ins. |
Tier 3 — creator / niche surfaces (defer)
Web-first for now; port only if a mobile audience emerges.
| Gap | Web route | Mobile | Notes |
|---|---|---|---|
| Stories / writing surface | /dashboard/stories | 🟡 (Writer + Graphene slate exist) | Partial; deep authoring stays web. |
| Universes | /dashboard/universes | ❌ | Story-world management. |
| Comics / graphic novels | /dashboard/comics | ❌ | Panel co-creation is web-first. |
| Drift | /dashboard/drift | ❌ | — |
| Podcast / Listening | /dashboard/podcast, /listening | ❌ | Audio surfaces; overlap w/ presence track. |
| Creator earnings | /dashboard/creator, /creator/earnings | ❌ | Creator payouts. |
| Lovio (memory capsules) | /dashboard/lovio/* | ❌ | Living-Voice product; own roadmap. |
| Lighthouse | /dashboard/lighthouse | ❌ | Alienated-parent product; practitioner-gated. |
| DreamPro sponsor inbox | /dashboard/dreampro/sponsor-inbox | ❌ | Part of the web-first science community. |
| Gifts / Support | /dashboard/my-gifts, /my-support | ❌ | Drops-adjacent. |
🚫 Not mobile targets (do not port)
- VR / WebXR:
/dashboard/vr,/cockpit,/dome,/stream/immersive,/inspiration/vr,/notebooks/vr,/circles/vr,/entries/[id]/vr - Admin: all of
/dashboard/admin/* - DreamPro public science community: map / competition / sponsors / calculators / classrooms (personal DreamPro dreams are on mobile ✅)
- Marketing / public pages:
/,/features,/compare,/about/*, etc. (mobile follows deep links into the in-app browser)
What mobile already has (✅ shipped)
Auth · Dashboard (entries list + search) · Entry detail / editor · Notebooks (list/detail/editor) · Goals (list/detail/editor) · Stream · DreamPro (dreams / detail / editor) · Sleep entry · Note analysis (read-only) · JQ Bridge (accept + view + my-connections) · Encouragement Drops (received) · Graphene slate + season detail · Writer · Workout Window (setup / check-in / dashboard / chain / mosaic / battle) · Settings (profile / email prefs) · Share entry.
Wired screens confirmed in
apps/mobile/src/navigation/MainNavigator.tsx.
Re-audit procedure (run this each cycle, then update the tables + dates above)
The audit is a route diff between web and mobile:
# 1. Web user-facing surfaces (exclude admin)
find apps/frontend/src/app -name page.tsx | sed 's|apps/frontend/src/app||;s|/page.tsx||' \
| grep '^/dashboard' | grep -v '/admin/' | sort
# 2. Mobile wired screens (source of truth = what's in the navigator, not orphan files)
grep -oE 'name="[A-Za-z]+"' apps/mobile/src/navigation/*.tsx | sort -u
# 3. Cross-check against the per-feature status grid
# docs/reference/FEATURES_BY_INTERFACE.md (Mobile column: ✅ / 🟡 / ❌)
Registered ≠ reachable. Step 2 tells you a route exists, not that the buttons pointing at it work.
navigate('X')resolves only against the navigators in the caller's chain — its own stack, then the tab navigator, then the root stack. A route registered inDashboardStackis invisible to a screen inSettingsStack, and React Navigation drops an unhandled action (dev-only warning, nothing in release), so the button silently does nothing. Five Settings cards shipped dead this way — the audit counted them ✅ because the grep found the names. When a screen is linked from more than one tab, register it in each of those stacks via the sharedfeatureScreens()fragment inMainNavigator.tsx, and spot-check the entry point by tapping it, not by grepping for it.
For each new web /dashboard/* route since the last audit: classify it as a
Tier 1/2/3 gap or 🚫 not-a-target, add a row, and (if it's a real gap) confirm
FEATURES_BY_INTERFACE.md has a matching
Mobile ❌. Bump Last audited / Next audit at the top.
Keep this doc and
FEATURES_BY_INTERFACE.mdin sync — that grid is the feature-level source of truth; this doc is the prioritized backlog on top of it.