architecture
your vault stays the center
Everyday chat is local-first. The app prefers your installed Claude Code or Codex CLI, injects the bundled twin MCP server, and streams the reply into Twin—no Claude Desktop window required for typing in the app. When an Obsidian vault is configured, that vault is the notes root for retrieval and MCP tools; the fallback ~/twin-brain tree is only used when there is no vault. Provider API keys are optional: use them for custom sprites, chat backgrounds, and (if you skip the CLI) in-app chat over HTTPS to Anthropic, OpenAI, or Gemini.
system map
Solid: main path. Dashed: optional Claude Desktop for queued actions.
You
onboarding · picks vault
Twin.md
desktop app · chat · companion · Rust IPC
Vault
Obsidian / Markdown folder · primary notes root
read · retrieve snippets · create quick notes
Local chat
Claude Code or Codex CLI on your Mac, with twin MCP wired in—answers stay in the subprocess, not in a browser tab.
default for conversation
Action queue
local JSONL on disk
Spotify · Playwright · Reminders…
Optional provider keys
Add Anthropic, OpenAI, or Gemini in settings when you want AI-generated sprites, scene wallpapers, or cloud API chat without installing the CLI. Keys are not required to use vault tools or the local CLI path.
Permission center
Approve each request in-app · or use twin-md action in Terminal · same queue
Claude Desktop (separate app)
Optional source setup registers the same twin MCP in Anthropic’s Claude Desktop so that app can read the configured Obsidian vault, poll the action queue, run computer-use, and resolve items. This does not replace in-app chat—it is an extra surface for power workflows.
Real desktop & apps
OS-level work happens here after approval—not silently in someone else’s cloud.
Source CLI path: node packages/cli/dist/bin.js harvest → ~/.claude/twin.md
integrations & permissions