# devagentforge/open-claude-cowork architecture

> Architecture diagram of the GitHub repository devagentforge/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/devagentforge/open-claude-cowork
- Repository: https://github.com/devagentforge/open-claude-cowork

## Overview

Open Claude Cowork is an Electron desktop assistant for programming, file management, and other prompted tasks. A user chooses a working directory and prompt; the desktop process creates a session, runs Claude, streams events back to the interface, and persists session history. The interface also supports session management, tool-result inspection, permission decisions, and API configuration. The graph follows documented product capabilities, but unsampled modules are connected only where the available excerpts or README support their role.

Main entry points: [`src/ui/App.tsx`](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/App.tsx) (Application UI), [`src/electron/main.ts`](https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/main.ts) (Electron main), [`src/ui/hooks/useIPC.ts`](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/hooks/useIPC.ts) (IPC hook), [`src/electron/ipc-handlers.ts`](https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/ipc-handlers.ts) (IPC handlers)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_desktop["Desktop runtime"]
  node_app["Electron main<br/>[main.ts]"]
  node_bridge["Preload bridge<br/>[preload.cts]"]
end

subgraph group_sessions["Session execution"]
  node_handlers["IPC handlers<br/>[ipc-handlers.ts]"]
  node_runner["Claude runner<br/>[runner.ts]"]
  node_sessionstore["Session store<br/>[session-store.ts]"]
  node_sessiondb[("Session database<br/>[session-store.ts]")]
end

subgraph group_interface["Assistant interface"]
  node_ui["Application UI<br/>[App.tsx]"]
  node_ipc["IPC hook<br/>[useIPC.ts]"]
  node_store["UI session state<br/>[useAppStore.ts]"]
  node_sessionmodal["Session setup"]
  node_messages["Message cards<br/>[EventCard.tsx]"]
  node_permissions["Permission decisions<br/>[DecisionPanel.tsx]"]
  node_prompt["Prompt input<br/>[PromptInput.tsx]"]
  node_windowing["Message history window"]
  node_markdown["Markdown renderer<br/>[markdown.tsx]"]
  node_settingsui["Settings dialog<br/>[SettingsModal.tsx]"]
end

subgraph group_settings["Configuration"]
  node_claudesettings["Claude settings<br/>[claude-settings.ts]"]
  node_configstore["API config storage<br/>[config-store.ts]"]
end

node_user(("Desktop user"))
node_claude{{"Claude Agent SDK"}}
node_localfiles[("Local working directory")]

node_user -->|"uses"| node_ui
node_ui -->|"subscribes and sends"| node_ipc
node_ui -->|"updates session state"| node_store
node_ui -->|"opens setup"| node_sessionmodal
node_ui -->|"renders input"| node_prompt
node_ui -->|"windows history"| node_windowing
node_ui -->|"renders messages"| node_messages
node_messages -->|"offers decisions"| node_permissions
node_messages -->|"renders content"| node_markdown
node_ipc -->|"sends and receives"| node_bridge
node_bridge -->|"forwards IPC"| node_app
node_app -->|"dispatches events"| node_handlers
node_handlers -->|"reads and updates"| node_sessionstore
node_handlers -->|"starts and controls"| node_runner
node_runner -->|"runs agent"| node_claude
node_sessionstore -->|"persists history"| node_sessiondb
node_app -->|"reads configuration"| node_claudesettings
node_app -->|"saves API config"| node_configstore
node_ui -->|"opens settings"| node_settingsui
node_settingsui -->|"requests config"| node_ipc
node_sessionmodal -->|"selects directory"| node_ipc
node_sessionmodal -->|"chooses working path"| node_localfiles
node_runner -->|"works in directory"| node_localfiles

