MCPcopy
hub / github.com/OpenBMB/PilotDeck

github.com/OpenBMB/PilotDeck @v0.1.0 sqlite

repository ↗ · DeepWiki ↗ · release v0.1.0 ↗
5,749 symbols 16,655 edges 853 files 228 documented · 4%
README

PilotDeck Docker

PilotDeck runs as two cooperating Node.js processes in the container:

  • Gateway: agent runtime on PILOTDECK_GATEWAY_PORT (default 18789)
  • UI Server: web frontend + REST/WebSocket adapter on SERVER_PORT (default 3001)

The Docker Compose setup persists the full PILOT_HOME directory, including generated config, auth DB, permissions, sessions/projects, memory, skills/plugins, and router stats.

Quick Start with Docker Compose

Prerequisites

Option A: Configure via environment variables

Set the model provider variables in docker-compose.yml or an .env file:

PILOTDECK_MODEL=openai/gpt-4.1
PILOTDECK_API_KEY=sk-your-api-key
PILOTDECK_API_URL=https://api.openai.com/v1

Then start:

docker compose up -d --build

If /root/.pilotdeck/pilotdeck.yaml does not exist in the pilotdeck-home volume, the entrypoint generates it from the PILOTDECK_* environment variables on first start.

Option B: Configure via YAML file

Create the host config file first:

mkdir -p ~/.pilotdeck
cat > ~/.pilotdeck/pilotdeck.yaml <<'YAML'
schemaVersion: 1
agent:
  model: openai/gpt-4.1
model:
  providers:
    openai:
      protocol: openai
      url: https://api.openai.com/v1
      apiKey: sk-your-api-key
      models:
        gpt-4.1: {}
YAML

Then uncomment the config bind mount in docker-compose.yml:

volumes:
  - pilotdeck-home:/root/.pilotdeck
  - ${PILOTDECK_CONFIG:-${HOME}/.pilotdeck/pilotdeck.yaml}:/root/.pilotdeck/pilotdeck.yaml:ro

Start the service:

docker compose up -d --build

The UI is available at http://localhost:3001.

Workspace Mounts

Agents run inside the container. To let them access a host project, mount it into /workspace by uncommenting the workspace bind mount:

volumes:
  - pilotdeck-home:/root/.pilotdeck
  - ${PILOTDECK_WORKSPACE:-${PWD}}:/workspace

You can set PILOTDECK_WORKSPACE=/path/to/project before running docker compose up.

Manual Docker Build & Run

Build the image

docker build -t pilotdeck:latest .

Run with environment variables

docker run -d --name pilotdeck \
  -p 3001:3001 \
  -v pilotdeck-home:/root/.pilotdeck \
  -e PILOTDECK_MODEL=openai/gpt-4.1 \
  -e PILOTDECK_API_KEY=sk-your-api-key \
  -e PILOTDECK_API_URL=https://api.openai.com/v1 \
  pilotdeck:latest

Run with a config file

docker run -d --name pilotdeck \
  -p 3001:3001 \
  -v pilotdeck-home:/root/.pilotdeck \
  -v ~/.pilotdeck/pilotdeck.yaml:/root/.pilotdeck/pilotdeck.yaml:ro \
  pilotdeck:latest

Run with a workspace mount

docker run -d --name pilotdeck \
  -p 3001:3001 \
  -v pilotdeck-home:/root/.pilotdeck \
  -v "$PWD":/workspace \
  -e PILOTDECK_MODEL=openai/gpt-4.1 \
  -e PILOTDECK_API_KEY=sk-your-api-key \
  -e PILOTDECK_API_URL=https://api.openai.com/v1 \
  pilotdeck:latest

Run with a proxy

docker run -d --name pilotdeck \
  -p 3001:3001 \
  -v pilotdeck-home:/root/.pilotdeck \
  -e PILOTDECK_MODEL=openai/gpt-4.1 \
  -e PILOTDECK_API_KEY=sk-your-api-key \
  -e PILOTDECK_API_URL=https://api.openai.com/v1 \
  -e PILOTDECK_PROXY=http://host.docker.internal:7890 \
  pilotdeck:latest

Environment Variables

