Station · self-hosted AI chat
The boundary
Most private-AI pages ask you to take their word for it. This is the whole map -- every part of Breeze, drawn on the honest side of the line.
You
browser
Breeze
Next.js + FastAPI
The model
Ollama · :11434
Transcripts
your MongoDB
Crossed only when you switch it on
Nothing else is called. Conversation titles are written by the same local model that writes the replies, not by a hosted one.
Generative UI
When a reply is really a trend, a table or a shortlist, Breeze writes the numbers for one and the app draws it. Every example below is a live widget, not a picture -- pick one to see the spec that produced it.
You asked: How did revenue move this year?
What the model writes
```breeze-ui
{
"type": "chart",
"variant": "line",
"title": "Monthly revenue",
"unit": "k",
"x": ["Jan", "Feb", "Mar", "Apr", "May", "Jun"],
"series": [
{ "name": "2026", "data": [8.2, 8.6, 9.4, 10.1, 11.8, 13.2] },
{ "name": "2025", "data": [7.1, 7.4, 7.9, 8.2, 8.6, 9.0] }
]
}
```What you see
The model fills in a form the app already knows how to draw. Every spec is checked against a fixed list of widgets first, an unrecognised one shows as plain text, and no part of a reply is ever run as code.
Point Breeze at any Ollama instance you can reach. Local machine, home server, the box under the desk.
ollama pull qwen3Next.js on the front, FastAPI behind it. Both read their config from one env file.
bun run devAccounts live in your own MongoDB. There is no tenant, no plan, and nobody else on the instance.
open localhost:3000Controls
Take it home
Clone it, point it at your model, and the whole thing is yours -- transcripts, accounts, and the machine doing the thinking.