click node_app "https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/main.ts"
click node_bridge "https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/preload.cts"
click node_handlers "https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/ipc-handlers.ts"
click node_runner "https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/libs/runner.ts"
click node_sessionstore "https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/libs/session-store.ts"
click node_sessiondb "https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/libs/session-store.ts"
click node_ui "https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/App.tsx"
click node_ipc "https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/hooks/useIPC.ts"
click node_store "https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/store/useAppStore.ts"
click node_sessionmodal "https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/components/StartSessionModal.tsx"
click node_messages "https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/components/EventCard.tsx"
click node_permissions "https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/components/DecisionPanel.tsx"
click node_prompt "https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/components/PromptInput.tsx"
click node_windowing "https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/hooks/useMessageWindow.ts"
click node_markdown "https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/render/markdown.tsx"
click node_settingsui "https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/components/SettingsModal.tsx"
click node_claudesettings "https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/libs/claude-settings.ts"
click node_configstore "https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/libs/config-store.ts"

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_app,node_bridge,node_user toneBlue
class node_handlers,node_runner,node_sessionstore,node_sessiondb,node_localfiles toneAmber
class node_ui,node_ipc,node_store,node_sessionmodal,node_messages,node_permissions,node_prompt,node_windowing,node_markdown,node_settingsui toneMint
class node_claudesettings,node_configstore toneRose
class node_claude toneIndigo
```

## Components

### Desktop runtime

- [Electron main](https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/main.ts): `src/electron/main.ts`
- [Preload bridge](https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/preload.cts): `src/electron/preload.cts`

### Session execution

- [IPC handlers](https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/ipc-handlers.ts): `src/electron/ipc-handlers.ts`
- [Claude runner](https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/libs/runner.ts): `src/electron/libs/runner.ts`
- [Session store](https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/libs/session-store.ts): `src/electron/libs/session-store.ts`
- [Session database](https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/libs/session-store.ts): `src/electron/libs/session-store.ts`

### Assistant interface

- [Application UI](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/App.tsx): `src/ui/App.tsx`
- [IPC hook](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/hooks/useIPC.ts): `src/ui/hooks/useIPC.ts`
- [UI session state](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/store/useAppStore.ts): `src/ui/store/useAppStore.ts`
- [Session setup](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/components/StartSessionModal.tsx): `src/ui/components/StartSessionModal.tsx`
- [Message cards](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/components/EventCard.tsx): `src/ui/components/EventCard.tsx`
- [Permission decisions](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/components/DecisionPanel.tsx): `src/ui/components/DecisionPanel.tsx`
- [Prompt input](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/components/PromptInput.tsx): `src/ui/components/PromptInput.tsx`
- [Message history window](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/hooks/useMessageWindow.ts): `src/ui/hooks/useMessageWindow.ts`
- [Markdown renderer](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/render/markdown.tsx): `src/ui/render/markdown.tsx`
- [Settings dialog](https://github.com/devagentforge/open-claude-cowork/blob/main/src/ui/components/SettingsModal.tsx): `src/ui/components/SettingsModal.tsx`

### Configuration

- [Claude settings](https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/libs/claude-settings.ts): `src/electron/libs/claude-settings.ts`
- [API config storage](https://github.com/devagentforge/open-claude-cowork/blob/main/src/electron/libs/config-store.ts): `src/electron/libs/config-store.ts`

### Other components

- **Desktop user**
- **Claude Agent SDK**
- **Local working directory**

## Connections

- Desktop user → Application UI: uses
- Application UI → IPC hook: subscribes and sends
- Application UI → UI session state: updates session state
- Application UI → Session setup: opens setup
- Application UI → Prompt input: renders input
- Application UI → Message history window: windows history
- Application UI → Message cards: renders messages
- Message cards → Permission decisions: offers decisions
- Message cards → Markdown renderer: renders content
- IPC hook → Preload bridge: sends and receives
- Preload bridge → Electron main: forwards IPC
- Electron main → IPC handlers: dispatches events
- IPC handlers → Session store: reads and updates
- IPC handlers → Claude runner: starts and controls
- Claude runner → Claude Agent SDK: runs agent
- Session store → Session database: persists history
- Electron main → Claude settings: reads configuration
- Electron main → API config storage: saves API config
- Application UI → Settings dialog: opens settings
- Settings dialog → IPC hook: requests config
- Session setup → IPC hook: selects directory
- Session setup → Local working directory: chooses working path
- Claude runner → Local working directory: works in directory
