--- name: birth-data-onboarding-gate title: Birth Data Onboarding Gate domain: astrology status: shipped related: [astral-tenant-kb, astral-hermes-platform] --- # Birth Data Onboarding Gate A post-onboarding, pre-chat React view in the Astral Hermes web app that captures the operator's birth date, time, and location **once**, then writes a `relationship: self` profile into the tenant's KB and seeds a one-line marker into the tenant's `hermes-home/memories/USER.md`. After this gate, every future Hermes session can silently answer "what does my chart say…" because the self-profile already exists. ## Why this exists The hand-off between marketing/onboarding and the first chat used to drop the user into `/chat` with an empty KB. Their first turn was always *"my birth is Y/M/D, X:XX, City"* — friction. This gate collapses that turn into a one-shot guided form so the chat can open with context. It is intentionally **skippable**: the skip-flag is stored as `localStorage['astral.birth-data.skipped'] = '1'` and `/chat` does not (currently) force-redirect back. The gate itself also checks `/api/me/self-profile` on mount and short-circuits to `/chat` if the self-profile already exists, so reloading is safe. ## The Magi → Astral Hermes port Astral Hermes has *no* npm dep for spinners — we load Magi's Mobiscroll bundle as a static asset and call it through `window.mobiscroll`. This keeps `package.json` light and matches Magi's runtime exactly. - Bundle: `web/public/mobiscroll/{js,css}/mobiscroll.javascript.min.*` (copied verbatim from `magi-vps/mobiscroll/`). - `web/index.html` gets a `` and a `