Skip to main content

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.

Platform and stack

DecisionWhy
RustMature media ecosystem, no GC pauses, memory safety while iterating fast (also with AI assistance).
egui + eframe for the UIImmediate 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 encodeBroadest codec coverage; its hwaccels give HW decode/encode where drivers allow it.
HW decode via NVDEC, Vulkan video, VideoToolbox only; software fallback per mediaNo 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 removalTells speech from clicks and room noise, which a volume threshold cannot; pure Rust, no native ML runtime to ship.
libavfilter rubberband for time-stretchPitch-preserving, and already in the FFmpeg build: no extra bindings.

Model and editing

DecisionWhy
Data-oriented model, no node graph; one Project as source of truthSimple 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/redoInvertible commands: light, unbounded history.
Frame rate per Timeline, not per ProjectA project holds N timelines with their own fps, like OTIO files from other NLEs.
Global ripple delete across all tracksClosing a gap everywhere keeps A/V sync in multi-track edits.
Keyframes on every parameterA requirement from the start, so it is built into the model (Keyframed<T>), not bolted on.
Color correction as a filter, not a grading pageIt lives in the effect stack like any filter, so masks, adjustment clips, keyframes and paste attributes work on it unchanged.
RON project filesHuman-readable, debuggable, diffable with git.

Performance

DecisionWhy
RAM frame cache with a global budget, evicted by distance from the playheadLong-GOP H.264 is expensive to seek; caching around the playhead keeps scrubbing smooth.
All-intra proxies built in the backgroundCheap random access for editing without touching the originals.
Content-hash keys for proxies and waveformsMoving or renaming a file invalidates nothing.
1080p as reference resolutionSizes the default cache budgets.
16-bit float work textures, dithered once to 8 bitsChains of effects no longer band. A per-project setting, so preview and export always match; 8 bits stay available for weak GPUs.

Structure

DecisionWhy
UI-free application core (vv-session)The editor and the headless MCP server share one implementation of import, relink and export.
Built-in MCP serverAI 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.