Station · self-hosted AI chat

The model runs on a machine you can touch.

Breeze is a chat app you host yourself. Your prompts go to a model on your own hardware and stay there. Exactly one feature reaches the internet, and only after you switch it on.

Inference
localhost:11434
Transcript
your MongoDB
Egress
web search only
Licence
MIT

The boundary

Here is exactly what leaves.

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.

Your machine
  • 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.

Read the security guarantees

Generative UI

Some answers are better drawn.

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.

How the grammar works

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.

Controls

Hands stay on the keys.

  • KSearch conversations
  • BToggle the sidebar
  • OStart a new chat

Take it home

Run it on your own hardware.

Clone it, point it at your model, and the whole thing is yours -- transcripts, accounts, and the machine doing the thinking.