Connect Sybil to the Pi root conversation with authenticated REST and WebSocket APIs, persistent read state, and a dedicated agent tab. Keep optimistic messages stable through delivery and retries, and animate arrivals without losing the reader's scroll position. Share bubble styling with regular chats and remove the obsolete admission sender. Reject malformed upstream receipts and WebSocket upgrade requests, with regression coverage and updated API documentation. Validated with 51 web tests, 44 server tests, both production builds, desktop/mobile bubble comparisons, and 11 browser animation and scrolling checks.
Sybil Web
Preact + Vite frontend for the Sybil backend.
Setup
- Copy env values:
cp .env.example .env
- Install and run:
npm install
npm run dev
Default dev URL: http://localhost:5173
Environment variables
VITE_API_BASE_URL: backend API base URL. Defaults tohttp://localhost:8787.VITE_ADMIN_TOKEN: optional. Pre-fills a token in the login form.
Authentication
- On startup, the app checks
GET /v1/auth/session. - If backend runs with
ADMIN_TOKEN, sign in using that token. - If backend runs in open mode (
ADMIN_TOKENunset), you can continue without a token. - The entered token is stored in browser
localStorageand can be cleared via Logout.
UI
- Left panel: mixed list of chat conversations and Exa searches.
- Sidebar search uses
GET /v1/workspace-items?q=…to search all saved titles, conversation messages, and web-search queries/answers. It waits 300 ms while typing and cancels superseded requests. Results include a single-line matching excerpt with matching words in bold and middle truncation (or “Title match” for title-only chat matches), with up to 100 newest matches. Clear the field or press Escape to return to recent items. Matching uses word prefixes, soplanalso findsplanning. - Right panel:
- Chat mode: transcript + provider/model controls.
- Search mode: top AI answer block + Google-style Exa results view.
- Composer adapts to the active item:
- Chat sends
POST /v1/chat-completions/stream(SSE). - Search sends
POST /v1/searches/:searchId/run/stream(SSE).
- Chat sends
- Keyboard shortcuts:
Cmd/Ctrl+J: start a new chat.Shift+Cmd/Ctrl+J: start a new search.Cmd/Ctrl+Up/Down: move through the sidebar list.
Client API contract docs:
../docs/api/rest.md../docs/api/streaming-chat.md
Routes
/: full Sybil app (sidebar + chat/search workspace)/search?q=bitcoin+price: standalone search page that renders only the search query box and results panel