chappie-frontend
CHAPPiE's React frontend. Use when modifying UI pages, components, Tailwind styling, or the chat streaming experience.
SKILL.md.claude/skills/chappie-frontend/SKILL.md
GitHubCHAPPiE Frontend Development
Stack
- Framework: React 18 + TypeScript
- Build: Vite
- Styling: Tailwind CSS (utility classes only, no CSS files)
- Routing: React Router (page-based)
- Data: TanStack React Query (
useQuery,useMutation) - API: Fetch-based SSE streaming client
Pages (frontend/src/pages/)
| Page | File | Key Features |
|---|---|---|
| Chat | chat-page.tsx |
Token streaming, message queue, thinking animation, CoT/Answer boxes |
| Settings | settings-page.tsx |
All 40+ settings, emotion sliders, neural mapping, auto-save |
| Memories | memories-page.tsx |
LTM search, STM buffer, session history, cleanup/wipe |
| Life | life-page.tsx |
Homeostasis, needs, world model (refetchInterval: 3s) |
| Growth | growth-page.tsx |
Planning, forecast, social arcs (refetchInterval: 3s) |
| Training | training-page.tsx |
Daemon control, logs, config (refetchInterval: 5s) |
| Debug | debug-page.tsx |
Metadata, debug entries (refetchInterval: 2s) |
Key Patterns
Streaming Flow
- User sends message →
processMessage()→ SSE stream viaapi.sendMessageStream() - Tokens arrive as
event: tokenevents withtoken_type: "answer"|"reasoning" - First answer token → transition from "thinking" to "streaming"
turn_finished→ final message with metadata (formatted_cot, formatted_answer)
Auto-Scroll
autoScrollReftracks user position- Scroll event listener updates it (threshold: 60px from bottom)
- New message →
autoScrollRef.current = true - Reasoning truncation: 3000 chars in stream, 4000 chars in final box
Two-Box UI (CoT + Answer)
- CoT: pine-border box above answer, shows
formatted_cotfrom metadata - Answer: main message bubble, shows
formatted_answer(preferred) or raw content - Uses
whitespace-pre-linefor formatted text with line breaks
Styling Conventions
- No separate CSS files — all Tailwind utilities inline
rounded-none(square corners) everywhere- Colors:
ember(primary),pine(success),night(bg),ink(darkest),mist(text) shadow-glassfor card-like elementstext-[10px] uppercase tracking-widestfor labels- Missing module:
../lib/format→parseEmotionalText()infrontend/src/lib/format.ts