---
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 `