A self-hosted household agent: a local model plus a fleet of specialized runtimes on a GPU host. The brain behind Jellybean and the local runtime bridge that Resumate talks to — nothing leaves the machine, no third-party LLM, no API keys.
At the center is a local model (Qwen3-8B class) wrapped by a set of stateless, single-purpose runtimes: knowledge and retrieval, vision, ingestion, event and record persistence, voice I/O, and realtime relay. The agent loop runs on the host where the runtimes live; clients connect over a small bridge (titan.sh, titan bridge profile <app>).
Architecture
The design is boundary-native: App → Runtime → Contract → Broker → Provider. Runtimes are stateless, fleet-tier services behind explicit contracts; any credentials for outside providers live only in app-specific brokers, never in the runtimes themselves.
Three pinned rules keep it honest:
- Credential boundary = app boundary. Keys live only in an app's broker, never in a shared runtime.
- Runtimes are stateless. All durable state lives in Postgres; a runtime can be restarted or replaced at any time.
- Cores orchestrate. The app core owns the full request flow; runtimes do one thing well.
Runtime fleet
Grouped by capability, each a stateless service behind a contract:
- Authority — identity: passkey and handle management, capability-token issuance.
- Generation — text, image, and vision runtimes wrapping the local model.
- Retrieval — vector retrieval on Postgres + pgvector; document parsing; URL and document ingest with chunk indexing.
- State — event sourcing, record persistence, and workflow orchestration.
- Stream — realtime WebSocket relay, a signal bus, and voice processing.
- Observability — instrumentation and health across the fleet.
Bridge
Client apps source a bridge profile to wire themselves to the local runtimes:
eval "$(titan bridge profile <app>)"The profile exports the runtime URLs and database wiring an app expects (identity, text, retrieval, and so on), so a repo-local .env.local and the host fleet stay aligned. Jellybean speaks to the agent loop through the same bridge; Resumate uses it as its canonical local integration path.