# composiohq/open-claude-cowork architecture

> Architecture diagram of the GitHub repository composiohq/open-claude-cowork, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/composiohq/open-claude-cowork
- Repository: https://github.com/composiohq/open-claude-cowork

## Overview

Open Claude Cowork is an Electron desktop chat app backed by an Express service. A user selects a provider and sends a message; the renderer uses the preload bridge to call the backend, which supplies Composio MCP tools and dispatches the request to Claude or Opencode. Provider output streams back for rendering, including text and tool activity. Chat sessions are retained in provider memory, and Claude can load project skills. README also describes Secure Clawdbot, but its implementation is absent from this repository tree; UI details are based on partial renderer excerpts.

Main entry points: [`server/server.js`](https://github.com/composiohq/open-claude-cowork/blob/master/server/server.js) (HTTP and SSE API), [`server/providers/claude-provider.js`](https://github.com/composiohq/open-claude-cowork/blob/master/server/providers/claude-provider.js) (Claude adapter), [`server/providers/opencode-provider.js`](https://github.com/composiohq/open-claude-cowork/blob/master/server/providers/opencode-provider.js) (Opencode adapter), [`preload.js`](https://github.com/composiohq/open-claude-cowork/blob/master/preload.js) (Preload bridge)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_desktop["Desktop client"]
  node_electron["Electron window<br/>[main.js]"]
  node_renderer["Chat UI<br/>[renderer.js]"]
  node_bridge["Preload bridge<br/>[preload.js]"]
end

subgraph group_backend["Chat backend"]
  node_api["HTTP and SSE API<br/>[server.js]"]
  node_composio_sessions["Composio sessions<br/>[server.js]"]
end

subgraph group_providers["Agent providers"]
  node_registry["Provider registry<br/>[index.js]"]
  node_base_provider["Provider sessions<br/>[base-provider.js]"]
  node_claude["Claude adapter<br/>[claude-provider.js]"]
  node_opencode["Opencode adapter"]
end

subgraph group_integrations["Agent integrations"]
  node_claude_sdk["Claude Agent SDK"]
  node_opencode_sdk["Opencode SDK"]
  node_composio["Composio Tool Router"]
  node_skills["Project skills<br/>[skills]"]
end

node_user(("User"))

node_user -->|"uses"| node_renderer
node_electron -->|"loads"| node_renderer
node_renderer -->|"calls"| node_bridge
node_bridge -->|"sends chat"| node_api
node_api -->|"gets session"| node_composio_sessions
node_composio_sessions -->|"creates session"| node_composio
node_api -->|"selects provider"| node_registry
node_registry -->|"returns instance"| node_claude
node_registry -->|"returns instance"| node_opencode
node_claude -->|"uses sessions"| node_base_provider
node_opencode -->|"uses sessions"| node_base_provider
node_api -->|"dispatches query"| node_claude
node_api -->|"dispatches query"| node_opencode
node_claude -->|"queries"| node_claude_sdk
node_opencode -->|"queries"| node_opencode_sdk
node_api -->|"aborts query"| node_claude
node_api -->|"aborts query"| node_opencode
node_claude -->|"loads settings"| node_skills
node_claude -->|"uses MCP tools"| node_composio
node_opencode -->|"uses MCP config"| node_composio
node_api -->|"streams SSE"| node_bridge
node_bridge -->|"provides stream"| node_renderer

click node_electron "https://github.com/composiohq/open-claude-cowork/blob/master/main.js"
click node_renderer "https://github.com/composiohq/open-claude-cowork/blob/master/renderer/renderer.js"
click node_bridge "https://github.com/composiohq/open-claude-cowork/blob/master/preload.js"
click node_api "https://github.com/composiohq/open-claude-cowork/blob/master/server/server.js"
click node_composio_sessions "https://github.com/composiohq/open-claude-cowork/blob/master/server/server.js"
click node_registry "https://github.com/composiohq/open-claude-cowork/blob/master/server/providers/index.js"
click node_base_provider "https://github.com/composiohq/open-claude-cowork/blob/master/server/providers/base-provider.js"
click node_claude "https://github.com/composiohq/open-claude-cowork/blob/master/server/providers/claude-provider.js"
click node_opencode "https://github.com/composiohq/open-claude-cowork/blob/master/server/providers/opencode-provider.js"
click node_skills "https://github.com/composiohq/open-claude-cowork/tree/master/.claude/skills"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_electron,node_renderer,node_bridge,node_user toneBlue
class node_api,node_composio_sessions toneAmber
class node_registry,node_base_provider,node_claude,node_opencode toneMint
class node_claude_sdk,node_opencode_sdk,node_composio,node_skills toneRose
```

## Components

### Desktop client

- [Electron window](https://github.com/composiohq/open-claude-cowork/blob/master/main.js): `main.js`
- [Chat UI](https://github.com/composiohq/open-claude-cowork/blob/master/renderer/renderer.js): `renderer/renderer.js`
- [Preload bridge](https://github.com/composiohq/open-claude-cowork/blob/master/preload.js): `preload.js`

### Chat backend

- [HTTP and SSE API](https://github.com/composiohq/open-claude-cowork/blob/master/server/server.js): `server/server.js`
- [Composio sessions](https://github.com/composiohq/open-claude-cowork/blob/master/server/server.js): `server/server.js`

### Agent providers

- [Provider registry](https://github.com/composiohq/open-claude-cowork/blob/master/server/providers/index.js): `server/providers/index.js`
- [Provider sessions](https://github.com/composiohq/open-claude-cowork/blob/master/server/providers/base-provider.js): `server/providers/base-provider.js`
- [Claude adapter](https://github.com/composiohq/open-claude-cowork/blob/master/server/providers/claude-provider.js): `server/providers/claude-provider.js`
- [Opencode adapter](https://github.com/composiohq/open-claude-cowork/blob/master/server/providers/opencode-provider.js): `server/providers/opencode-provider.js`

### Agent integrations

- **Claude Agent SDK**
- **Opencode SDK**
- **Composio Tool Router**
- [Project skills](https://github.com/composiohq/open-claude-cowork/tree/master/.claude/skills): `.claude/skills`

### Other components

- **User**

## Connections

- User → Chat UI: uses
- Electron window → Chat UI: loads
- Chat UI → Preload bridge: calls
- Preload bridge → HTTP and SSE API: sends chat
- HTTP and SSE API → Composio sessions: gets session
- Composio sessions → Composio Tool Router: creates session
- HTTP and SSE API → Provider registry: selects provider
- Provider registry → Claude adapter: returns instance
- Provider registry → Opencode adapter: returns instance
- Claude adapter → Provider sessions: uses sessions
- Opencode adapter → Provider sessions: uses sessions
- HTTP and SSE API → Claude adapter: dispatches query
- HTTP and SSE API → Opencode adapter: dispatches query
- Claude adapter → Claude Agent SDK: queries
- Opencode adapter → Opencode SDK: queries
- HTTP and SSE API → Claude adapter: aborts query
- HTTP and SSE API → Opencode adapter: aborts query
- Claude adapter → Project skills: loads settings
- Claude adapter → Composio Tool Router: uses MCP tools
- Opencode adapter → Composio Tool Router: uses MCP config
- HTTP and SSE API → Preload bridge: streams SSE
- Preload bridge → Chat UI: provides stream
