Spindle is a desktop optical-disc authoring studio built with Tauri, React, and Rust.
This repository is organised as a pnpm workspace monorepo with a matching Cargo workspace for native code. The desktop app lives in apps/spindle, and shared native project logic lives in plugins/tauri-plugin-spindle-project.
Current DVD authoring capabilities include:
- titleset-aware project editing with drag-and-drop title organisation
- chapter seeding from source media plus chapter-targeted menu and end actions
- menu editing with authored scene documents, layers, and motion timing support
- semantic interaction graphs and remote-navigation preview simulation
- asset inspection with embedded metadata title surfacing, compatibility explanations, and fix-oriented validation
- DVD build planning and execution with diagnostics export and toolchain checks
- bitmap subtitle muxing plus first-pass text subtitle rendering for DVD authoring
apps/spindlecontains the Tauri desktop application and React UIplugins/tauri-plugin-spindle-projectcontains project schema, validation, inspection, and build logictsconfig.base.jsonprovides shared TypeScript compiler defaults for workspace packagesdocs/initial-planningcontains product and implementation planning notes
The shared development container currently provides Node 24.14.0 and pnpm 10.32.1 through Corepack, and the workspace is aligned to that toolchain.
Install dependencies from the repository root:
pnpm installRun the web app in development mode:
pnpm devRun the Tauri desktop shell:
pnpm tauri devIf Rust tooling is not installed locally, run Rust and Tauri commands through ghcr.io/liminal-hq/tauri-dev-desktop:latest.
Current app behaviour also includes:
- a persistent thumbnail cache stored in the app cache directory, with Settings controls to inspect and clear cached previews
- developer toggles to prefer host
PATHtools over bundled sidecars and to skip unsupported subtitle mappings during builds, mainly for unknown subtitle types or debugging - diagnostics bundle export including toolchain status, build logs, validation issues, project summary, and active developer options
Build the frontend bundle:
pnpm buildRun the Rust plugin tests:
cargo test -p tauri-plugin-spindle-projectFor an opt-in end-to-end DVD authoring smoke test that exercises ffmpeg, spumux, and dvdauthor, run:
cargo test -p tauri-plugin-spindle-project execute_build_plan_smoke_authors_titleset_menu_return_path -- --ignored --nocaptureSpindle now uses a repo-local release preparation flow aligned with the current Liminal HQ desktop release pattern.
Check that all release-facing versions are synchronised:
pnpm release:version:checkPrepare a coordinated version bump on a dedicated release branch:
pnpm release:version:prepare --version 0.1.1That updates the release-facing version set together:
package.jsonapps/spindle/package.jsonapps/spindle/src-tauri/tauri.conf.jsonapps/spindle/src-tauri/Cargo.tomlplugins/tauri-plugin-spindle-project/Cargo.toml
The helper script expects a clean working tree and creates chore/release-vX.Y.Z by default unless you pass --no-branch or an explicit --branch.
The release workflow lives in .github/workflows/release.yml.
Current release scope:
- Linux desktop bundles only
x64andarm64AppImage,.deb, and.rpmoutputs- one rolled-up
SHA256SUMSfile per published release
Linux package dependency behaviour today:
.debpackages declare a hard dependency onffmpeg.rpmpackages declare a recommendation forffmpegorffmpeg-free, since RPM package naming differs across distributionsAppImagebuilds still rely on the host system to provideffmpegandffprobe
Typical release sequence:
- Run
pnpm release:version:prepare --version <x.y.z>. - Review the diff and open a pull request.
- Merge the release bump into
main. - Create and push tag
vX.Y.Z. - Monitor the GitHub Actions release run, or rerun it manually if needed.