# Oak Video Editor - Non-Linear Video Editor # Copyright (C) 2026 Oak Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # The GUI application: the gpui-based `oakapp` library and the # `oak-editor` binary. Everything under src/ is app-specific; the engine # and module crates live in the workspace under crates/. [package] name = "oak-app" version.workspace = true edition = "2021" description = "Oak Video Editor" license = "GPL-3.0-or-later" [lib] name = "oakapp" path = "src/lib.rs" # Doctests are disabled: the app links the oak* module crates (which carry # media/codec dependencies); the doc examples' assertions are covered by # unit tests instead (see `oakui/timecode`). doctest = false [[bin]] name = "oak-editor" path = "src/main.rs" [dependencies] # gpui: the GPU-accelerated UI framework (oak-gpui fork, git submodule at gpui/). gpui = { path = "../../gpui/crates/gpui" } # Convenience entry point: `gpui_platform::application()` picks the platform # backend. font-kit enables text shaping/rendering on macOS. gpui_platform = { path = "../../gpui/crates/gpui_platform", features = ["font-kit"] } # Oak's widget library: menus, viewer, form controls, project explorer. gpui_widgets = { path = "../../gpui/crates/gpui_widgets" } # The mock engine's synthetic viewer frames (`image::Frame` in a # `RenderImage`), matching the versions gpui itself uses. image = "0.25" smallvec = "1" # The 10-bit display path: wgpu matches the version gpui_wgpu links (see the # gpui workspace manifest), `half` packs the F32 pipeline output into # Rgba16Float texture data (10-bit code values are distinguishable in f16). wgpu = "29" half = "2.7.1" # Editable-text widget (used by the file / export dialogs' path fields, the # same gpui-elements crate gpui_widgets builds on). gpui_elements = { path = "../../gpui/crates/gpui_elements" } # UI string tables: YAML language packs under assets/i18n/, loaded at # runtime (bundled with the app, user-extensible) with the compiled-in # English table as the fallback. serde_yaml = "0.9" # The gpui/wgpu stack logs through the `log` facade; the app installs the # stderr backend (see oakapp::logging) so validation errors and warnings # are actually visible (RUST_LOG selects the verbosity). log = "0.4" # M14 R3: the app is a PURE module-crate consumer — every engine call is a # direct Rust call into the oak* rlibs (oak-node for the project graph, # oak-timeline/oak-undo for the edit commands and the global undo stack, # oak-render for the ticket arena, oak-codec for the export formats/test # media, oak-task for the export/interchange tasks, oak-audio for the # manager/waveforms, oak-common/oak-core for the config store and shared # value types, oak-storage for the write-through library). No liboakengine # dylib, no C ABI, no build.rs link step, no host shims. oak-audio = { path = "../oak-audio" } oak-codec = { path = "../oak-codec" } oak-core = { path = "../oak-core" } oak-node = { path = "../oak-node" } oak-plugin = { path = "../oak-plugin" } oak-render = { path = "../oak-render" } oak-storage = { path = "../oak-storage" } oak-task = { path = "../oak-task" } oak-timeline = { path = "../oak-timeline" } oak-undo = { path = "../oak-undo" } [features] default = [] # Force the mock engine even though the real facade is linked. Off by # default: the app runs on the real engine unless `--mock` / `OAK_ENGINE=mock` # is given at runtime (or this feature is enabled at build time). mock-engine = [] # The Windows window/taskbar icon: embeds resources/windows/oak.rc (icon # resource ID 1, read by gpui_windows' `load_icon`) into oak-editor.exe. # Same crate gpui uses for its Windows manifest (see gpui's build.rs). # Unconditional (not target-gated): the build script references it behind # a runtime `CARGO_CFG_TARGET_OS` check, so it must resolve on every host. [build-dependencies] embed-resource = "3.0" [dev-dependencies] # `#[gpui::test]` harness for engine-seam smoke tests (test-support feature). gpui = { path = "../../gpui/crates/gpui", features = ["test-support"] } # `test-support` also enables `gpui_macos/test-support`, which is what makes # `render_to_image` (the screenshot example) available. gpui_platform = { path = "../../gpui/crates/gpui_platform", features = ["test-support"] } # Screenshot capture: `examples/screenshot.rs` saves the rendered window PNG # (the `image` crate is already in the lockfile through gpui). image = "0.25" # --------------------------------------------------------------------------- # cargo-packager metadata (the CD workflow packages the release binaries # with `cargo packager`; the schema lives at # https://docs.crabnebula.dev/packager/configuration/). # # Binaries are resolved relative to `target/` (oak-editor is the # main binary; oak-cli / oak-worker are bundled alongside). They must exist # before packaging runs — `cargo packager` does NOT build the app itself, so # CD builds with `cargo build --release` first. # # `icons/icon.png` is NOT committed: it is generated from `Oak_Icon.svg` # (rsvg-convert) in CD right before packaging, because cargo-packager needs a # bitmap (it converts a square PNG into .icns / .ico / hicolor PNGs itself). # It must be 512x512: cargo-packager's tauri-icns 0.1.0 maps only 512x512@1x # (and 1024x1024@2x) to an ICNS type — a plain 1024x1024 PNG aborts with # "No matching IconType". # Keep the path here in sync with the CD workflow. # --------------------------------------------------------------------------- [package.metadata.packager] name = "oak" productName = "Oak Video Editor" identifier = "org.oakvideoeditor.Oak" description = "Oak Video Editor" longDescription = "Oak Video Editor: a free, open-source non-linear video editor written in Rust." authors = ["Oak Team"] copyright = "Copyright (C) 2026 Oak Team" licenseFile = "LICENSE" category = "Video" icons = ["../../icons/icon.png"] # The UI string tables (language packs); users can drop extra # .yaml files into the installed i18n directory. # The Windows DLL staging dir is filled by # tooling/package/bundle-dylibs-windows.sh before `cargo packager` runs # (NSIS/WiX place resources next to the executable, which is exactly # where Windows resolves DLLs from). Empty locally = no bundled DLLs. resources = [ "../../assets/i18n", { src = "../../target/pkg/win-dlls/*.dll", target = "." }, ] binaries = [ { path = "oak-editor", main = true }, { path = "oak-cli", main = false }, { path = "oak-worker", main = false }, ]