Development

Notes for contributors working on the client codecs, protocol, or daemon.

Repository Layout

Build Instructions

macOS (Server & Client)

The easiest way to build everything on a Mac:

make build

Release builds default to MACOSX_DEPLOYMENT_TARGET=13.0. Keep that default when building on macOS 27 or newer SDKs unless a release intentionally raises the minimum supported macOS version.

This produces:

The vtremoted binary must not hard-link Homebrew liblz4 or libzstd; those libraries are runtime-only optional dependencies for LZ4/Zstd wire compression. The release smoke test checks both the macOS 13.0 minimum OS and the absence of absolute Homebrew dylib load commands.

Linux / Windows (Client Only)

Linux CI and release artifacts target x86_64. The project does not publish or test 32-bit i686 Linux builds.

The VA-API driver job runs in Ubuntu 20.04 and builds the pinned libva 2.22 / VA-API 1.22 headers from source. This preserves the GLIBC 2.17 release-artifact baseline. Locally on Linux, run make test-vaapi-driver. The test suite uses the shared repository mock and stock FFmpeg’s VA-API encoders.

  1. Install assembler and library dependencies:
    nasm -v
    yasm --version
    

    Install current nasm and yasm before building. FFmpeg’s x86 assembly can fail early with older or missing assemblers.

  2. Configure:
    cd ffmpeg
    ./configure --enable-videotoolbox-remote --enable-liblz4 --enable-libzstd \
      --enable-libvmaf --enable-libaom --enable-libdav1d --enable-libsvtav1
    
  3. Build:
    make -j$(nproc)
    

The repository Makefile wraps the same build with project defaults:

make build-ffmpeg

If a Linux x86_64 source build fails in FFmpeg x86 assembly after installing current assemblers, use the diagnostic compatibility fallback:

make clean-ffmpeg
make build-ffmpeg FFMPEG_DISABLE_X86ASM=1

This appends --disable-x86asm. It is slower and should not be the default path, but it confirms whether the failure is limited to the assembler/toolchain surface.

Testing & Benchmarks

Integration scripts are located in tests/integration/.

Setup

Export the path to your server binary:

export VTREMOTED="$PWD/vtremoted/.build/release/vtremoted"

Key Scripts

Running a Benchmark

To reproduce the performance numbers:

VTREMOTE_HOST=<mac-host> VTREMOTE_PORT=5555 VTREMOTE_USE_EXISTING=1 \
VTREMOTED=/bin/true tests/integration/bench_vtremote.sh

Adaptive options

-vt_remote_wire_compression auto   # pick LZ4 vs Zstd based on resolution/FPS
-vt_remote_inflight auto           # adjust inflight over time

GitHub Metadata and Release Notes

FFmpeg sync uses a squashed upstream parent to preserve local changes in the vendored tree. Keep git-subtree-dir and git-subtree-split trailers on that upstream commit, not on the repository merge commit. Merge subtree updates and tracking repairs with a merge commit; squashing or rebasing the PR can discard the upstream parent. bash scripts/check_ffmpeg_subtree.sh checks the tracking record before CI builds and automated syncs.

The repository includes small gh-based helpers for keeping the public GitHub surfaces in sync.

Prerequisite:

gh auth status

Key commands:

make sync-github-metadata
make release-notes TAG=v0.3.1
make release-notes-all
bash scripts/generate_release_notes.sh v0.3.1
bash tests/test_llms_release_version.sh

What they do:

Release checklist:

Artifact Smoke Checks

CI smoke-tests packaged tarballs after creating them. To reproduce locally:

bash scripts/smoke_release_artifact.sh ffmpeg ffmpeg-linux-x86_64.tar.gz
bash scripts/smoke_release_artifact.sh vtremoted vtremoted-macos-arm64.tar.gz

The FFmpeg smoke check unpacks the tarball and verifies the remote encoders, remote decoders, vtremote_transcode, and quality filters are present. The vtremoted smoke check verifies --version and --help without binding a socket.