Key Design Decisions
The choices that shape the rest of the code. Each one is detailed in the chapter of the crate it belongs to.
| Decision | Why |
| Rust | Mature media ecosystem, no GC pauses, memory safety while iterating fast (also with AI assistance). |
| egui + eframe for the UI | Immediate mode, pure Rust, and it shares the wgpu device with the compositor: preview frames reach the UI without readback. |
| wgpu for compositing (Vulkan on Linux, Metal on macOS) | One GPU stack for UI and compositing on every platform. |
| FFmpeg (ffmpeg-next) for decode and encode | Broadest codec coverage; its hwaccels give HW decode/encode where drivers allow it. |
| HW decode via NVDEC, Vulkan video, VideoToolbox only; software fallback per media | No V4L2: the Asahi decoder is unstable with multi-reference H.264. No VA-API: libva would be linked at build time and the AppImage would not start without it. |
| Silero VAD run by tract for silence removal | Tells speech from clicks and room noise, which a volume threshold cannot; pure Rust, no native ML runtime to ship. |
| libavfilter rubberband for time-stretch | Pitch-preserving, and already in the FFmpeg build: no extra bindings. |
Model and editing
| Decision | Why |
Data-oriented model, no node graph; one Project as source of truth | Simple to reason about, snapshot and serialise; workers get copies, never shared mutable state. |
Ids never reused (IdMap) | An undo restores an entity under its old id, so selections, commands and ids handed to MCP clients stay valid. |
| Command pattern for undo/redo | Invertible commands: light, unbounded history. |
| Frame rate per Timeline, not per Project | A project holds N timelines with their own fps, like OTIO files from other NLEs. |
| Global ripple delete across all tracks | Closing a gap everywhere keeps A/V sync in multi-track edits. |
| Keyframes on every parameter | A requirement from the start, so it is built into the model (Keyframed<T>), not bolted on. |
| Color correction as a filter, not a grading page | It lives in the effect stack like any filter, so masks, adjustment clips, keyframes and paste attributes work on it unchanged. |
| RON project files | Human-readable, debuggable, diffable with git. |
| Decision | Why |
| RAM frame cache with a global budget, evicted by distance from the playhead | Long-GOP H.264 is expensive to seek; caching around the playhead keeps scrubbing smooth. |
| All-intra proxies built in the background | Cheap random access for editing without touching the originals. |
| Content-hash keys for proxies and waveforms | Moving or renaming a file invalidates nothing. |
| 1080p as reference resolution | Sizes the default cache budgets. |
| 16-bit float work textures, dithered once to 8 bits | Chains of effects no longer band. A per-project setting, so preview and export always match; 8 bits stay available for weak GPUs. |
Structure
| Decision | Why |
UI-free application core (vv-session) | The editor and the headless MCP server share one implementation of import, relink and export. |
| Built-in MCP server | AI agents can drive the editor, headless or in the window being edited, through the same edit path as the UI. |
Unit tests outside source files (src/tests/) | Production code and tests can be measured separately with plain line counters. |
No comments to display
No comments to display