# getcoherence/studio architecture

> Architecture diagram of the GitHub repository getcoherence/studio, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/getcoherence/studio
- Repository: https://github.com/getcoherence/studio

## Overview

Coherence Studio is an Electron screen recorder and video editor with AI-assisted polish and export. The primary workflow runs from the editor UI through recording and capture, into timeline editing and optional AI processing, then to rendered output. The README documents the product capabilities; sampled source confirms the app entry, capture-backend selection, editor dependencies, AI IPC dispatch, and AI settings/usage handling. Some feature implementations and IPC routes were not sampled, so uncertain links are omitted or marked dashed.

Main entry points: [`src/components/video-editor/VideoEditor.tsx`](https://github.com/getcoherence/studio/blob/main/src/components/video-editor/VideoEditor.tsx) (Video editor), [`electron/ipc/aiHandlers.ts`](https://github.com/getcoherence/studio/blob/main/electron/ipc/aiHandlers.ts) (AI IPC handlers), [`electron/capture/captureManager.ts`](https://github.com/getcoherence/studio/blob/main/electron/capture/captureManager.ts) (Capture manager), [`src/hooks/useScreenRecorder.ts`](https://github.com/getcoherence/studio/blob/main/src/hooks/useScreenRecorder.ts) (Recorder hook)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_recording["Recording"]
  node_recorder["Recorder hook"]
  node_capture["Capture manager<br/>[captureManager.ts]"]
  node_native["Native capture<br/>[nativeCapture.ts]"]
  node_ffmpegcap["FFmpeg capture<br/>[ffmpegCapture.ts]"]
  node_session["Session model"]
end

subgraph group_editing["Editing"]
  node_editor["Video editor<br/>[VideoEditor.tsx]"]
  node_timeline["Timeline editor<br/>[TimelineEditor.tsx]"]
  node_playback["Video playback<br/>[VideoPlayback.tsx]"]
end

subgraph group_ai["AI features"]
  node_polish["One-click polish<br/>[oneClickPolish.ts]"]
  node_trim["Smart trim<br/>[smartTrim.ts]"]
  node_narration["Auto narration<br/>[autoNarration.ts]"]
  node_captions["Whisper captions<br/>[whisper.ts]"]
  node_aiipc["AI IPC handlers<br/>[aiHandlers.ts]"]
  node_aiservice["AI service<br/>[aiService.ts]"]
end

subgraph group_rendering["Rendering and export"]
  node_exporter["Video and GIF export<br/>[videoExporter.ts]"]
  node_remotion["Motion compositions"]
  node_exportipc["Export handlers<br/>[exportHandlers.ts]"]
end

subgraph group_desktop["Desktop runtime"]
  node_app["Studio UI<br/>[App.tsx]"]
  node_settings[("AI settings<br/>[settings.ts]")]
  node_main["Electron main<br/>[main.ts]"]
  node_pro["Pro authentication<br/>[proAuth.ts]"]
end

node_user(("User"))

node_user -->|"opens"| node_app
node_app -->|"mounts"| node_editor
node_editor -->|"uses"| node_recorder
node_recorder -.->|"requests capture"| node_capture
node_capture -->|"selects backend"| node_native
node_capture -->|"selects fallback"| node_ffmpegcap
node_editor -.->|"edits clips"| node_timeline
node_editor -.->|"previews video"| node_playback
node_editor -->|"invokes polish"| node_polish
node_user -->|"requests trimming"| node_trim
node_user -->|"requests narration"| node_narration
node_user -->|"requests captions"| node_captions
node_editor -.->|"requests AI"| node_aiipc
node_aiipc -->|"dispatches analysis"| node_aiservice
node_aiservice -->|"loads configuration"| node_settings
node_user -->|"exports video or GIF"| node_exporter
node_exporter -.->|"renders compositions"| node_remotion
node_editor -.->|"starts export"| node_exportipc
node_main -->|"registers handlers"| node_aiipc
node_aiipc -->|"authenticates Pro"| node_pro

click node_app "https://github.com/getcoherence/studio/blob/main/src/App.tsx"
click node_editor "https://github.com/getcoherence/studio/blob/main/src/components/video-editor/VideoEditor.tsx"
click node_recorder "https://github.com/getcoherence/studio/blob/main/src/hooks/useScreenRecorder.ts"
click node_capture "https://github.com/getcoherence/studio/blob/main/electron/capture/captureManager.ts"
click node_native "https://github.com/getcoherence/studio/blob/main/electron/capture/nativeCapture.ts"
click node_ffmpegcap "https://github.com/getcoherence/studio/blob/main/electron/capture/ffmpegCapture.ts"
click node_session "https://github.com/getcoherence/studio/blob/main/src/lib/recordingSession.ts"
click node_timeline "https://github.com/getcoherence/studio/blob/main/src/components/video-editor/timeline/TimelineEditor.tsx"
click node_playback "https://github.com/getcoherence/studio/blob/main/src/components/video-editor/VideoPlayback.tsx"
click node_polish "https://github.com/getcoherence/studio/blob/main/src/lib/ai/oneClickPolish.ts"
click node_trim "https://github.com/getcoherence/studio/blob/main/src/lib/ai/smartTrim.ts"
click node_narration "https://github.com/getcoherence/studio/blob/main/src/lib/ai/autoNarration.ts"
click node_captions "https://github.com/getcoherence/studio/blob/main/electron/ai/whisper.ts"
click node_aiipc "https://github.com/getcoherence/studio/blob/main/electron/ipc/aiHandlers.ts"
click node_aiservice "https://github.com/getcoherence/studio/blob/main/electron/ai/aiService.ts"
click node_settings "https://github.com/getcoherence/studio/blob/main/electron/settings.ts"
click node_exporter "https://github.com/getcoherence/studio/blob/main/src/lib/exporter/videoExporter.ts"
click node_remotion "https://github.com/getcoherence/studio/blob/main/src/lib/remotion/DynamicComposition.tsx"
click node_exportipc "https://github.com/getcoherence/studio/blob/main/electron/ipc/exportHandlers.ts"
click node_main "https://github.com/getcoherence/studio/blob/main/electron/main.ts"
click node_pro "https://github.com/getcoherence/studio/blob/main/electron/pro/proAuth.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_recorder,node_capture,node_native,node_ffmpegcap,node_session,node_user toneBlue
class node_editor,node_timeline,node_playback toneAmber
class node_polish,node_trim,node_narration,node_captions,node_aiipc,node_aiservice toneMint
class node_exporter,node_remotion,node_exportipc toneRose
class node_app,node_settings,node_main,node_pro toneIndigo
```

## Components

### Recording

- [Recorder hook](https://github.com/getcoherence/studio/blob/main/src/hooks/useScreenRecorder.ts): `src/hooks/useScreenRecorder.ts`
- [Capture manager](https://github.com/getcoherence/studio/blob/main/electron/capture/captureManager.ts): `electron/capture/captureManager.ts`
- [Native capture](https://github.com/getcoherence/studio/blob/main/electron/capture/nativeCapture.ts): `electron/capture/nativeCapture.ts`
- [FFmpeg capture](https://github.com/getcoherence/studio/blob/main/electron/capture/ffmpegCapture.ts): `electron/capture/ffmpegCapture.ts`
- [Session model](https://github.com/getcoherence/studio/blob/main/src/lib/recordingSession.ts): `src/lib/recordingSession.ts`

### Editing

- [Video editor](https://github.com/getcoherence/studio/blob/main/src/components/video-editor/VideoEditor.tsx): `src/components/video-editor/VideoEditor.tsx`
- [Timeline editor](https://github.com/getcoherence/studio/blob/main/src/components/video-editor/timeline/TimelineEditor.tsx): `src/components/video-editor/timeline/TimelineEditor.tsx`
- [Video playback](https://github.com/getcoherence/studio/blob/main/src/components/video-editor/VideoPlayback.tsx): `src/components/video-editor/VideoPlayback.tsx`

### AI features

- [One-click polish](https://github.com/getcoherence/studio/blob/main/src/lib/ai/oneClickPolish.ts): `src/lib/ai/oneClickPolish.ts`
- [Smart trim](https://github.com/getcoherence/studio/blob/main/src/lib/ai/smartTrim.ts): `src/lib/ai/smartTrim.ts`
- [Auto narration](https://github.com/getcoherence/studio/blob/main/src/lib/ai/autoNarration.ts): `src/lib/ai/autoNarration.ts`
- [Whisper captions](https://github.com/getcoherence/studio/blob/main/electron/ai/whisper.ts): `electron/ai/whisper.ts`
- [AI IPC handlers](https://github.com/getcoherence/studio/blob/main/electron/ipc/aiHandlers.ts): `electron/ipc/aiHandlers.ts`
- [AI service](https://github.com/getcoherence/studio/blob/main/electron/ai/aiService.ts): `electron/ai/aiService.ts`

### Rendering and export

- [Video and GIF export](https://github.com/getcoherence/studio/blob/main/src/lib/exporter/videoExporter.ts): `src/lib/exporter/videoExporter.ts`
- [Motion compositions](https://github.com/getcoherence/studio/blob/main/src/lib/remotion/DynamicComposition.tsx): `src/lib/remotion/DynamicComposition.tsx`
- [Export handlers](https://github.com/getcoherence/studio/blob/main/electron/ipc/exportHandlers.ts): `electron/ipc/exportHandlers.ts`

### Desktop runtime

- [Studio UI](https://github.com/getcoherence/studio/blob/main/src/App.tsx): `src/App.tsx`
- [AI settings](https://github.com/getcoherence/studio/blob/main/electron/settings.ts): `electron/settings.ts`
- [Electron main](https://github.com/getcoherence/studio/blob/main/electron/main.ts): `electron/main.ts`
- [Pro authentication](https://github.com/getcoherence/studio/blob/main/electron/pro/proAuth.ts): `electron/pro/proAuth.ts`

### Other components

- **User**

## Connections

- User → Studio UI: opens (evidence: `src/App.tsx`)
- Studio UI → Video editor: mounts (evidence: `src/App.tsx`)
- Video editor → Recorder hook: uses (evidence: `src/components/video-editor/VideoEditor.tsx`)
- Recorder hook → Capture manager: requests capture
- Capture manager → Native capture: selects backend (evidence: `electron/capture/captureManager.ts`)
- Capture manager → FFmpeg capture: selects fallback (evidence: `electron/capture/captureManager.ts`)
- Video editor → Timeline editor: edits clips (evidence: `src/components/video-editor/VideoEditor.tsx`)
- Video editor → Video playback: previews video (evidence: `src/components/video-editor/VideoEditor.tsx`)
- Video editor → One-click polish: invokes polish (evidence: `src/components/video-editor/VideoEditor.tsx`)
- User → Smart trim: requests trimming (evidence: `README.md`)
- User → Auto narration: requests narration (evidence: `README.md`)
- User → Whisper captions: requests captions (evidence: `README.md`)
- Video editor → AI IPC handlers: requests AI
- AI IPC handlers → AI service: dispatches analysis (evidence: `electron/ipc/aiHandlers.ts`)
- AI service → AI settings: loads configuration (evidence: `electron/ai/aiService.ts`)
- User → Video and GIF export: exports video or GIF (evidence: `README.md`)
- Video and GIF export → Motion compositions: renders compositions
- Video editor → Export handlers: starts export
- Electron main → AI IPC handlers: registers handlers (evidence: `electron/main.ts`)
- AI IPC handlers → Pro authentication: authenticates Pro (evidence: `electron/ipc/aiHandlers.ts`)
