inkcap

a small, self-hosted LLM chat web UI where the server owns the conversation

what it does

Quiet infrastructure for conversations that keep going.

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.

Browsers are spectators

Live tokens fan out over SSE with replay; zero subscribers changes nothing, and a page reload always shows database truth.

Bring your own providers

llama-server, OpenAI-compatible endpoints, or your ChatGPT subscription via Codex sign-in. Keys live server-side and never reach the browser.

Messages are a tree

Edit and regenerate create sibling branches; switching branches is just picking a path. Branching is schema, the UI is just forms.

MCP tools built in

The server runs the tool loop against your MCP servers and parks the run for approval when a tool call needs a human.

A tiny JS budget

SSR templates and plain HTML forms everywhere; one hand-rolled island for the chat stream. Everything still works with JavaScript off.

quick start

Postgres, Bun, four commands.

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.