Variable Description Default
PILOT_HOME PilotDeck state directory inside the container /root/.pilotdeck
PILOTDECK_MODEL Main model identifier, formatted as provider/model openrouter/deepseek/deepseek-v4-flash
PILOTDECK_LIGHT_MODEL Lightweight routing/judge model identifier openrouter/qwen/qwen3-8b
PILOTDECK_API_KEY API key for the main model provider PLACEHOLDER_RUN_ONBOARDING_TO_REPLACE
PILOTDECK_API_URL Base URL for the main model provider API https://openrouter.ai/api/v1
PILOTDECK_LIGHT_API_KEY API key for a different light-model provider Falls back to PILOTDECK_API_KEY
PILOTDECK_LIGHT_API_URL Base URL for a different light-model provider Falls back to PILOTDECK_API_URL
PILOTDECK_PROXY HTTP/HTTPS proxy URL
SERVER_PORT UI server port 3001
PILOTDECK_GATEWAY_PORT Gateway port used by the UI bridge 18789

Architecture

Browser (localhost:3001) ──► UI Server (port 3001) ──► Gateway (port 18789)

Both processes are managed by concurrently inside the Docker container.

Development

npm install
npm run dev

This starts the Gateway and UI dev server with hot reload.

Extension points exported contracts — how you extend this code

ChannelAdapter (Interface)
(no doc) [52 implementers]
src/adapters/channel/protocol/types.ts
Gateway (Interface)
(no doc) [5 implementers]
src/gateway/protocol/types.ts
WorkspaceProvider (Interface)
(no doc) [4 implementers]
src/always-on/workspace/WorkspaceProvider.ts
ExtensionResolver (Interface)
(no doc) [4 implementers]
src/context/extension/ExtensionResolver.ts
ModelRuntime (Interface)
(no doc)
src/model/ModelRuntime.ts
WebSocketLike (Interface)
(no doc)
src/web/client/GatewayBrowserClient.ts
ImportMetaEnv (Interface)
(no doc)
ui/src/vite-env.d.ts
WebhookRoute (Interface)
(no doc)
src/adapters/channel/webhook/WebhookChannel.ts

Core symbols most depended-on inside this repo

t
called by 1159
src/context/memory/edgeclaw-memory-core/ui-source/app.js
push
called by 1156
src/gateway/client/GatewayWsClient.ts
get
called by 830
src/context/memory/edgeclaw-memory-core/src/core/storage/sqlite.ts
replace
called by 488
src/tool/registry/ToolRegistry.ts
status
called by 421
src/adapters/web/projectGit.ts
has
called by 280
src/session/worktree/LRUMap.ts
append
called by 243
src/task/storage/TaskOutputStore.ts
now
called by 221
ui/src/components/chat/hooks/streamSmoother.ts

Shape

Function 3,440
Method 1,600
Class 386
Interface 323

Languages

TypeScript98%
Python2%

Modules by API surface

src/context/memory/edgeclaw-memory-core/src/core/skills/llm-extraction.ts165 symbols
src/context/memory/edgeclaw-memory-core/src/core/storage/sqlite.ts139 symbols
src/context/memory/edgeclaw-memory-core/lib/core/skills/llm-extraction.js127 symbols
src/context/memory/edgeclaw-memory-core/lib/core/storage/sqlite.js125 symbols
src/context/memory/edgeclaw-memory-core/ui-source/app.js112 symbols
ui/src/components/settings/view/tabs/PilotDeckConfigTab.tsx90 symbols
src/context/memory/edgeclaw-memory-core/src/core/file-memory.ts89 symbols
src/context/memory/edgeclaw-memory-core/lib/core/file-memory.js87 symbols
src/context/memory/edgeclaw-memory-core/src/service.ts72 symbols
src/context/memory/edgeclaw-memory-core/lib/service.js66 symbols
src/context/memory/edgeclaw-memory-core/src/core/types.ts61 symbols
src/context/memory/edgeclaw-memory-core/lib/core/types.d.ts61 symbols

Dependencies from manifests, versioned

@codemirror/lang-css6.3.1 · 1×
@codemirror/lang-html6.4.9 · 1×
@codemirror/lang-javascript6.2.4 · 1×
@codemirror/lang-json6.0.1 · 1×
@codemirror/lang-markdown6.3.3 · 1×
@codemirror/lang-python6.2.1 · 1×
@codemirror/merge6.11.1 · 1×
@codemirror/state6.6.0 · 1×
@codemirror/theme-one-dark6.1.2 · 1×
@codemirror/view6.43.0 · 1×
@eslint/js9.39.3 · 1×

For agents

$ claude mcp add PilotDeck \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact