Chat Interface for Self-Hosted Models
Talk to your own models. Nothing leaves the machines you own.
Wheatley is a chat interface that points at inference you run yourself instead of somebody else's API. Ask it questions, paste a stack trace, work through a problem — and the conversation stays on your hardware, because the model is on your hardware. We built it for ourselves, use it every day, and open-sourced it because there was no reason not to.
In daily internal use and open-sourced. Web only for now; the mobile builds exist but are not in any store.
What it does today
Everything on this list works now. Anything that does not is in the list below it.
- Answers stream in as the model generates them, token by token
- Keeps your conversations so you can pick one up later
- Works with any OpenAI-compatible backend — LM Studio, vLLM, SGLang
- Your own account, with two-factor codes if you want them
- Per-conversation instructions when one thread needs different rules
- Stop a long answer half way and keep what you have
- Nothing is sent anywhere except the model you pointed it at
Not yet
iOS · Android — built, but not in a store, so not something you can act on today.
Running it yourself
There is no hosted version and there is not going to be one. The whole point is that the model and the transcripts are on hardware you control — selling you a copy running on ours would be selling the opposite of the product. Self-host it with one container and a database.
What you need
- An OpenAI-compatible inference endpoint and a token for it. LM Studio, vLLM and SGLang all work — Wheatley only speaks
/v1/chat/completions. - A database. Postgres, MySQL, MariaDB or SQLite — the image picks one at build.
- A reverse proxy terminating TLS, if it is reachable from the internet. The session cookie is marked
Secure, so a browser will refuse to send it over plain HTTP on anything but localhost.
Two keys, generated once
Back them up before you start. Losing the TOTP key locks every enrolled user out of their second factor — the seeds are sealed with it and nothing else, so there is no recovery path.
openssl rand -hex 32 # SESSION_SIGNING_KEY
openssl rand -hex 32 # TOTP_ENCRYPTION_KEYThe compose file, with every value that needs a decision commented, is in the repository under scripts/compose/.
One thing that catches people out
If answers come back empty, raise CHAT_MAX_OUTPUT_TOKENS. That limit counts the model's reasoning tokens as well as the answer, and a reasoning model spends hundreds to low thousands of them before it writes a word — so set it too low and the model runs out mid-thought and returns nothing, which looks exactly like it refusing to answer.
How it is built
Rust (Axum) · React Native / Expo · PostgreSQL · SQLite · MySQL · MariaDB · Server-sent events
The inference token never reaches a browser: the server relays every request, so the credential for your GPU stays on the machine you put it on. Conversations are stored in your database and deleting your account deletes them — that is a cascade in the schema, not a background job that might not run.