Skip to main content

Packaging

Releases ship three files: an AppImage for Linux x86_64, one for Linux aarch64, and a dmg for Apple Silicon Macs. Each bundles its own FFmpeg, built from source.

Release workflow

release-workflow.png
scripts/release.sh 0.2.0          # bumps Cargo.toml/Cargo.lock, commits, tags
git push origin master v0.2.0

The version job refuses a tag that does not match the workspace version, so a release never ships lying metadata.

Bundle builds

bundle-builds.png

scripts/build-ffmpeg.sh builds FFmpeg as shared libraries into a local prefix, with libx264, librubberband, zlib, the voiceover take encoders (libmp3lame, libopus, libvorbis) and the platform's hardware codecs.

AppImage (Linux)

ChoiceWhy
Built inside a Debian 13 container (container/Containerfile.appimage)A glibc binary runs only on a glibc ≥ the build one; Fedora's is too new. The script re-enters the container by itself; the host needs only podman.
FFmpeg bundled; glibc, ALSA, Vulkan and NVIDIA driver from the systemNo FFmpeg or RPM Fusion needed on the target machine. NVENC needs driver ≥ 550.
rpath $ORIGIN/../lib set with patchelf --force-rpathDT_RPATH also applies to indirect deps (libavcodec → libx264); set on the copied file because cargo may skip a cached link.
Bundle checks before packagingFails if a libav*/codec soname is missing, or if a GPU driver library (libva, libcuda, libvulkan…) is linked instead of loaded at run time.
No FDK-AACThe AppImage is GPL (it contains libx264); export uses FFmpeg's native AAC encoder.

dmg (macOS)

ChoiceWhy
FFmpeg dylibs in Contents/Frameworks, install names rewritten to @rpathThe build prefix does not exist on the user's machine.
Ad-hoc codesign, libraries firstinstall_name_tool invalidates signatures, and arm64 refuses unsigned code. Not notarised: users must clear the quarantine on first launch.
Distributed as dmg, not bare .appZips and FAT/exFAT drives can drop the executable bit.

CI caching

The appimage job caches the compiled FFmpeg keyed on build-ffmpeg.sh and the container file, and the cargo registry keyed on Cargo.lock: FFmpeg is rebuilt only when its recipe changes.