# chat.saiden.dev A quiet channel. Spike Jonze's *Her* (2013) as a chat UI. ``` chat.saiden.dev → Caddy reverse-proxy (TLS via Let's Encrypt) → FastAPI on marauder.saiden.dev:8765 ├─ Google OAuth (authlib) + email whitelist └─ WebSocket → Anthropic API streaming ``` ## Status Phase 3 — Her-aesthetic. UI plan in `UI-PLAN.md`. Phase 1 (ttyd + CF Tunnel) archived in `_archive-ttyd/`. ## Local dev ```bash cd ~/Projects/chat-saiden uv sync cp .env.example .env # fill in ANTHROPIC_API_KEY, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, COOKIE_SECURE=false uv run python -m app.main # → http://127.0.0.1:8765 ``` Google OAuth redirect URI for local dev (add to your Google Cloud Console OAuth client): `http://127.0.0.1:8765/auth/callback` ## Files | Path | What | |------|------| | `app/main.py` | FastAPI: OAuth, session, WS streaming, Anthropic client | | `app/templates/chat.html` | Single-page UI (chat + operator prompt) | | `app/templates/denied.html` | Whitelist-rejection page, Her-styled | | `app/static/chat.css` | Design system: warm pastels, Cormorant + Caveat | | `app/static/chat.js` | WebSocket, typewriter queue, label dedup, smooth scroll | | `pyproject.toml` | uv deps | | `.env.example` | env scaffold | | `UI-PLAN.md` | Design doctrine (Her aesthetic translated to chat) | | `_archive-ttyd/` | Phase 1 (ttyd + CF Tunnel + CF Access) — kept for reference | ## Deployment Not deployed yet. Stages remaining: 1. Caddyfile on marauder.saiden.dev (reverse proxy chat.saiden.dev → :8765) 2. systemd unit for the FastAPI app 3. DNS swap: `chat.saiden.dev` CNAME → `marauder.saiden.dev` (currently broken — points to deleted CF tunnel from Phase 1) 4. Google OAuth client production redirect URI: `https://chat.saiden.dev/auth/callback` 5. Smoke test live ## Persona System prompt currently hardcoded as BT-7274 (placeholder). Will swap to a dedicated **Samantha cart** when authored — see EEMS subject `project.samantha-cart`.