An open-source multi-agent AI orchestration system with voice, 3D visualization, coding agent integrations, desktop automation, and local-first operation. Chat with a COO agent who manages teams of specialized workers — with every message visible in real-time.
Otterbot is an alternative to OpenClaw that prioritizes visibility, simplicity, and local-first operation. Instead of opaque agent pipelines, every agent-to-agent message flows through a central bus that the UI observes directly. All data — including API keys, conversations, and settings — stays encrypted on your machine.
You (the CEO) chat with a single COO agent. The COO breaks your goals into projects, spawns Team Leads, who pull Worker agents from a registry of 14 specialists. An Admin Assistant handles personal productivity (todos, email, calendar). All communication flows through a central message bus — and you can watch it all happen in real-time.
CEO (you)
├── COO (always running)
│ └── Team Lead (per project)
│ ├── Coder
│ ├── Researcher
│ ├── OpenCode Coder
│ ├── Claude Code Coder
│ └── Browser Agent
└── Admin Assistant (personal productivity)
The WebUI is a three-panel layout:
- Left Panel — project list, conversation history, and navigation
- Center Panel — switches between 15+ views: Dashboard, Chat, Kanban board, Calendar, Inbox, Todos, Code (coding agent terminals), Desktop (virtual XFCE), Agent Graph, Message Stream, 3D Live View, Room Builder, Files, Usage analytics, and Settings
- Right Panel — agent inspector, activity feed, and context-sensitive details
The chat panel supports markdown, Mermaid diagrams, and optional voice (TTS/STT).
The fastest way to get Otterbot running. The install script handles Docker detection, generates config files, and starts the container.
curl -fsSL https://otterbot.ai/install.sh | shirm https://otterbot.ai/install.ps1 | iexThis will:
- Check for Docker (and offer to install it if missing)
- Create
~/otterbot/with adocker-compose.ymland.env(auto-generated DB encryption key) - Pull the latest image and start the container
- Print the URL: https://localhost:62626
On first launch, the Setup Wizard walks you through choosing an LLM provider, entering your API key, creating your profile, and setting a login passphrase.
Flags: --beta (use beta channel), --dir <path> (custom install directory), --no-start (generate files only)
If you prefer to set things up yourself:
docker run -d -p 62626:62626 --name otterbot \
-e OTTERBOT_DB_KEY=$(openssl rand -hex 16) \
-v ~/otterbot:/otterbot \
--shm-size 256m \
ghcr.io/toosmooth/otterbot:latestThe container runs Node 22 as a non-root user with a full development environment pre-installed:
- Languages: Go, Rust, Python, Java, Ruby
- Desktop: XFCE + Xvfb + x11vnc + noVNC (virtual desktop viewable in the web UI)
- Browser: Playwright with Chromium (headed mode when desktop is enabled)
- CLI tools: GitHub CLI, coding agent CLIs (OpenCode, Claude Code, Codex)
Pre-built images are published to GitHub Container Registry:
# Stable release
docker pull ghcr.io/toosmooth/otterbot:latest
# Beta / pre-release
docker pull ghcr.io/toosmooth/otterbot:beta
# Specific version (e.g. v0.4.0)
docker pull ghcr.io/toosmooth/otterbot:v0.4.0git clone https://github.com/TOoSmOotH/otterbot.git
cd otterbot
pnpm install
cp .env.example .env # edit .env and set OTTERBOT_DB_KEY
pnpm db:push
pnpm dev # backend on :62626, frontend on :5173Otterbot uses a three-branch promotion model:
dev → beta → main
| Branch | Purpose | Protection | Container Tag |
|---|---|---|---|
dev |
Integration / daily work | None (push freely) | — |
beta |
Pre-release testing | PRs required, CI must pass | :beta, :vX.Y.Z-beta.N |
main |
Stable releases | PRs required, CI must pass | :latest, :vX.Y.Z |
- Push your changes to
dev— CI runs tests and build automatically. - Open a PR from
dev→beta— once CI passes, merge it. Release-please will create a release PR with a changelog and pre-release version bump. - Merge the release PR on
beta— this publishes a:betacontainer image to GHCR. - Open a PR from
beta→main— once CI passes, merge it. Release-please will create a release PR with a stable version bump. - Merge the release PR on
main— this publishes the:latestcontainer image to GHCR.
This project uses Conventional Commits for automated versioning:
fix: ...→ patch bump (0.1.0 → 0.1.1)feat: ...→ minor bump (0.1.0 → 0.2.0)feat!: ...orBREAKING CHANGE:→ major bump (0.1.0 → 1.0.0)
The central design decision: every message flows through one bus. The bus does three things for each message:
- Persists it to SQLite
- Routes it to the target agent
- Broadcasts it to the frontend via Socket.IO
This is why visibility works — the UI is just another consumer of the bus.
| Role | Description |
|---|---|
| CEO | You. The only human in the system. Chats with the COO. |
| COO | Always running. Receives goals, spawns Team Leads, manages projects. Has a defined personality: direct, action-biased, no fluff. |
| Admin Assistant | Always running. Handles personal productivity — todos, reminders, email (Gmail), and calendar. Operates outside of projects. |
| Team Lead | Spawned per project. Queries the registry for workers, assigns tasks, reports to COO. |
| Worker | Spawned from registry templates. Executes specific tasks (coding, research, browsing, etc.) and reports back. |
The registry contains 14 pre-built agent templates:
| Agent | Description |
|---|---|
| COO | Receives goals from the CEO and delegates to Team Leads |
| Team Lead | Manages a team of workers for a project, breaks directives into tasks |
| Coder | Writes and edits code, proficient in multiple languages |
| Researcher | Gathers information, analyzes options, provides findings |
| Reviewer | Reviews code and plans for quality and correctness |
| Writer | Writes documentation, specifications, and prose |
| Planner | Breaks down goals into tasks, designs project architecture |
| Security Reviewer | Audits code for vulnerabilities and dependency risks |
| Tester | Writes and runs tests, identifies edge cases |
| OpenCode Coder | Delegates complex coding tasks to OpenCode (autonomous AI coding agent) |
| Claude Code Coder | Delegates coding tasks to Claude Code (Anthropic's coding agent) |
| Codex Coder | Delegates coding tasks to Codex CLI (OpenAI's coding agent) |
| Browser Agent | Interacts with web pages — navigate, fill forms, click, extract text |
| Tool Builder | Creates custom JavaScript tools that extend agent capabilities |
Templates are fully customizable — edit the system prompt, model, provider, capabilities, and tools through the Settings UI or the REST API.
Otterbot uses the Vercel AI SDK for multi-provider support. API keys and provider configuration are managed through the Settings UI (stored encrypted in the database).
| Provider | Use Case |
|---|---|
| Anthropic | Claude models (supports extended thinking on Sonnet 4.5+ / Opus 4+) |
| OpenAI | GPT models (GPT-4o, o3, etc.) |
| Google Gemini | Gemini models (Gemini 2.5, 2.0, etc.) |
| Ollama | Local models (Llama, Mistral, Codellama, Qwen, etc.) |
| OpenRouter | Aggregated access to 200+ models from multiple providers |
| GitHub Copilot | Access Claude and OpenAI models via GitHub Copilot API |
| Hugging Face | Access models hosted on Hugging Face Inference API (Llama, Mistral, Phi, Qwen) |
| NVIDIA | Access models via NVIDIA API (Llama, Mistral) |
| OpenAI-Compatible | Any OpenAI-compatible endpoint — Together, Groq, LM Studio, vLLM, etc. |
Each agent can use a different provider and model. Override at the template level or per-spawn.
Otterbot bridges conversations from external messaging platforms to the COO. Configure providers in the Settings UI, pair users, and route messages seamlessly.
| Provider | Description |
|---|---|
| Discord | Bridge via Discord bot — pair users, route messages to/from the COO |
| Slack | Bridge via Slack app (Bolt SDK) — thread support, user pairing |
| Matrix | Federated chat bridge via matrix-js-sdk — supports end-to-end encryption (E2EE) |
| IRC | Bridge to IRC networks via irc-framework — TLS support, multi-channel |
| Microsoft Teams | Bridge via Bot Framework SDK — tenant-based configuration, user pairing |
Each project gets a sandboxed workspace:
/otterbot/projects/<project-id>/
├── repo/ # Project repository — all code workers write here directly
├── shared/ # All agents on this project can read/write
│ ├── specs/
│ ├── docs/
│ └── artifacts/
└── agents/
├── <agent-1>/ # Private to agent 1
└── <agent-2>/ # Private to agent 2
All code workers operate directly in the repo/ directory. The Team Lead coordinates task ordering to avoid conflicts.
Otterbot supports optional text-to-speech and speech-to-text, configurable in the Settings UI.
| Provider | Description |
|---|---|
| Kokoro (local) | Runs entirely on-device via kokoro-js with ONNX runtime. 68 voices across 9 languages. No API key needed. |
| Edge TTS (cloud) | Microsoft neural TTS — free, no API key needed. High-quality voices with rate control. |
| OpenAI-compatible | Any endpoint implementing /v1/audio/speech (OpenAI, local alternatives). |
| Provider | Description |
|---|---|
| Whisper (local) | Runs on-device via HuggingFace Transformers. Multiple model sizes from tiny (~75MB) to small (~500MB). |
| OpenAI-compatible | Any endpoint implementing /v1/audio/transcriptions. |
| Browser | Client-side Web Speech API — no server processing. |
The Live View renders active agents as animated 3D characters using Three.js / React Three Fiber. Each agent is assigned a model pack (16 available character packs). The Room Builder lets you customize the 3D scene with drag-and-drop prop placement, transform controls, and scene persistence.
Web search is available to agents via the web_search tool. Configure your preferred provider in Settings:
| Provider | Description |
|---|---|
| DuckDuckGo | Free, no API key required. Good default for getting started. |
| SearXNG | Self-hosted, no API key required. Use pnpm docker:up:search to start alongside Otterbot. |
| Brave Search | Requires an API key from brave.com. |
| Tavily | Requires an API key from tavily.com. |
Connect your Google account via OAuth in Settings. Once connected:
- Calendar panel — view and manage events from Google Calendar
- Inbox panel — browse, read, send, reply to, and archive Gmail messages
- Agent tools — the Admin Assistant (and workers with the right skills) can read/send email, create/update calendar events, and manage labels
Bridge conversations from external messaging platforms to the COO:
- Discord — configure your bot token, approve pairing requests, route messages to/from the COO
- Slack — connect via Slack app with bot token and signing secret, supports threaded conversations
- Matrix — connect to any Matrix homeserver with optional end-to-end encryption (E2EE)
- IRC — connect to IRC networks with TLS support and multi-channel routing
- Microsoft Teams — connect via Bot Framework with app ID/password and tenant configuration
Each bridge supports user pairing — only approved users can interact with the COO through the platform.
Projects can be linked to GitHub repositories:
- Issue monitoring — automatically create Otterbot projects from new GitHub issues
- PR tools — agents can create pull requests, post comments, and review code
- Issue tools — agents can list, read, and comment on issues
Otterbot integrates with external AI coding agents that run in PTY terminals:
| Agent | Description |
|---|---|
| OpenCode | Open-source coding agent — multi-file implementations, refactoring |
| Claude Code | Anthropic's coding agent — complex implementations, code review |
| Codex CLI | OpenAI's coding agent — code generation, implementation tasks |
When a coding agent worker is spawned, it opens a PTY terminal session. The Code panel in the UI shows real-time terminal output, supports interactive input, and displays file diffs when sessions complete. Coding agents are pre-installed in the Docker image.
The Docker container includes a virtual XFCE desktop accessible via noVNC:
- XFCE + Xvfb + x11vnc — full desktop environment running headlessly
- noVNC — view the desktop directly in Otterbot's Desktop panel (or pop it out to a separate window)
- Headed Playwright — when the desktop is enabled, the Browser Agent runs Chromium in visible mode so you can watch it browse
Enable with ENABLE_DESKTOP=true in .env. Configure resolution with DESKTOP_RESOLUTION (default: 1280x720x24).
Skills are markdown-based system prompt fragments that define specialized behaviors for agents:
- Each skill specifies a name, description, required tools, and a markdown body with instructions
- Skills are assigned to agent registry entries — when an agent spawns, its skills' tools and prompts are merged in
- Create, edit, import/export, and clone skills through the Settings UI or REST API
Agents can store and retrieve memories for long-term context:
- Episodic memory — save observations, decisions, and lessons learned with semantic categories
- Semantic search — retrieve relevant memories by natural language query
- Scoped access — memories can be global, scoped to an agent type, or scoped to a project
Soul documents define agent personality and behavioral guidelines:
- Assign personality documents to specific agent roles or individual registry entries
- The system can suggest soul document improvements based on conversation patterns
The Tool Builder agent can create custom JavaScript tools at runtime:
- Define tool name, description, parameters, and async JavaScript code
- Tools are stored in the database and available to all agents
- Test tools interactively before deploying them
- Create tools via the Tool Builder agent, the REST API, or the Settings UI
Otterbot uses passphrase-based authentication with scrypt hashing and secure session cookies (7-day expiry). On first launch, the Setup Wizard guides you through provider configuration, profile creation, and passphrase setup. All credentials are stored in the encrypted SQLite database (keyed by OTTERBOT_DB_KEY).
otterbot/
├── packages/
│ ├── shared/ # @otterbot/shared — TypeScript types & event contracts
│ ├── server/ # @otterbot/server — Fastify + Socket.IO backend
│ │ └── src/
│ │ ├── agents/ # COO, Admin Assistant, Team Lead, Worker + base class
│ │ │ └── prompts/ # System prompts
│ │ ├── auth/ # Passphrase auth & sessions
│ │ ├── backup/ # Database backup/restore
│ │ ├── bus/ # Central message bus
│ │ ├── calendar/ # Calendar integration
│ │ ├── coding-agents/ # Coding agent PTY management
│ │ ├── db/ # Drizzle ORM schema + seed
│ │ ├── desktop/ # Virtual desktop (XFCE/noVNC)
│ │ ├── chat/ # Chat provider interface & registry
│ │ ├── discord/ # Discord bot integration
│ │ ├── github/ # GitHub API + issue monitoring
│ │ ├── google/ # Google OAuth + Gmail/Calendar APIs
│ │ ├── irc/ # IRC bridge integration
│ │ ├── matrix/ # Matrix bridge integration
│ │ ├── llm/ # Vercel AI SDK adapter (multi-provider)
│ │ ├── memory/ # Episodic memory + semantic search
│ │ ├── models3d/ # 3D model pack discovery
│ │ ├── modules/ # Module system (installable extensions)
│ │ ├── opencode/ # OpenCode agent integration
│ │ ├── packages/ # apt/npm package management
│ │ ├── registry/ # Agent template CRUD
│ │ ├── reminders/ # Todo reminder scheduler
│ │ ├── schedulers/ # Scheduled task runners
│ │ ├── settings/ # Provider & feature settings
│ │ ├── slack/ # Slack bridge integration
│ │ ├── skills/ # Skill management
│ │ ├── socket/ # Socket.IO event handlers
│ │ ├── stt/ # Speech-to-text providers
│ │ ├── teams/ # Microsoft Teams bridge integration
│ │ ├── todos/ # Todo management
│ │ ├── tools/ # Agent tools (35+ built-in)
│ │ │ └── search/ # Search provider implementations
│ │ ├── tts/ # Text-to-speech providers
│ │ ├── utils/ # Shared utilities
│ │ └── workspace/ # Sandboxed file access
│ └── web/ # @otterbot/web — React + Vite frontend
│ └── src/
│ ├── components/
│ │ ├── auth/ # Login screen
│ │ ├── calendar/ # Google Calendar panel
│ │ ├── character-select/# 3D model pack picker
│ │ ├── chat/ # CEO ↔ COO chat panel
│ │ ├── code/ # Coding agent terminal view
│ │ ├── dashboard/ # Project dashboard
│ │ ├── desktop/ # Virtual desktop (noVNC)
│ │ ├── graph/ # React Flow agent visualization
│ │ ├── inbox/ # Gmail inbox panel
│ │ ├── kanban/ # Kanban board (project tasks)
│ │ ├── live-view/ # Three.js 3D agent view
│ │ ├── project/ # Project management
│ │ ├── registry/ # Agent template editor
│ │ ├── room-builder/ # 3D scene editor
│ │ ├── settings/ # Provider settings panels
│ │ ├── setup/ # First-run setup wizard
│ │ ├── stream/ # Live message bus feed
│ │ ├── todos/ # Todo list panel
│ │ └── usage/ # Usage analytics panel
│ ├── hooks/ # Socket.IO + utility hooks
│ ├── lib/ # Utility libraries
│ ├── stores/ # Zustand state management
│ └── types/ # TypeScript types
├── modules/ # Installable extension modules
├── assets/
│ ├── workers/ # 3D character model packs (GLTF)
│ ├── environments/ # 3D environment packs
│ └── scenes/ # Scene configuration files
├── Dockerfile # Multi-stage production build (Node 22)
└── docker-compose.yml # Container orchestration
| Layer | Choice |
|---|---|
| Monorepo | pnpm workspaces |
| Backend | Node.js + TypeScript + Fastify |
| Real-time | Socket.IO |
| Database | Encrypted SQLite via better-sqlite3-multiple-ciphers + Drizzle ORM |
| Frontend | Vite + React + TypeScript |
| Styling | Tailwind CSS + shadcn/ui |
| Agent Graph | React Flow (@xyflow/react) |
| 3D Rendering | Three.js + React Three Fiber + Drei |
| Markdown | React Markdown + Mermaid diagrams |
| State | Zustand |
| LLM | Vercel AI SDK (Anthropic, OpenAI, Google Gemini, Ollama, OpenRouter, GitHub Copilot, Hugging Face, NVIDIA, OpenAI-compatible) |
| Chat Bridges | Discord, Slack, Matrix, IRC, Microsoft Teams |
| TTS | Kokoro.js (local) + Edge TTS + OpenAI-compatible |
| STT | HuggingFace Transformers / Whisper (local) + OpenAI-compatible + Browser Web Speech API |
| Browser Automation | Playwright (Chromium — headed or headless) |
| Coding Agents | OpenCode, Claude Code, Codex CLI via node-pty |
| Desktop | XFCE + Xvfb + x11vnc + noVNC |
| Modules | Installable extension system |
| Testing | Vitest (unit) + Playwright (e2e) |
# Development
pnpm dev # Start server (:62626) and web (:5173)
pnpm dev:server # Server only
pnpm dev:web # Frontend only
# Build
pnpm build # Build all packages
# Test
pnpm test # Run unit tests (Vitest)
pnpm test:watch # Run tests in watch mode
pnpm test:e2e # Run Playwright e2e tests
pnpm test:e2e:docker # Run e2e tests in Docker (build + run + teardown)
# Lint
pnpm lint # Lint all packages
# Database
pnpm db:push # Push schema to database
pnpm db:seed # Seed registry with default agent templates
# Docker
pnpm docker:build # Build container image
pnpm docker:up # Start container (detached)
pnpm docker:up:search # Start container + SearXNG search engine
pnpm docker:down # Stop container
pnpm docker:dev # Start with hot-reload (dev mode)Create a .env file from the example:
cp .env.example .env| Variable | Required | Default | Description |
|---|---|---|---|
OTTERBOT_DB_KEY |
Yes | — | Encryption key for the SQLite database |
PORT |
62626 |
Server port | |
HOST |
0.0.0.0 |
Server bind host | |
DATABASE_URL |
file:./data/otterbot.db |
SQLite database path | |
WORKSPACE_ROOT |
./data |
Root directory for agent workspaces | |
ENABLE_DESKTOP |
true |
Enable the virtual XFCE desktop | |
DESKTOP_RESOLUTION |
1280x720x24 |
Virtual desktop resolution | |
SUDO_MODE |
restricted |
restricted or full (unrestricted sudo) |
|
OTTERBOT_ALLOWED_ORIGIN |
(same-origin) | Comma-separated CORS origins | |
OTTERBOT_UID |
1000 |
Docker container user ID | |
OTTERBOT_GID |
1000 |
Docker container group ID | |
OTTERBOT_DATA_DIR |
./docker/otterbot |
Docker host data directory |
Note: LLM API keys, search provider keys, TTS/STT configuration, and model preferences are all managed through the Settings UI and stored in the encrypted database — not in environment variables.
Persistent home directory: The container's HOME is set to
/otterbot/home(inside the bind mount). Place SSH keys at$OTTERBOT_DATA_DIR/home/.ssh/, Git config athome/.gitconfig, etc.
Bootstrap script: Create
$OTTERBOT_DATA_DIR/config/bootstrap.shto install OS packages or tools at container startup. The script runs as root on every start —apt-getandnpm install -gboth work.
# Setup
GET /api/setup/status # Check if setup is complete
POST /api/setup/probe-models # Probe LLM provider for available models
POST /api/setup/tts-preview # Preview a TTS voice
POST /api/setup/complete # Complete the setup wizard
# Auth
POST /api/auth/login # Login with passphrase
POST /api/auth/logout # Logout
GET /api/auth/check # Check auth status
# Assets (public)
GET /api/model-packs # List 3D character model packs
GET /api/environment-packs # List 3D environment packs
GET /api/scenes # List scene configurations
# Registry
GET /api/registry # List all agent templates
GET /api/registry/:id # Get a specific template
POST /api/registry # Create a new template
POST /api/registry/:id/clone # Clone a template
PATCH /api/registry/:id # Update a template
DELETE /api/registry/:id # Delete a template
# Messages & Agents
GET /api/messages # Message history (?projectId=&agentId=&limit=)
GET /api/conversations # List conversations
GET /api/agents # List active agents
# Projects
POST /api/projects # Create a project manually
# Packages
GET /api/packages # List installed packages (apt/npm/repos)
POST /api/packages # Install a package
DELETE /api/packages # Uninstall a package
# Todos
GET /api/todos # List all todos
POST /api/todos # Create a todo
PUT /api/todos/:id # Update a todo
DELETE /api/todos/:id # Delete a todo
# Custom Tools
GET /api/tools # List custom tools
GET /api/tools/:id # Get a specific tool
GET /api/tools/available # List all available tool names
GET /api/tools/examples # Get tool examples
POST /api/tools # Create a custom tool
POST /api/tools/ai-generate # AI-generate a tool
POST /api/tools/:id # Execute a tool
PATCH /api/tools/:id # Update a custom tool
DELETE /api/tools/:id # Delete a custom tool
# Skills
GET /api/skills # List all skills
GET /api/skills/:id # Get a specific skill
GET /api/skills/:id/export # Export a skill
POST /api/skills # Create a skill
POST /api/skills/:id/clone # Clone a skill
POST /api/skills/import # Import a skill
POST /api/skills/scan # Scan for skills
PUT /api/skills/:id # Update a skill
DELETE /api/skills/:id # Delete a skill
# Usage Analytics
GET /api/usage/summary # Usage summary
GET /api/usage/recent # Recent usage
GET /api/usage/by-model # Usage by model
GET /api/usage/by-agent # Usage by agent
# Scenes & Profile
PUT /api/scenes/:id # Save a scene configuration
GET /api/profile # Get user profile
PUT /api/profile/model-pack # Update user 3D model pack
# Desktop
GET /api/desktop/status # Desktop environment status
# Google (Calendar & Gmail)
GET /api/settings/google # Get Google settings
PUT /api/settings/google # Update Google settings
POST /api/settings/google/oauth/begin # Start OAuth flow
POST /api/settings/google/disconnect # Disconnect Google account
GET /api/calendar/events # List calendar events
POST /api/calendar/events # Create a calendar event
PUT /api/calendar/events/:id # Update a calendar event
DELETE /api/calendar/events/:id # Delete a calendar event
GET /api/gmail/labels # List Gmail labels
GET /api/gmail/messages # List Gmail messages
GET /api/gmail/messages/:id # Read a Gmail message
POST /api/gmail/send # Send an email
POST /api/gmail/messages/:id/archive # Archive a message
# Discord
GET /api/settings/discord # Get Discord settings
PUT /api/settings/discord # Update Discord settings
POST /api/settings/discord/test # Test Discord connection
POST /api/settings/discord/pair/approve # Approve pairing request
POST /api/settings/discord/pair/reject # Reject pairing request
DELETE /api/settings/discord/pair/:userId # Remove a paired user
# Settings — LLM Providers
GET /api/settings # Get provider settings
GET /api/settings/providers # List all providers
POST /api/settings/providers # Add a provider
PUT /api/settings/providers/:id # Update provider config
DELETE /api/settings/providers/:id # Delete a provider
PUT /api/settings/defaults # Update tier defaults (COO/TL/Worker models)
POST /api/settings/provider/:id/test # Test a provider connection
GET /api/settings/models/:id # Fetch available models from a provider
# Settings — Search
GET /api/settings/search # Get search settings
PUT /api/settings/search/provider/:id # Update search provider
PUT /api/settings/search/active # Set active search provider
POST /api/settings/search/provider/:id/test # Test search provider
# Settings — TTS
GET /api/settings/tts # Get TTS settings
PUT /api/settings/tts/enabled # Enable/disable TTS
PUT /api/settings/tts/active # Set active TTS provider
PUT /api/settings/tts/voice # Set voice
PUT /api/settings/tts/speed # Set speed
PUT /api/settings/tts/provider/:id # Update TTS provider config
POST /api/settings/tts/provider/:id/test # Test TTS provider
POST /api/settings/tts/preview # Preview voice
# Settings — STT
GET /api/settings/stt # Get STT settings
PUT /api/settings/stt/enabled # Enable/disable STT
PUT /api/settings/stt/active # Set active STT provider
PUT /api/settings/stt/language # Set language
PUT /api/settings/stt/model # Set Whisper model
PUT /api/settings/stt/provider/:id # Update STT provider config
POST /api/settings/stt/provider/:id/test # Test STT provider
# Settings — Scheduled Tasks
GET /api/settings/custom-tasks # List scheduled tasks
POST /api/settings/custom-tasks # Create a scheduled task
PUT /api/settings/custom-tasks/:id # Update a scheduled task
DELETE /api/settings/custom-tasks/:id # Delete a scheduled task
# Settings — Model Pricing
GET /api/settings/pricing # Get model pricing config
PUT /api/settings/pricing/:model # Update pricing for a model
# Settings — Backup
GET /api/settings/backup # Download database backup
POST /api/settings/restore # Restore from backup
# Modules
GET /api/modules # List installed modules
POST /api/modules/install # Install a module
POST /api/modules/:id/toggle # Enable/disable a module
DELETE /api/modules/:id # Remove a module
POST /api/modules/:moduleId/webhook # Module webhook endpoint
# Transcription
POST /api/stt/transcribe # Transcribe audio
Agent lifecycle:
agent:spawned— new agent createdagent:status— agent status change (idle/thinking/acting/done/error)agent:destroyed— agent removedagent:stream— streaming token from a worker agentagent:thinking— extended thinking token from a workeragent:thinking-end— extended thinking complete for a workeragent:tool-call— agent invoked a toolagent:move— agent moved between 3D world zones
COO:
coo:response— COO's response to the CEOcoo:stream— streaming token from COOcoo:thinking— extended thinking token (Anthropic models)coo:thinking-end— extended thinking completecoo:audio— TTS audio for COO response
Admin Assistant:
admin-assistant:stream— streaming token from Admin Assistantadmin-assistant:thinking— extended thinking tokenadmin-assistant:thinking-end— extended thinking complete
Bus:
bus:message— any message on the bus
Conversations & Projects:
conversation:created— new conversation startedproject:created— new project createdproject:updated— project metadata changedproject:deleted— project deleted
Kanban:
kanban:task-created— new kanban taskkanban:task-updated— kanban task changedkanban:task-deleted— kanban task removed
Todos:
todo:created— new todo itemtodo:updated— todo changedtodo:deleted— todo removedreminder:fired— todo reminder triggered
Coding Agents:
codeagent:session-start— coding agent session startedcodeagent:session-end— session ended (includes file diffs)codeagent:event— generic coding agent eventcodeagent:message— message from coding agentcodeagent:part-delta— streaming part delta (text/tool output)codeagent:awaiting-input— coding agent waiting for user inputcodeagent:permission-request— coding agent requesting tool permission
Terminals:
terminal:data— terminal output dataterminal:replay— terminal replay buffer (on subscribe)
3D World:
world:zone-added— new zone added to 3D sceneworld:zone-removed— zone removed from 3D scene
Discord:
discord:pairing-request— Discord user requesting to pairdiscord:status— Discord bot connection status
Chat:
ceo:message— send a message to the COOceo:new-chat— start a new conversationceo:list-conversations— request conversation listceo:load-conversation— load a specific conversation
Projects:
project:list— list all projectsproject:get— get a single projectproject:enter— enter a project (returns conversations + kanban tasks)project:delete— delete a projectproject:recover— recover a deleted projectproject:conversations— list conversations for a projectproject:create-manual— create a project manually (with GitHub repo, issue monitoring, etc.)project:get-agent-assignments— get agent type assignments for a projectproject:set-agent-assignments— set agent type assignments for a project
Agents:
registry:list— request registry entriesagent:inspect— request details about a specific agentagent:activity— get messages and activity for an agentagent:stop— stop a running agent
Coding Agents:
codeagent:respond— send input to a coding agent sessioncodeagent:permission-respond— respond to a permission request (once/always/reject)
Terminals:
terminal:input— send input to a PTY terminalterminal:resize— resize a terminalterminal:subscribe— subscribe to terminal outputterminal:end— end a terminal session
Soul Documents:
soul:list— list all soul documentssoul:get— get a soul document by rolesoul:save— create or update a soul documentsoul:delete— delete a soul documentsoul:suggest— get AI-generated soul document suggestions
Memory:
memory:list— list memories (with optional filters)memory:save— save a memorymemory:delete— delete a memorymemory:search— semantic search over memories
MIT — Copyright 2026 Mike Reeves