local-ai

A single NVIDIA DGX Spark — brightroar, a GIGABYTE AI TOP ATOM — serving open models to my own pipelines, my coding harnesses and my homelab, with a web UI on top. Claude Code and Claude Desktop stay as they are, talking straight to Anthropic, with only hooks that report to apps on my own machines added; this is a separate mode.

%% The overview: one file, included by index.qmd and architecture.qmd, never copied.
%% It changes with the Architecture page's diagrams (CLAUDE.md, Docs must be true).
flowchart TB
  classDef planned stroke-dasharray: 5 5

  subgraph mine["my Mac and phone"]
    harness["pi, opencode, Hermes<br/>in a terminal or Orca"]
    browser["web UI<br/>in a browser or as an app"]
  end

  later["my apps · Phase 3<br/>family and guests · Phase 6"]:::planned
  claude["Claude Code and<br/>Claude Desktop<br/>wherever they run"]
  anthropic(("Anthropic"))

  subgraph spark["brightroar · the DGX Spark"]
    owui["Open WebUI<br/>with SearXNG for search"]
    agent["pi as agent<br/>in tmux"]
    litellm["LiteLLM<br/>a key per app · Phase 3"]:::planned
    swap["llama-swap<br/>starts the model<br/>a request names"]
    gate["spark-gate<br/>takes both over · Phase 2"]:::planned
    guard["fit check, memory brake<br/>a model loads only if it fits"]
    engines["llama.cpp, whisper.cpp<br/>models for chat, coding,<br/>embeddings, speech"]
    vllm["vLLM or SGLang<br/>Phase 5"]:::planned
  end

  nas["Synology<br/>alerts · Phase 2<br/>backups · Phase 4"]:::planned

  harness -- "SSH tunnel, over Tailscale<br/>or the LAN" --> swap
  browser -- "HTTPS over Tailscale" --> owui
  later -.-> litellm
  claude -- "never through the Spark" --> anthropic
  owui --> swap
  agent --> swap
  litellm -.-> swap
  swap --> guard
  gate -.-> guard
  guard --> engines
  guard -.-> vllm
  gate -. "alerts" .-> nas

Solid parts are built and running; dashed parts are planned, labelled with the phase that brings them. Architecture has the detail: every port, account and path.