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

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

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)
| Choice | Why |
|---|---|
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 system | No FFmpeg or RPM Fusion needed on the target machine. NVENC needs driver ≥ 550. |
rpath $ORIGIN/../lib set with patchelf --force-rpath | DT_RPATH also applies to indirect deps (libavcodec → libx264); set on the copied file because cargo may skip a cached link. |
| Bundle checks before packaging | Fails 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-AAC | The AppImage is GPL (it contains libx264); export uses FFmpeg's native AAC encoder. |
dmg (macOS)
| Choice | Why |
|---|---|
FFmpeg dylibs in Contents/Frameworks, install names rewritten to @rpath | The build prefix does not exist on the user's machine. |
Ad-hoc codesign, libraries first | install_name_tool invalidates signatures, and arm64 refuses unsigned code. Not notarised: users must clear the quarantine on first launch. |
Distributed as dmg, not bare .app | Zips 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.
No comments to display
No comments to display