A lightweight self-hosted client for AI chat and coding agents that "just works".
demo.mp4
Open WebUI is an impressive project, but every time I tried to actually live in it something got in the way. The browser tab would peg CPU and balloon past a gig on long replies — the streaming pipeline re-broadcasts the entire growing message body on every token, so a long chat is O(N²) in bytes (#23733, still open). Pasting any sizeable chunk of text would freeze the page for seconds (#12087, still open). The v0.9 release line shipped a run of migration regressions where you'd docker pull and then have to docker exec into the container and hand-edit alembic scripts before the app would boot.
And underneath all that, the UI just feels heavy. Settings pages full of toggles for features I'd never use. Web search that wants its own API key. TTS that wants its own setup. A hundred surfaces in front of a single text box.
I wanted a chat app I could open and use. So I wrote one.
- One process, one SQLite file, one tiny Redis. A Next.js app, a SQLite file for everything that matters, and a tiny Redis container (~13 MB idle, capped at 64 MB) that exists only so a reload mid-reply doesn't drop your tokens. No Postgres, no Celery, no separate API service. Schema migrations are one Drizzle command on container boot.
- 600 MB Docker image vs Open WebUI's 1.7 GB (compressed, amd64, pulled from
ghcr.ioon 2026-05-20). About a third the size on disk, fewer layers. - No plugin runtime, no pipelines, no functions framework. Tools are two AI SDK definitions in
apps/web/lib/tools.ts:web_search(SearXNG) andfetch_url(Defuddle → markdown). That's the whole extensibility surface. - No RAG, no embeddings, no vector DB. Chat search is SQLite FTS5 + BM25, populated by triggers (
apps/web/lib/db/search.ts). Web search results go straight into context as JSON. - Provider-aware without a plugin runtime. OpenAI, Anthropic, Google Gemini, DeepSeek, and Amazon Bedrock use first-class presets through a small registry; vLLM, llama.cpp, and SGLang have ready-to-edit local presets; custom endpoints explicitly choose Chat Completions, Responses, or Messages. Provider details stay out of the chat pipeline.
If you want every feature in the world — image generation, a code interpreter, knowledge graphs, a plugin marketplace — use Open WebUI or LibreChat. If you want a chat app that opens in under a second and stays out of your way, this is that.
curl -fsSL https://overtchat.com/install | shThe guided terminal setup detects Docker, offers to install it when missing, and lets you choose web search, text-to-speech, speech-to-text (including a specific NVIDIA GPU), and Agent Connections. It generates the secrets and Compose configuration itself. Open the URL it prints; the first signup becomes the admin, then the existing model setup gets you chatting.
- Re-run
overtchat setupto add an optional local service later. - Run
overtchat updateto update the manager, app, selected sidecars, database migrations, and the managed Agent Connector together. - Existing standard Docker Compose installations are adopted in place; the current data volume or bind mount is preserved.
Prefer to manage Compose by hand or deploy from source? The legacy/manual flow remains supported in the deploy docs.
Run Codex, Pi, and Oh My Pi from the browser on local or SSH-connected machines.
Choose Agent Connections → Yes during overtchat setup. The installer
provisions the connector internally and prints the normal OvertChat sign-in URL;
there is no pairing code to copy. overtchat update keeps the connector in sync.
Existing manually paired connectors continue to work.
The Android app is a thin client for your own server — there is no overtchat cloud to sign up for. On first launch it asks for the URL of an instance you control; your account, chats, and files stay on that server. Requests go to it and nowhere else.
Native chat with streaming replies, the model picker, projects, full-text search over your history, image and document uploads, web search with citations, text-to-speech, and dictation.
- Android: Google Play, or sideload the APK attached to any
mobile-v*release. - iOS: internal/TestFlight only, no timeline for a store release.
- Multi-user auth, first signup becomes admin
- Persistent chat history, auto-titled, full-text searchable
- File uploads — images, PDFs, Word, Excel, CSV, source code
- Projects with per-project system prompts
- Automatic web search via bundled SearXNG, plus a one-message Search action and a persistent hard-disable under Settings → Tools. No API key.
- Text-to-speech via bundled Kokoro. No setup.
- Speech-to-text via Parakeet TDT v3 (opt-in, CPU or NVIDIA GPU)
- Chat export (JSON / Markdown)
Choose bundled Parakeet during overtchat setup, then select Auto, a specific
NVIDIA GPU, or CPU. If you skip it initially, run overtchat setup later; the
admin settings will show that the local provider is not installed until then.
Multilingual audio processing stays on your machine and the model is cached in
a Docker volume.
No usage analytics, no advertising. The server sends model requests only to endpoints you configure and sends web searches through its configured SearXNG instance. Stored application data lives in a single SQLite file you can copy, back up, or delete.
The Android client can send crash diagnostics to Sentry. These may include technical request metadata; the app does not intentionally attach chat content, attachments, or credentials. Details are in the privacy policy.
- Linux on x86-64 or arm64 for the managed installer
- Docker + Docker Compose v2 (the installer can install Docker on supported systems)
- ~1 GB RAM free for the app stack (Kokoro TTS pulls ~100 MB on first boot)
- An LLM endpoint (API key or self-hosted)
Next.js 16 · Vercel AI SDK v7 · Better Auth · Drizzle + SQLite · Redis (resume buffer) · base-ui · Tailwind · SearXNG · Kokoro TTS
- docs/deploy.md — updates, backup, troubleshooting
MIT. Fork it, white-label it, ship it. No branding clauses to negotiate around.
