Server-owned runs
A chat run is a durable server-side job. Close the laptop mid-generation, open your phone later — the conversation reached a sensible stopping point without you.
a small, self-hosted LLM chat web UI where the server owns the conversation
what it does
A chat run is a durable server-side job. Close the laptop mid-generation, open your phone later — the conversation reached a sensible stopping point without you.
Live tokens fan out over SSE with replay; zero subscribers changes nothing, and a page reload always shows database truth.
llama-server, OpenAI-compatible endpoints, or your ChatGPT subscription via Codex sign-in. Keys live server-side and never reach the browser.
Edit and regenerate create sibling branches; switching branches is just picking a path. Branching is schema, the UI is just forms.
The server runs the tool loop against your MCP servers and parks the run for approval when a tool call needs a human.
SSR templates and plain HTML forms everywhere; one hand-rolled island for the chat stream. Everything still works with JavaScript off.
quick start
bun install
cp .env.example .env.local # DATABASE_URL, SESSION_SECRET
bun run db:migrate
bun run dev # http://localhost:3000 — register first
Then add a provider and start chatting. The full walkthrough — providers, ChatGPT sign-in, importing llama.cpp web UI history, and production Docker deploys — lives in Getting started.