# csantiagu/clipforge architecture

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

- Interactive diagram: https://gitdiagram.com/csantiagu/clipforge
- Repository: https://github.com/csantiagu/clipforge
- Video tour (about a minute): https://gitdiagram.com/csantiagu/clipforge/video

## Overview

Clipforge is a macOS desktop app for queued video conversion/remuxing and image conversion/privacy cleanup. Users add files, tune per-file or batch settings, inspect before/after sizes, then start video encoding or save processed images. The graph separates the two media workflows and their shared SwiftUI interface. Edges follow shown source references/calls or README-documented behavior; some internal image-processing and unsampled estimation links are based on README statements rather than inspected implementations.

Main entry points: [`Sources/Clipforge/AppModel.swift`](https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/AppModel.swift) (Video queue), [`Sources/Clipforge/ContentView.swift`](https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/ContentView.swift) (Queues and tabs), [`Sources/Clipforge/ImageModel.swift`](https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/ImageModel.swift) (Image queue), [`Sources/ClipforgeCore/CommandBuilder.swift`](https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/CommandBuilder.swift) (Encode planning)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Mac app"]
  node_appentry["App lifecycle<br/>[ClipforgeApp.swift]"]
  node_workspace["Queues and tabs<br/>[ContentView.swift]"]
  node_glass["Glass styling<br/>[Glass.swift]"]
end

subgraph group_video["Video workflow"]
  node_videoqueue["Video queue<br/>[AppModel.swift]"]
  node_videoinspector["Video settings<br/>[DetailView.swift]"]
end

subgraph group_image["Image workflow"]
  node_imagequeue["Image queue<br/>[ImageModel.swift]"]
  node_imageui["Image controls<br/>[ImageViews.swift]"]
end

subgraph group_core["Media core"]
  node_probe["Media probing<br/>[MediaInfo.swift]"]
  node_commands["Encode planning"]
  node_estimates["Size estimates<br/>[Estimates.swift]"]
  node_process["Process runner<br/>[Process.swift]"]
  node_settings["Video settings model<br/>[Settings.swift]"]
  node_imageprocessor["Image conversion and metadata<br/>[Images.swift]"]
end

node_user(("Mac user"))
node_ffmpeg{{"ffmpeg / ffprobe"}}
node_imageengine{{"macOS ImageIO"}}

node_user -->|"adds and tunes"| node_workspace
node_appentry -->|"presents"| node_workspace
node_workspace -->|"routes video files"| node_videoqueue
node_workspace -->|"routes image files"| node_imagequeue
node_videoinspector -->|"edits settings"| node_videoqueue
node_videoqueue -->|"probes inputs"| node_probe
node_probe -->|"runs ffprobe"| node_process
node_process -->|"launches tools"| node_ffmpeg
node_videoqueue -->|"builds encode command"| node_commands
node_commands -.->|"uses options"| node_settings
node_videoqueue -->|"calculates size"| node_estimates
node_estimates -->|"uses planned bitrate"| node_commands
node_videoqueue -->|"runs encode"| node_process
node_videoqueue -->|"encodes videos"| node_ffmpeg
node_imageui -->|"edits image jobs"| node_imagequeue
node_imagequeue -->|"reads and processes"| node_imageprocessor
node_imageprocessor -->|"uses ImageIO"| node_imageengine
node_imagequeue -->|"measures output"| node_imageprocessor
node_workspace -.->|"styles surfaces"| node_glass

