# n213s/vibe-ffmpeg-ui architecture

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

- Interactive diagram: https://gitdiagram.com/n213s/vibe-ffmpeg-ui
- Repository: https://github.com/n213s/vibe-ffmpeg-ui

## Overview

Vibe FFmpeg is a native desktop GUI for configuring and batch-running FFmpeg conversions. Users add files, inspect probed media, choose a conversion mode and output options, run jobs, and see progress and verification results. The app coordinates the UI and worker events; the conversion engine builds commands, stages outputs, validates them, and commits only successful results. The README also documents official update checks and 14-language localization. Some subsystems are represented from README or index references because their implementation excerpts were not sampled.

Main entry points: [`src/app.rs`](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/app.rs) (App coordinator), [`src/ffmpeg/runner.rs`](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/runner.rs) (Batch conversion runner), [`src/ui/settings_panel.rs`](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/settings_panel.rs) (Settings panel), [`src/ffmpeg/discovery.rs`](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/discovery.rs) (FFmpeg discovery)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_desktop["Desktop workflow"]
  node_app["App coordinator<br/>[app.rs]"]
  node_queue_ui["Queue panel<br/>[queue_panel.rs]"]
  node_settings_ui["Settings panel<br/>[settings_panel.rs]"]
  node_topbar["Top bar<br/>[top_bar.rs]"]
  node_log_ui["Log panel<br/>[log_panel.rs]"]
  node_language_ui["Language window<br/>[language_window.rs]"]
  node_theme["UI theme<br/>[theme.rs]"]
end

subgraph group_conversion["Conversion engine"]
  node_discovery["FFmpeg discovery<br/>[discovery.rs]"]
  node_probe["Media probing<br/>[probe.rs]"]
  node_command_builder["Command generation<br/>[command_builder.rs]"]
  node_runner["Batch conversion runner<br/>[runner.rs]"]
  node_validator["Output verification<br/>[validator.rs]"]
end

subgraph group_settings["Configuration and safety"]
  node_models["Media and job state<br/>[media.rs]"]
  node_config["Conversion settings<br/>[config.rs]"]
  node_path_guard["Output path safety<br/>[path_guard.rs]"]
end

subgraph group_support["Localization and updates"]
  node_i18n["Translation tables<br/>[mod.rs]"]
  node_updates["Official update check<br/>[ffmpeg_update.rs]"]
end

node_user(("User"))
node_ffmpeg_tools["FFmpeg and ffprobe"]
node_release_endpoints["Official release endpoints"]

node_user -->|"uses"| node_app
node_app -->|"renders"| node_queue_ui
node_app -->|"renders"| node_settings_ui
node_app -->|"renders"| node_topbar
node_app -->|"renders"| node_log_ui
node_app -->|"opens"| node_language_ui
node_app -->|"discovers tools"| node_discovery
node_app -->|"probes files"| node_probe
node_app -->|"starts batch"| node_runner
node_app -->|"checks updates"| node_updates
node_app -->|"dispatches job events"| node_models
node_settings_ui -->|"previews command"| node_command_builder
node_runner -->|"builds command"| node_command_builder
node_runner -->|"stages output"| node_path_guard
node_runner -->|"configures process"| node_discovery
node_runner -->|"validates output"| node_validator
node_validator -->|"probes output"| node_probe
node_validator -->|"configures decode"| node_discovery
node_discovery -->|"queries binaries"| node_ffmpeg_tools
node_probe -.->|"runs ffprobe"| node_ffmpeg_tools
node_runner -.->|"runs conversion"| node_ffmpeg_tools
node_updates -->|"queries versions"| node_release_endpoints
node_app -->|"translates UI"| node_i18n
node_queue_ui -->|"localizes labels"| node_i18n
node_settings_ui -->|"localizes controls"| node_i18n
node_topbar -->|"requests check"| node_updates
node_queue_ui -->|"uses styling"| node_theme
node_settings_ui -->|"uses styling"| node_theme
node_language_ui -->|"uses styling"| node_theme

