# Halo Bestie — Mitra App Flutter mobile application for mental health professionals (mitra/partners). > See root `CLAUDE.md` for full project context and architectural decisions. ## Stack - **Framework:** Flutter (iOS + Android) - **Auth:** Self-managed (Phase 3.4). Phone OTP only — no Google / Apple. Access token lives in memory on an `AuthBridge`; refresh token persists in `flutter_secure_storage`. `firebase_auth` is no longer used; `firebase_messaging` is kept for FCM push. - **API:** Calls public Fastify backend (`/api/mitra/` and `/api/shared/` routes). `shared.auth` covers refresh + logout for both apps. ## Key Concepts - Users are **mitra** — trained mental health professionals - Core flow: phone OTP login → set availability → accept sessions → chat with client → receive payment - Mitra accounts require approval from control center before going live (backend returns `ACCOUNT_INACTIVE` 403 on OTP verify when `is_active=false`) ## Conventions - Never call `/api/client/` or `/internal/` routes from this app - API calls go through `ApiClient`; it auto-attaches the JWT from `AuthBridge` and auto-refreshes on 401 - WebSocket handshake (`/api/shared/ws`) sends the same access token in the first frame's `{type:"auth", token}` message - Mitra role is encoded in the JWT claims (`user_type: "mitra"`) — the backend enforces the role per route; never trust client state alone