click node_appentry "https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/ClipforgeApp.swift"
click node_workspace "https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/ContentView.swift"
click node_videoqueue "https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/AppModel.swift"
click node_videoinspector "https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/DetailView.swift"
click node_probe "https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/MediaInfo.swift"
click node_commands "https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/CommandBuilder.swift"
click node_estimates "https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/Estimates.swift"
click node_process "https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/Process.swift"
click node_settings "https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/Settings.swift"
click node_imagequeue "https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/ImageModel.swift"
click node_imageui "https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/ImageViews.swift"
click node_imageprocessor "https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/Images.swift"
click node_glass "https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/Glass.swift"

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_appentry,node_workspace,node_glass,node_user toneBlue
class node_videoqueue,node_videoinspector toneAmber
class node_imagequeue,node_imageui toneMint
class node_probe,node_commands,node_estimates,node_process,node_settings,node_imageprocessor toneRose
class node_ffmpeg,node_imageengine toneIndigo
```

## Components

### Mac app

- [App lifecycle](https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/ClipforgeApp.swift): `Sources/Clipforge/ClipforgeApp.swift`
- [Queues and tabs](https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/ContentView.swift): `Sources/Clipforge/ContentView.swift`
- [Glass styling](https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/Glass.swift): `Sources/Clipforge/Glass.swift`

### Video workflow

- [Video queue](https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/AppModel.swift): `Sources/Clipforge/AppModel.swift`
- [Video settings](https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/DetailView.swift): `Sources/Clipforge/DetailView.swift`

### Image workflow

- [Image queue](https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/ImageModel.swift): `Sources/Clipforge/ImageModel.swift`
- [Image controls](https://github.com/csantiagu/clipforge/blob/main/Sources/Clipforge/ImageViews.swift): `Sources/Clipforge/ImageViews.swift`

### Media core

- [Media probing](https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/MediaInfo.swift): `Sources/ClipforgeCore/MediaInfo.swift`
- [Encode planning](https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/CommandBuilder.swift): `Sources/ClipforgeCore/CommandBuilder.swift`
- [Size estimates](https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/Estimates.swift): `Sources/ClipforgeCore/Estimates.swift`
- [Process runner](https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/Process.swift): `Sources/ClipforgeCore/Process.swift`
- [Video settings model](https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/Settings.swift): `Sources/ClipforgeCore/Settings.swift`
- [Image conversion and metadata](https://github.com/csantiagu/clipforge/blob/main/Sources/ClipforgeCore/Images.swift): `Sources/ClipforgeCore/Images.swift`

### Other components

- **Mac user**
- **ffmpeg / ffprobe**
- **macOS ImageIO**

## Connections

- Mac user → Queues and tabs: adds and tunes (evidence: `README.md`)
- App lifecycle → Queues and tabs: presents (evidence: `Sources/Clipforge/ClipforgeApp.swift`)
- Queues and tabs → Video queue: routes video files (evidence: `Sources/Clipforge/ContentView.swift`)
- Queues and tabs → Image queue: routes image files (evidence: `Sources/Clipforge/ContentView.swift`)
- Video settings → Video queue: edits settings (evidence: `Sources/Clipforge/DetailView.swift`)
- Video queue → Media probing: probes inputs (evidence: `Sources/Clipforge/AppModel.swift`)
- Media probing → Process runner: runs ffprobe (evidence: `Sources/ClipforgeCore/MediaInfo.swift`)
- Process runner → ffmpeg / ffprobe: launches tools
- Video queue → Encode planning: builds encode command (evidence: `Sources/Clipforge/AppModel.swift`)
- Encode planning → Video settings model: uses options
- Video queue → Size estimates: calculates size (evidence: `Sources/Clipforge/AppModel.swift`)
- Size estimates → Encode planning: uses planned bitrate (evidence: `Sources/ClipforgeCore/Estimates.swift`)
- Video queue → Process runner: runs encode (evidence: `Sources/Clipforge/AppModel.swift`)
- Video queue → ffmpeg / ffprobe: encodes videos (evidence: `README.md`)
- Image controls → Image queue: edits image jobs (evidence: `Sources/Clipforge/ImageViews.swift`)
- Image queue → Image conversion and metadata: reads and processes (evidence: `Sources/Clipforge/ImageModel.swift`)
- Image conversion and metadata → macOS ImageIO: uses ImageIO (evidence: `Sources/ClipforgeCore/Images.swift`)
- Image queue → Image conversion and metadata: measures output (evidence: `Sources/Clipforge/ImageModel.swift`)
- Queues and tabs → Glass styling: styles surfaces