click node_app "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/app.rs"
click node_queue_ui "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/queue_panel.rs"
click node_settings_ui "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/settings_panel.rs"
click node_topbar "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/top_bar.rs"
click node_log_ui "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/log_panel.rs"
click node_language_ui "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/language_window.rs"
click node_theme "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/theme.rs"
click node_models "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/models/media.rs"
click node_config "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/models/config.rs"
click node_path_guard "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/security/path_guard.rs"
click node_discovery "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/discovery.rs"
click node_probe "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/probe.rs"
click node_command_builder "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/command_builder.rs"
click node_runner "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/runner.rs"
click node_validator "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/validator.rs"
click node_i18n "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/i18n/mod.rs"
click node_updates "https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/net/ffmpeg_update.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_app,node_queue_ui,node_settings_ui,node_topbar,node_log_ui,node_language_ui,node_theme,node_user toneBlue
class node_discovery,node_probe,node_command_builder,node_runner,node_validator toneAmber
class node_models,node_config,node_path_guard toneMint
class node_i18n,node_updates toneRose
class node_ffmpeg_tools,node_release_endpoints toneIndigo
```

## Components

### Desktop workflow

- [App coordinator](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/app.rs): `src/app.rs`
- [Queue panel](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/queue_panel.rs): `src/ui/queue_panel.rs`
- [Settings panel](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/settings_panel.rs): `src/ui/settings_panel.rs`
- [Top bar](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/top_bar.rs): `src/ui/top_bar.rs`
- [Log panel](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/log_panel.rs): `src/ui/log_panel.rs`
- [Language window](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/language_window.rs): `src/ui/language_window.rs`
- [UI theme](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ui/theme.rs): `src/ui/theme.rs`

### Conversion engine

- [FFmpeg discovery](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/discovery.rs): `src/ffmpeg/discovery.rs`
- [Media probing](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/probe.rs): `src/ffmpeg/probe.rs`
- [Command generation](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/command_builder.rs): `src/ffmpeg/command_builder.rs`
- [Batch conversion runner](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/runner.rs): `src/ffmpeg/runner.rs`
- [Output verification](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/ffmpeg/validator.rs): `src/ffmpeg/validator.rs`

### Configuration and safety

- [Media and job state](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/models/media.rs): `src/models/media.rs`
- [Conversion settings](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/models/config.rs): `src/models/config.rs`
- [Output path safety](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/security/path_guard.rs): `src/security/path_guard.rs`

### Localization and updates

- [Translation tables](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/i18n/mod.rs): `src/i18n/mod.rs`
- [Official update check](https://github.com/n213s/vibe-ffmpeg-ui/blob/main/src/net/ffmpeg_update.rs): `src/net/ffmpeg_update.rs`

### Other components

- **User**
- **FFmpeg and ffprobe**
- **Official release endpoints**

## Connections

- User → App coordinator: uses (evidence: `README.md`)
- App coordinator → Queue panel: renders (evidence: `src/app.rs`)
- App coordinator → Settings panel: renders (evidence: `src/app.rs`)
- App coordinator → Top bar: renders (evidence: `src/app.rs`)
- App coordinator → Log panel: renders (evidence: `src/app.rs`)
- App coordinator → Language window: opens (evidence: `src/app.rs`)
- App coordinator → FFmpeg discovery: discovers tools (evidence: `src/app.rs`)
- App coordinator → Media probing: probes files (evidence: `src/app.rs`)
- App coordinator → Batch conversion runner: starts batch (evidence: `src/app.rs`)
- App coordinator → Official update check: checks updates (evidence: `src/app.rs`)
- App coordinator → Media and job state: dispatches job events (evidence: `src/app.rs`)
- Settings panel → Command generation: previews command (evidence: `src/ui/settings_panel.rs`)
- Batch conversion runner → Command generation: builds command (evidence: `src/ffmpeg/runner.rs`)
- Batch conversion runner → Output path safety: stages output (evidence: `src/ffmpeg/runner.rs`)
- Batch conversion runner → FFmpeg discovery: configures process (evidence: `src/ffmpeg/runner.rs`)
- Batch conversion runner → Output verification: validates output (evidence: `src/ffmpeg/runner.rs`)
- Output verification → Media probing: probes output (evidence: `src/ffmpeg/validator.rs`)
- Output verification → FFmpeg discovery: configures decode (evidence: `src/ffmpeg/validator.rs`)
- FFmpeg discovery → FFmpeg and ffprobe: queries binaries (evidence: `src/ffmpeg/discovery.rs`)
- Media probing → FFmpeg and ffprobe: runs ffprobe (evidence: `README.md`)
- Batch conversion runner → FFmpeg and ffprobe: runs conversion (evidence: `README.md`)
- Official update check → Official release endpoints: queries versions (evidence: `src/net/ffmpeg_update.rs`)
- App coordinator → Translation tables: translates UI (evidence: `src/app.rs`)
- Queue panel → Translation tables: localizes labels (evidence: `src/ui/queue_panel.rs`)
- Settings panel → Translation tables: localizes controls (evidence: `src/ui/settings_panel.rs`)
- Top bar → Official update check: requests check (evidence: `src/ui/top_bar.rs`)
- Queue panel → UI theme: uses styling (evidence: `src/ui/queue_panel.rs`)
- Settings panel → UI theme: uses styling (evidence: `src/ui/settings_panel.rs`)
- Language window → UI theme: uses styling (evidence: `src/ui/language_window.rs`)
