Spike + plan a true native Android Hesychia client in a new repochat_android (org: ai_ml_operations), feature-parity with chat_web_app / llm-fe, while reusing chat_backend APIs.
This epic lives here because product/UX/API contracts and the existing Capacitor shell are owned by chat_web_app. Implementation work for the native app lands in chat_android once that repo exists.
Current state (do not ignore)
Layer
Today
Mobile ship path
Capacitor 7 WebView wrapping CRA build/ (llm-fe/android/, app id ai.hesychia.chat) — see ANDROID.md / #20
RevenueCat via @revenuecat/purchases-capacitor — MONETIZATION.md, #100
UI
React + MUI 5 + Emotion; tokens in llm-fe/src/llm-fe/ui-kit/assets/theme/ (palettes, colors, typography, breakpoints)
Decision to force early: keep Capacitor as interim Play track vs migrate users to a native APK/AAB under the same (or new) application id. Package-name / Play listing continuity matters for IAP and reviews.
Why native (vs Capacitor)
Capture explicit rationale so we do not rebuild for fashion:
Optional later: keep tokens in a tiny shared package or published artifact both web and Android consume
Risk: MUI component look ≠ Compose Material 3 defaults. Tokens alone are not enough — need component-level mapping (buttons, cards, drawers, message bubbles).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Goal
Spike + plan a true native Android Hesychia client in a new repo
chat_android(org:ai_ml_operations), feature-parity withchat_web_app/llm-fe, while reusingchat_backendAPIs.This epic lives here because product/UX/API contracts and the existing Capacitor shell are owned by
chat_web_app. Implementation work for the native app lands inchat_androidonce that repo exists.Current state (do not ignore)
build/(llm-fe/android/, app idai.hesychia.chat) — seeANDROID.md/#20REACT_APP_BACKEND_*)@revenuecat/purchases-capacitor—MONETIZATION.md,#100llm-fe/src/llm-fe/ui-kit/assets/theme/(palettes, colors, typography, breakpoints)Decision to force early: keep Capacitor as interim Play track vs migrate users to a native APK/AAB under the same (or new) application id. Package-name / Play listing continuity matters for IAP and reviews.
Why native (vs Capacitor)
Capture explicit rationale so we do not rebuild for fashion:
Proposed repo:
chat_androidCreate under
ai_ml_operations:.env.mobile/ beta / prodllm-fe/android/keystore.properties)Out of scope for v1 unless justified: iOS twin (separate epic), full offline-first sync.
Workstream A — Discovery & architecture
App.tsxroutes + key components):#103)chat_backendREST + WS contracts; note gaps (pagination, error shapes, auth headers)ai.hesychia.chatchat_android(or linked doc) covering Capacitor sunset / coexistenceExit: architecture note + screen inventory + open questions list.
Workstream B — Visual parity / design system
Goal: Hesychia should feel like the same product, not a generic Material template.
ui-kit/assets/theme/base/palettes.js,colors.js)hesychia-mark, icons, splash) — reusellm-fe/assets/HesychiaTheme(Material 3 color scheme + typography) from those tokensRisk: MUI component look ≠ Compose Material 3 defaults. Tokens alone are not enough — need component-level mapping (buttons, cards, drawers, message bubbles).
Exit: token file + Compose theme + screenshot comparison for 3 core screens.
Workstream C — Auth & session
chat_backendExit: authenticated user can open chat and survive process death.
Workstream D — Chat parity
WebSocketContext+#23)Exit: end-to-end chat on emulator + physical device matching web happy path.
Workstream E — In-app purchases (required)
Native Play must not use Stripe Checkout for digital subscriptions (Play policy). Align with existing RevenueCat path.
appUserIDrules asMONETIZATION.md(Django user pk string)founders, etc.) — share product ids with Capacitor RC dashboard/monetization/...APIs same as web BillingSectionrevenuecat+PLAY_STORE)chat_backendissues if notExit: internal-test purchase + restore + entitlement visible in Account; web Stripe path unchanged.
Workstream F — Platform & store ops
chat_androidrepo + README + local run docsversionCode/versionName) vs webpackage.jsonWorkstream G — Cross-repo coordination
Track follow-on issues (create as children when scoped):
chat_androidchat_web_appchat_backendserver-infraSuggested child issues (cut after discovery)
chat_androidrepo scaffolding (Compose, CI, flavors)ui-kit+ Compose themeAcceptance criteria (epic done when)
chat_androidexists, builds, signs, and completes auth → chat → IAP purchase/restore on internal testingMONETIZATION.md(RC on Play, Stripe on web)References
llm-fe/ANDROID.md,llm-fe/MONETIZATION.md,llm-fe/android/README.md#20, RevenueCat:#100, account deletion URL:#103chat_backendhesychia.ai