Home split: llm-fe/src/llm-fe/components/HomeRoute/HomeRoute.tsx
Signed-in nav (Header2): Dashboard, Account, Documents (only if the plan has RAG), Analytics, Feedback, Sign out
REST base: REACT_APP_BACKEND_REST_API_BASE_URL (prod https://chatbackend.aimloperations.com/api/).
WebSocket: REACT_APP_BACKEND_WS_API_BASE_URL (prod wss://chatbackend.aimloperations.com/ws/chat_again/).
Authenticated calls send Authorization: Bearer <access>. Refresh is POST /token/refresh/.
iOS today
chat_ios is a stub (README only). No screens yet. First navigation decision is the same as Android: session present opens Dashboard, otherwise Sign in.
Store billing is RevenueCat on the App Store (APP_STORE), not Stripe Checkout and not Play.
Skipped: landing, pricing, privacy, changelog, public legal, public account-deletion, Stripe return pages.
Auth screenshots are the same web captures used on the Android tickets. Analytics consent banner was dismissed before capture. Signed-in pages still need a logged-in session to screenshot.
Done when
Launch with a valid session opens Dashboard. Launch without one opens Sign in.
Sign out returns to Sign in and clears the session (Keychain).
Nav can reach Account, Documents (RAG plans), Analytics, and Feedback.
No landing, pricing, privacy, or changelog route exists in the app.
## Goal
Make `chat_ios` a working Hesychia client. Cold start goes straight into the product:
- Stored session → **Dashboard** (chat). Web route `/` when authenticated (`AsyncDashboard2`).
- No session → **Sign in**. Web route `/signin/`.
Do not ship the public marketing site.
Mirror of the Android epic: https://git.aimloperations.com/ai_ml_operations/chat_android/issues/1
## Out of scope
- Logged-out landing (`LandingPage` on `/`)
- Pricing (`/pricing/`)
- Privacy (`/privacy/`)
- Changelog (`/changelog/`)
- Public legal alias (`/legal/terms-of-service`)
- Public account-deletion URL (`/account-deletion/`) — App Store listing can keep the web URL
- Stripe return routes (`/billing/success`, `/billing/cancel`). App Store billing stays RevenueCat inside Account
## Source of truth
Web app: `chat_web_app/llm-fe`.
- Routes: `llm-fe/src/App.tsx`
- Home split: `llm-fe/src/llm-fe/components/HomeRoute/HomeRoute.tsx`
- Signed-in nav (`Header2`): Dashboard, Account, Documents (only if the plan has RAG), Analytics, Feedback, Sign out
REST base: `REACT_APP_BACKEND_REST_API_BASE_URL` (prod `https://chatbackend.aimloperations.com/api/`).
WebSocket: `REACT_APP_BACKEND_WS_API_BASE_URL` (prod `wss://chatbackend.aimloperations.com/ws/chat_again/`).
Authenticated calls send `Authorization: Bearer <access>`. Refresh is `POST /token/refresh/`.
## iOS today
`chat_ios` is a stub (README only). No screens yet. First navigation decision is the same as Android: session present opens Dashboard, otherwise Sign in.
Store billing is RevenueCat on the App Store (`APP_STORE`), not Stripe Checkout and not Play.
## Sub-tickets
| # | Page |
| --- | --- |
| #2 | Sign in |
| #3 | Sign up |
| #4 | Password reset |
| #5 | Dashboard (chat) — signed-in start |
| #6 | Account |
| #7 | Documents |
| #8 | Analytics |
| #9 | Feedback |
Skipped: landing, pricing, privacy, changelog, public legal, public account-deletion, Stripe return pages.
Auth screenshots are the same web captures used on the Android tickets. Analytics consent banner was dismissed before capture. Signed-in pages still need a logged-in session to screenshot.
## Done when
1. Launch with a valid session opens Dashboard. Launch without one opens Sign in.
2. Sign out returns to Sign in and clears the session (Keychain).
3. Nav can reach Account, Documents (RAG plans), Analytics, and Feedback.
4. No landing, pricing, privacy, or changelog route exists in the app.
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
Make
chat_iosa working Hesychia client. Cold start goes straight into the product:/when authenticated (AsyncDashboard2)./signin/.Do not ship the public marketing site.
Mirror of the Android epic: ai_ml_operations/chat_android#1
Out of scope
LandingPageon/)/pricing/)/privacy/)/changelog/)/legal/terms-of-service)/account-deletion/) — App Store listing can keep the web URL/billing/success,/billing/cancel). App Store billing stays RevenueCat inside AccountSource of truth
Web app:
chat_web_app/llm-fe.llm-fe/src/App.tsxllm-fe/src/llm-fe/components/HomeRoute/HomeRoute.tsxHeader2): Dashboard, Account, Documents (only if the plan has RAG), Analytics, Feedback, Sign outREST base:
REACT_APP_BACKEND_REST_API_BASE_URL(prodhttps://chatbackend.aimloperations.com/api/).WebSocket:
REACT_APP_BACKEND_WS_API_BASE_URL(prodwss://chatbackend.aimloperations.com/ws/chat_again/).Authenticated calls send
Authorization: Bearer <access>. Refresh isPOST /token/refresh/.iOS today
chat_iosis a stub (README only). No screens yet. First navigation decision is the same as Android: session present opens Dashboard, otherwise Sign in.Store billing is RevenueCat on the App Store (
APP_STORE), not Stripe Checkout and not Play.Sub-tickets
Skipped: landing, pricing, privacy, changelog, public legal, public account-deletion, Stripe return pages.
Auth screenshots are the same web captures used on the Android tickets. Analytics consent banner was dismissed before capture. Signed-in pages still need a logged-in session to screenshot.
Done when