# domica/caprust architecture

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

- Interactive diagram: https://gitdiagram.com/domica/caprust
- Repository: https://github.com/domica/caprust

## Overview

CapRust is a native, social-first video editor. A creator imports media into a project, arranges and edits clips on a multi-track timeline, previews the composition, and exports a rendered video. Core commands provide undoable mutations; media processing handles preview/export and documented local AI features, including captions, narration, auto-reframe, and background removal. The graph reflects the README’s crate boundaries and sampled entry points; some subsystem wiring is documented but its detailed call sites were not sampled.

Main entry points: [`crates/ui/src/app.rs`](https://github.com/domica/caprust/blob/main/crates/ui/src/app.rs) (Editor app), [`crates/ui/src/media_jobs.rs`](https://github.com/domica/caprust/blob/main/crates/ui/src/media_jobs.rs) (Media jobs), [`crates/core/src/settings.rs`](https://github.com/domica/caprust/blob/main/crates/core/src/settings.rs) (Settings and models), [`crates/app/src/main.rs`](https://github.com/domica/caprust/blob/main/crates/app/src/main.rs) (App entry)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_desktop["Desktop UI"]
  node_entry["App entry<br/>[main.rs]"]
  node_ui["Editor app<br/>[app.rs]"]
  node_timeline["Timeline controls<br/>[mod.rs]"]
  node_media_ui["Media panels<br/>[media_bin.rs]"]
  node_preview_ui["Preview controls<br/>[preview_window.rs]"]
  node_export_ui["Export dialog<br/>[export_dialog.rs]"]
  node_jobs["Media jobs<br/>[media_jobs.rs]"]
end

subgraph group_domain["Project Domain"]
  node_project["Project state<br/>[project.rs]"]
  node_clip["Clip model<br/>[clip.rs]"]
  node_commands["Undoable commands<br/>[commands.rs]"]
  node_project_io["Project persistence<br/>[project_io.rs]"]
  node_media["Media library<br/>[media.rs]"]
end

subgraph group_processing["Media Processing"]
  node_preview["Timeline preview<br/>[preview_render.rs]"]
  node_export_graph["Render plan<br/>[export_graph.rs]"]
  node_exporter["Video export<br/>[exporter.rs]"]
  node_probe["Media probing<br/>[ffprobe.rs]"]
  node_ai["Local AI media<br/>[whisper.rs]"]
end

subgraph group_services["Supporting Services"]
  node_settings["Settings and models<br/>[settings.rs]"]
  node_i18n["Localization<br/>[lib.rs]"]
end

node_creator(("Creator"))
node_ffmpeg["FFmpeg process"]
node_filesystem["Project files"]

node_creator -->|"launches"| node_entry
node_entry -->|"starts"| node_ui
node_creator -->|"edits through"| node_ui
node_ui -->|"renders"| node_timeline
node_ui -->|"renders"| node_media_ui
node_ui -->|"renders"| node_preview_ui
node_ui -->|"renders"| node_export_ui
node_ui -->|"edits"| node_project
node_ui -->|"dispatches"| node_commands
node_commands -->|"mutates"| node_project
node_ui -->|"loads and saves"| node_project_io
node_project_io -->|"reads and writes"| node_filesystem
node_ui -->|"manages assets"| node_media
node_jobs -->|"probes media"| node_probe
node_jobs -->|"runs AI tasks"| node_ai
node_ui -->|"schedules"| node_jobs
node_preview_ui -->|"emits controls"| node_ui
node_ui -->|"requests frames"| node_preview
node_export_ui -->|"emits settings"| node_ui
node_ui -->|"builds render plan"| node_export_graph
node_export_graph -->|"supplies plan"| node_exporter
node_preview -->|"spawns"| node_ffmpeg
node_exporter -->|"spawns"| node_ffmpeg
node_ui -->|"reads and updates"| node_settings
node_ui -->|"translates labels"| node_i18n
node_settings -->|"stores preferences"| node_filesystem
node_jobs -->|"uses model settings"| node_settings
node_ai -.->|"processes media"| node_ffmpeg

click node_entry "https://github.com/domica/caprust/blob/main/crates/app/src/main.rs"
click node_ui "https://github.com/domica/caprust/blob/main/crates/ui/src/app.rs"
click node_timeline "https://github.com/domica/caprust/blob/main/crates/ui/src/timeline/mod.rs"
click node_media_ui "https://github.com/domica/caprust/blob/main/crates/ui/src/panels/media_bin.rs"
click node_preview_ui "https://github.com/domica/caprust/blob/main/crates/ui/src/panels/preview_window.rs"
click node_export_ui "https://github.com/domica/caprust/blob/main/crates/ui/src/panels/export_dialog.rs"
click node_jobs "https://github.com/domica/caprust/blob/main/crates/ui/src/media_jobs.rs"
click node_project "https://github.com/domica/caprust/blob/main/crates/core/src/project.rs"
click node_clip "https://github.com/domica/caprust/blob/main/crates/core/src/clip.rs"
click node_commands "https://github.com/domica/caprust/blob/main/crates/core/src/commands.rs"
click node_project_io "https://github.com/domica/caprust/blob/main/crates/core/src/project_io.rs"
click node_media "https://github.com/domica/caprust/blob/main/crates/core/src/media.rs"
click node_preview "https://github.com/domica/caprust/blob/main/crates/media-io/src/preview_render.rs"
click node_export_graph "https://github.com/domica/caprust/blob/main/crates/media-io/src/export_graph.rs"
click node_exporter "https://github.com/domica/caprust/blob/main/crates/media-io/src/exporter.rs"
click node_probe "https://github.com/domica/caprust/blob/main/crates/media-io/src/ffprobe.rs"
click node_ai "https://github.com/domica/caprust/blob/main/crates/media-io/src/whisper.rs"
click node_settings "https://github.com/domica/caprust/blob/main/crates/core/src/settings.rs"
click node_i18n "https://github.com/domica/caprust/blob/main/crates/i18n/src/lib.rs"

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_entry,node_ui,node_timeline,node_media_ui,node_preview_ui,node_export_ui,node_jobs toneBlue
class node_project,node_clip,node_commands,node_project_io,node_media toneAmber
class node_preview,node_export_graph,node_exporter,node_probe,node_ai toneMint
class node_settings,node_i18n toneRose
class node_creator,node_ffmpeg,node_filesystem toneIndigo
```

## Components

### Desktop UI

- [App entry](https://github.com/domica/caprust/blob/main/crates/app/src/main.rs): `crates/app/src/main.rs`
- [Editor app](https://github.com/domica/caprust/blob/main/crates/ui/src/app.rs): `crates/ui/src/app.rs`
- [Timeline controls](https://github.com/domica/caprust/blob/main/crates/ui/src/timeline/mod.rs): `crates/ui/src/timeline/mod.rs`
- [Media panels](https://github.com/domica/caprust/blob/main/crates/ui/src/panels/media_bin.rs): `crates/ui/src/panels/media_bin.rs`
- [Preview controls](https://github.com/domica/caprust/blob/main/crates/ui/src/panels/preview_window.rs): `crates/ui/src/panels/preview_window.rs`
- [Export dialog](https://github.com/domica/caprust/blob/main/crates/ui/src/panels/export_dialog.rs): `crates/ui/src/panels/export_dialog.rs`
- [Media jobs](https://github.com/domica/caprust/blob/main/crates/ui/src/media_jobs.rs): `crates/ui/src/media_jobs.rs`

### Project Domain

- [Project state](https://github.com/domica/caprust/blob/main/crates/core/src/project.rs): `crates/core/src/project.rs`
- [Clip model](https://github.com/domica/caprust/blob/main/crates/core/src/clip.rs): `crates/core/src/clip.rs`
- [Undoable commands](https://github.com/domica/caprust/blob/main/crates/core/src/commands.rs): `crates/core/src/commands.rs`
- [Project persistence](https://github.com/domica/caprust/blob/main/crates/core/src/project_io.rs): `crates/core/src/project_io.rs`
- [Media library](https://github.com/domica/caprust/blob/main/crates/core/src/media.rs): `crates/core/src/media.rs`

### Media Processing

- [Timeline preview](https://github.com/domica/caprust/blob/main/crates/media-io/src/preview_render.rs): `crates/media-io/src/preview_render.rs`
- [Render plan](https://github.com/domica/caprust/blob/main/crates/media-io/src/export_graph.rs): `crates/media-io/src/export_graph.rs`
- [Video export](https://github.com/domica/caprust/blob/main/crates/media-io/src/exporter.rs): `crates/media-io/src/exporter.rs`
- [Media probing](https://github.com/domica/caprust/blob/main/crates/media-io/src/ffprobe.rs): `crates/media-io/src/ffprobe.rs`
- [Local AI media](https://github.com/domica/caprust/blob/main/crates/media-io/src/whisper.rs): `crates/media-io/src/whisper.rs`

### Supporting Services

- [Settings and models](https://github.com/domica/caprust/blob/main/crates/core/src/settings.rs): `crates/core/src/settings.rs`
- [Localization](https://github.com/domica/caprust/blob/main/crates/i18n/src/lib.rs): `crates/i18n/src/lib.rs`

### Other components

- **Creator**
- **FFmpeg process**
- **Project files**

## Connections

- Creator → App entry: launches
- App entry → Editor app: starts
- Creator → Editor app: edits through
- Editor app → Timeline controls: renders
- Editor app → Media panels: renders
- Editor app → Preview controls: renders
- Editor app → Export dialog: renders
- Editor app → Project state: edits
- Editor app → Undoable commands: dispatches
- Undoable commands → Project state: mutates
- Editor app → Project persistence: loads and saves
- Project persistence → Project files: reads and writes
- Editor app → Media library: manages assets
- Media jobs → Media probing: probes media
- Media jobs → Local AI media: runs AI tasks
- Editor app → Media jobs: schedules
- Preview controls → Editor app: emits controls
- Editor app → Timeline preview: requests frames
- Export dialog → Editor app: emits settings
- Editor app → Render plan: builds render plan
- Render plan → Video export: supplies plan
- Timeline preview → FFmpeg process: spawns
- Video export → FFmpeg process: spawns
- Editor app → Settings and models: reads and updates
- Editor app → Localization: translates labels
- Settings and models → Project files: stores preferences
- Media jobs → Settings and models: uses model settings
- Local AI media → FFmpeg process: processes media
