All notable changes to this project are documented here.
Releases prior to v5.0.0 predate this file; see the
GitHub Releases page for
the v1–v4 history.
- Read-ahead, async prefetch, and range cache for tunneled fio reads (#24) —
the server-side fio layer now batches reads, prefetches the next block while
the current one is consumed, and caches recently-read ranges, cutting
request/response round trips for readers like FFmpeg's AVIO layer that pull
~32 KiB at a time. Reduces over-IP overhead on sequential workloads from
roughly 8–14× slower than local to under 2×. Tunable via the
FFOIP_READAHEAD_BYTESandFFOIP_RANGE_CACHE_BYTESenvironment variables (setFFOIP_READAHEAD_BYTES=0to disable). No protocol or configuration changes are required.
build-release.shhost scripts now run on macOS.
- Client fallback to local ffmpeg on dial failure (#16, #18) — when the
remote server is unreachable, the client can transparently run the host's
local
ffmpeg/ffprobeso transcoding (Jellyfin, etc.) keeps working. Opt-in viafallbackToLocalin client config orFFMPEG_OVER_IP_CLIENT_FALLBACK_TO_LOCAL=true.- Triggers only on dial failure; mid-session errors stay fatal.
- Local binary resolved via
$PATHwith self-exclusion to prevent recursion when the client is installed asffmpegonPATH. FFMPEG_OVER_IP_*env vars are stripped from the child so the auth secret can't leak via/proc/<pid>/environ.- Optional
fallbackRewrites(shared rewrite logic),debugarg logging, and cross-platform exit-code mapping.
- Argv-aware rewrites (#21) — the rewrite engine now matches whole argv
elements (with multi-token support) instead of substring replacement within
each element, enabling GPU-vendor translation such as
-hwaccel qsv→-hwaccel cuda -hwaccel_output_format cuda.- Breaking: configs that relied on substring rewriting inside args (e.g.
["nvenc", "qsv"]to turnh264_nvencintoh264_qsv) must be updated to whole-element form (["h264_nvenc", "h264_qsv"]).
- Breaking: configs that relied on substring rewriting inside args (e.g.
config.SetupLoggingreturns a cleanup function; the client and server now close the log file on shutdown instead of leaking the handle (also required for correct Windows behavior).
- Install scripts: allow 32-bit PowerShell on 64-bit Windows (#15, #9) —
switched the arch check to
[Environment]::Is64BitOperatingSystem, which is not fooled by WoW64. - Install scripts: handle both flat and wrapped zip layouts so older nested and newer flat release archives both install correctly.
filehandler.mapErrnonow falls back toerrors.Isagainst thefssentinel errors, catching Windows error codes (e.g.ERROR_FILE_NOT_FOUND) that don't share numeric values with POSIX errnos. Unix behavior is unchanged.
- Release workflow auto-attaches per-platform build zips and an aggregated
SHA256SUMSto GitHub Releases onv*tags. - The test suite is now genuinely cross-platform and runs on
windows-latest(#20); added an end-to-end integration test for the fallback path.
- One-line install scripts for client and server (#9) —
curl | shon Linux/macOS andirm | iexon Windows. The scripts download the latest release, prompt foraddressandauthSecret, and generate the config file. Idempotent re-runs (setFOIP_FORCE=1to re-download); macOS quarantine and Windows MOTW attributes are stripped automatically. - Environment-variable configuration (#13) — both client and server can be
configured entirely via
FFMPEG_OVER_IP_{CLIENT,SERVER}_*variables (ADDRESS,AUTH_SECRET,LOG, andSERVER_DEBUG), with no config file needed. Useful for Docker and scripted deployments. (rewritesstill requires a config file.)
- Install-script prompts now show
[default=5050]instead of[5050]so the Enter-to-accept value is unambiguous.
- Fully backwards-compatible — existing config-file deployments work unchanged; the env-var mode is opt-in.
pipe:/fd:protocol now works (#8, #10) — ffmpeg'spipe:0/pipe:1handlers pass raw stdio fds through the fio layer, which previously rejected anything belowFIO_VFD_BASEwithEBADF. fio now passes real kernel fds straight through to the syscall, and stdio is tunneled back to the client as before.
v5 completely replaces the shared-filesystem architecture from v4. The server now runs a patched ffmpeg that tunnels all file I/O back to the client over a single TCP connection — no NFS, no SMB, no shared mounts.
- No shared filesystem — file reads and writes are tunneled over the connection, eliminating NFS/SMB setup, path mapping, and mount maintenance.
- Pre-built patched ffmpeg binaries — releases include patched
ffmpegandffprobewith broad hardware-acceleration support (NVENC, QSV, VAAPI, AMF, VideoToolbox, and more), built on jellyfin-ffmpeg 7.1.3. - Cross-platform binaries — Linux x86_64/arm64, macOS arm64/x86_64, and Windows x86_64 (Windows arm64 is client-only).
- Unix domain sockets — use
unix:/pathfor same-machine setups without TCP overhead. - JSONC config —
//and/* */comments and trailing commas, with config search across 8 locations. - HMAC-SHA256 authentication — every command is signed with a shared secret.
- Breaking: complete rearchitecture from v4's shared-filesystem model. See the upgrade guide for breaking changes and a migration checklist.