← Design notes

Local rooms — the solo mode shipped 2026-08-24 · dev-only

A chat whose panel runs on an open-weight model on the dev PC's own GPU (Ollama, RTX 4090) instead of a cloud API. Built to test uncensored open-weight models against the app's real harness — at $0 a turn, with nothing leaving the machine.

The invariant: a local room makes no external provider call, ever. Not "fewer" — none. Every cloud door either refuses with a line or degrades deterministically, and the smoketest pins it: a scripted local turn's only wire is localhost.

Born local

Local is chosen at birth, never switched into or out of. The new-chat Model dropdown offers the local seats; picking one creates the room local for life. This deletes every seam a live switch would open — a mounted game with nowhere to run, a memory half-state (read this morning, off tonight), a + menu popping in and out — and it keeps incognito what it already is: a creation-time stamp.

What a local room runs, and what it refuses

surfaceon a local roomwhy
Panel (the voices)the local modelthe point
Floor producerOff · Code · Local (arm v1l)v1l runs the FP on the room's own model — same weights, no GPU swap. Default off: latency unmeasured.
Split run (prop + act), kits, toysoffthe device's clerks are cloud calls; a game the device cannot run does not go on the table
+ menu (Photo · Camera · Kits · Toys)not renderedeverything behind it is cloud-backed; the photo door also refuses server-side (the eyes are cloud)
@Assistant dispatchrefused with a lineweb search is inherently non-local
Translate (Layer B)offthe translator is a cloud call
Auto-titleoff — plain truncation titlesowner's call: one less call, one less surprise on the GPU
Persona memoryauto-incognitoforced at Room.__init__, so every creation path (create · fork · resume) is covered at once
Costbooked at $0the ledger keeps tokens + latency; the price table rows are zero

The plumbing

MAD_LOCAL_LLM_URL=http://localhost:11434/v1/chat/completions ← set ONLY by the dev launchers unset (the box) → the rows do not exist: no picker entries, no routing, no mode
tradeOne GPU, one model at a time. Alternating Qwen3 and Magidonia rooms pays a 10–30s model swap per alternation — A/B them in separate stretches. And the v1l FP shares the panel's Ollama slot, so its call can evict the panel's KV-cache prefix and force a re-prefill; that is why it defaults off until measured (OLLAMA_NUM_PARALLEL=2 is the knob if it bites).

Owed

-ish · local rooms · born local, solo, $0 · see also Dev loop · Floor producer · Chat start