← Back to Sebiu Labs
WHEP Gateway — Changelog
Release notes for all versions. Setup guide · Buy license
Alpha build — not yet soaked. Please report issues to contact@sebiulabs.co.uk. For production use, stay on v1.7.2 or earlier.
Critical fix on top of v1.8.4 — restores embedded SDI audio on AJA captures (v1.8.0 and v1.8.4 silently shipped a pre-Apr-3 binary that lacked the audio extraction code). Plus build-iso.sh hardening to prevent the same class of bug in future releases.
AJA audio
- Restored embedded SDI audio on AJA captures —
aja-pipe-capture rebuilt from current source. Source had had audio extraction support since 2026-04-03 (commit 6e6c8e4, feat(aja): embedded SDI audio extraction via named FIFO), but every released ISO bundled a pre-Apr-3 binary, producing silent audio in the field.
- Verified live on Kevin's Corvid 88 box — all 8 channels now create
/tmp/aja-audio-N.pcm FIFOs, gateway parses the JSON header (“AJA capture signal detected ... audio_channels=16 audio_rate=48000”), and FFmpeg reads real PCM at ~1.1 MB/s per FIFO instead of anullsrc.
ISO build hardening
- Fail-loud when bundled
aja-pipe-capture lacks audio support — build-iso.sh now hard-fails if the binary doesn't contain the "audio_fifo" string. An ISO build can no longer silently ship a stale audio-less binary.
- Use
grep -aq instead of strings | grep — works in minimal containers without binutils.
- Hoist
WORKSPACE_ROOT to top of script — the AJA-binary lookup at line 203 referenced $WORKSPACE_ROOT but the variable wasn't defined until line 311, silently falling through to a less-likely path.
LD_LIBRARY_PATH for FFmpeg-OMT version probe — FFmpeg dynamically links libomt.so which isn't on the loader path inside the live-build container. Probe now bundles libs/ correctly.
Download ISO (1.6 GB) →
Superseded by v1.8.5 (silent SDI audio fix). Download v1.8.5 above for everything in v1.8.4 plus the audio fix.
Cleanup release on top of v1.8.0 — Arrow Lake QSV bundled, NVENC fixed for driver 535, ISO build hardening and a stack of UI/state fixes.
Hardware encoders
- Arrow Lake QSV — Intel media stack 25.2.3 bundled in the ISO (libva 2.22, gmmlib 22.7.2, intel-media-driver 25.2.3, libvpl 2.14, vpl-gpu-rt 25.2.3). Source-built and pinned via
iso/build-intel-media.sh.
- NVENC fixed for driver 535 — FFmpeg-OMT now built against
nv-codec-headers n12.1.14.0 to match the driver's NVENCAPI 12.1. Resolves “Required: 13.0 Found: 12.1” init failures on Pascal/Turing/Ada cards.
- Kernel 6.12 + MTL/Battlemage firmware — ISO auto-resolves the latest 6.12.x backport and ships
mtl_dmc.bin, mtl_gsc_1.bin, bmg_dmc.bin, xe2lpd_dmc.bin in initramfs.
- GPU auto-installer services enabled by default — range-based generation detection covers Pascal → Blackwell.
UI & state
- UI tabs stay in sync after license activation —
refreshSystemInfo() now spreads the full /api/health payload instead of dropping to four fields, so AJA/DeckLink banners and tab visibility no longer drift.
- Re-probe encoders after license activation — trial → Ultra unlocks AJA features without a service restart.
- Hide off-card SDI tab in Settings — AJA-only boxes no longer see a DeckLink tab and vice versa.
Reliability
- Self-heal data-dir ownership — systemd
ExecStartPre=+chown -R on every start. Fixes “permission denied saving settings” when wizard-written files were left as root:root.
- Wizard chown hygiene — defence-in-depth alongside the systemd self-heal.
/whep/*, /whip/*, /ws/*, /api/* never fall back to SPA HTML — unknown paths under those mounts return 404 instead of the React shell.
ISO build
- Force resolv.conf at chroot start — ISO build no longer fails on dangling resolv.conf symlinks.
- build-iso.sh fails loudly on missing FFmpeg-OMT and prints the version it found.
- build-intel-media.sh idempotent — skips rebuild when
.version matches.
- Defensive re-copy of i915 firmware after apt install — survives package reordering.
Download v1.8.5 (latest, includes this) →
NDI
- NDI Access Manager — configure NDI groups, discovery server and transport mode (UDP, TCP, single-TCP, multicast, RUDP) directly from the Settings tab.
- NDI output muxer — async video send with ping-pong double-buffering and a soft pacer to keep the muxer thread off the encode hot path.
- GStreamer
ndisink tee for AJA NDI output — paced, low-latency NDI mirroring directly off the AJA capture pipeline. No re-encode.
- NDI|HX compressed output Optional — H.264/HEVC NDI output via QSV (when the Advanced SDK is present).
- Per-channel NdiClockVideo flag — opt-in wall-clock pacing for sources where downstream consumers need strict cadence.
Capture & Playout
- AJA SDI playout ULTRA — native AJA SDI playout via GStreamer
ajasink with embedded audio. Unified config with DeckLink playout.
- Corvid 88 boot-time SDI port init — reliable PLL lock on boot, no more “no signal” on first start.
- SDI signal probe — AJA capture probes the input framerate and patches NDI/OMT output
-r to match.
- DeckLink + AJA driver install hardening — install paths block in live mode and surface clearer errors on missing kernel headers.
Audio
- Multi-channel SDI audio with WHEP pair selector — pick which audio pair plays in the WHEP viewer via transceiver mid + stream replacement (no more all-pairs-simultaneous).
- Multi-track SRT ingest — selectable audio tracks on SRT sources with per-channel default.
- Auto-detect multi-channel audio for OMT and NDI sources.
GPU & encoding
- QSV via oneVPL (
--enable-libvpl) — modern Intel QSV path for Arrow Lake and newer. ISO ships with kernel 6.12 backport and i915 firmware.
- Hardware-codec channel start serialization — prevents init races on shared QSV/VAAPI device handles.
- Advanced encoding settings panel — expose preset, profile, level, GOP, bitrate mode, B-frames per codec family.
- Bulk-edit channel encoding settings — apply encoder defaults across many channels in one call.
- Enhanced RTMP for HEVC, AV1 and VP9 restream outputs — Twitch/YouTube enhanced-RTMP profiles supported.
Hardware tab & metrics
- New Hardware tab — live thermal, GPU, NIC and NVMe telemetry. AMD GPU and Blackmagic DeckLink collectors land alongside Intel/NVIDIA.
- VictoriaMetrics agent bundled in the ISO for PRO tier.
/api/vm/* proxy exposes VictoriaMetrics directly to external Grafana.
- Expanded Prometheus surface — loadavg, GPU memory/fan/clocks, Go runtime, license expiry, per-channel encode fps/bitrate, restream output state, DVR bytes.
Recordings
- Recordings panel on the channel card — list, download and delete MKV recordings (tier-agnostic).
- Audio in MKV — recordings now include Opus audio via SDP+RTP FFmpeg input. Payload-type fix in SDP.
UI & mobile
- Visual refresh — Inter Tight + JetBrains Mono, refined palette, header stats-strip with vertical dividers, disk and clock pill.
- Density toggle — comfortable / compact across the dashboard.
- Mobile scroll on Settings + Broadcast —
100vh → 100dvh so the page no longer hides behind the address bar.
- Header progressive stat hiding 375–1440 px and footer progressive hide for the 900–1100 px overlap.
- Single-line output badges on channel cards (“Out: WHIP, NDI, RTMP”).
- Self-introspecting
/api index + docs/API.md for every endpoint.
Reliability
whep-remote-tunnel survives default-route flaps and reboots — StartLimitIntervalSec=0, After=ensure-default-route.service, ssh keepalive 30s.
- ISO unit env wiring parity —
NDI_CONFIG_DIR and EnvironmentFile=-/var/lib/whep-gateway/env.
- Two-tier GStreamer shutdown — SIGTERM grace before SIGKILL, no more orphan elements on stop.
- Orphan FFmpeg cleanup on gateway crash + Stop→Start race fix.
KEYGEN_PRODUCT_TOKEN env var — product token no longer in source.
v1.8.0 ISO superseded by v1.8.5 — download v1.8.5 above for everything in v1.8.0 plus subsequent fixes.
Fixed
- DeckLink capture 1–5 fps performance bottleneck — FFmpeg DeckLink input now requests 8-bit
uyvy422 capture (-raw_format uyvy422) instead of accepting the card's default 10-bit v210. Previously a 10-bit SDI source forced FFmpeg to unpack v210 to yuv420p in software on every frame, starving both software (libx264 at ~1 fps) and hardware (VAAPI at ~5 fps) encoders. The BMD card now downconverts to 8-bit at capture time, restoring full 50 fps encoding. Also adds explicit -video_input sdi and -audio_input embedded for unambiguous SDI source selection.
- FFmpeg-OMT failed to load on ISO appliance — SVT-AV1 encoder library (libSvtAv1Enc.so.3) was missing from the bundled libs, causing ffmpeg to fail at runtime. Health endpoint reported “wrong ffmpeg version” and the DeckLink / AJA Settings tabs never appeared after entering the Ultra license key.
- LD_LIBRARY_PATH missing /opt/whep-gateway/libs — systemd service now sees the bundled native libs (libomt, libvmx, libSvtAv1Enc).
- FFmpeg-OMT binary not found on ISO appliance — discovery now searches /opt/whep-gateway/tools/ffmpeg in addition to tools/ffmpeg and /app/tools/ffmpeg.
- DeckLink playout low-latency mode toggle — Ultra-tier DeckLink playout can now toggle low-latency buffering from the Playout tab.
- Restream outputs lost on channel edit — editing a channel no longer drops configured RTMP/SRT restream destinations.
- AJA genlock hint rendering — UI hint now wraps correctly in JSX fragment.
Download ISO (1.1 GB) →
New
- AJA Corvid 88 Capture ULTRA — full GStreamer-based capture pipeline for AJA Corvid and Kona cards. Supports 10-bit v210 SDI with automatic format conversion. No FFmpeg AJA support needed — uses native NTV2 SDK via GStreamer ajasrc plugin.
- AJA Source Discovery — NTV2 device nodes (/dev/ajantv2*) now appear as selectable sources in the channel creation dialog. Three-tier detection: PCI hardware → NTV2 SDK → V4L2.
Security & Hardening
- DVR OOM prevention — corrupt or hostile segment files can no longer trigger unbounded memory allocations. Frames are now capped at 4 MiB.
- Ultra tier enforcement — DVR, AJA playout, and DeckLink playout API endpoints now correctly require an Ultra license. Previously, some status/stop/log endpoints were unguarded.
- Path traversal protection — channel IDs containing path separators or “..” are now rejected in DVR and playout subsystems.
- DVR playback DoS mitigation — per-channel session cap (10 concurrent) and playback speed cap (16x). Supports Authorization: Bearer header for password delivery.
- AJA installer TOCTOU fix — uploaded .deb files now use unique temp paths instead of a fixed filename. dpkg-query lookups are cached with a 60s TTL and 5s exec timeout.
Fixed
- Subprocess leak in AJA/DeckLink playout — the cancel function is now assigned before the goroutine launches, closing a window where stop() could miss cancellation.
- DeckLink double-Wait race — removed duplicate cmd.Wait() call that could panic on the second invocation.
- FFmpeg stderr log leak — /tmp log files are now cleaned up on all exit paths, including early returns during playout startup.
- AJA not shown in channel dialog — frontend was missing ajaAvailable state from health API, so AJA sources never appeared in the dropdown even when detected.
- AJA device count always 0 — settings page now correctly counts NTV2 devices instead of only counting V4L2 devices.
- AJA source probe failure — FFmpeg probe was running against GStreamer-only NTV2 devices and marking them as no-video. Probe now skips FFmpeg for AJA NTV2 sources.
- GStreamer pipeline v210 format — Corvid 88 outputs 10-bit v210 but pipeline forced UYVY caps. Added videoconvert to handle any AJA output format.
Download ISO (1.1 GB) →
New
- DVR Recording & Playback ULTRA — record live channels to disk with configurable retention time and storage quota. Rewind any channel from the watch page — drag the timeline to scrub backwards, with 1x/2x/4x playback speed and instant seek (~50ms). Uses WebSocket + WebCodecs for DVR playback alongside live WebRTC.
- DeckLink Capture ULTRA — Blackmagic DeckLink SDI/HDMI capture card support. Auto-detected after driver install.
- AJA Capture ULTRA — AJA Kona and Corvid capture cards via V4L2. Auto-detected after driver install.
- Software RAID — setup wizard now offers RAID 0/1/5/10 when multiple disks are detected, recommended for DVR recording workloads.
- File Recording ULTRA — one-click MKV recording from the dashboard (REC button). Saves H.264+Opus to local storage.
Improved
- NDI timestamp handling — fixed regression where NDI sources would fail with “frame duplication too large” after removing wall-clock timestamps for OMT sources.
- Source probe resilience — channels no longer fail to start when source probe returns incomplete results; only confirmed audio-only sources are blocked.
- DVR seek precision — keyframe search scans up to 5 seconds forward to handle audio-before-keyframe segment layouts.
- Audio fade-in after DVR seek — 5-frame linear ramp eliminates Opus decoder convergence pops when rewinding.
Download ISO (924 MB) →
Alpha release — DVR playback, DeckLink and AJA capture are new features under active testing.
Fixed
- Install-to-disk boot failure — installed system would not boot from disk due to missing
grub2-common package (provides grub-install and update-grub), missing /usr/sbin in chroot PATH, and no NetworkManager connection profiles for disk boot.
- Setup wizard not launching — bash reads
.bash_profile before .profile; the live system’s .bash_profile prevented the wizard from running on first boot.
- SRT audio resync on reconnect — improved audio filter with
first_pts=0 for PTS normalisation and min_hard_comp_distance=100000 for faster jitter recovery.
Improved
wizard CLI command — type wizard at the console to re-run the setup wizard at any time.
- Git commit hash shown in dashboard header and settings page.
- Install-to-disk now regenerates machine-id, configures NetworkManager DHCP, disables OS prober, and verifies GRUB config.
Download ISO (924 MB) →
Fixed
- Channel status stuck on “Starting” — WebSocket
/ws endpoint required auth, but browsers cannot send auth headers on WS connections, so the WS was permanently dead and channel_status broadcasts never reached the frontend. Fixed by removing auth from /ws (read-only broadcast, no mutations).
ws.onerror killed polling — the WS error handler set backendOnline=false, which could pause the 3-second polling fallback. Fixed by making the health check the authoritative source for backend connectivity.
- Install-to-disk on mounted partition — the persist script auto-formats and mounts the target disk on live boot. Install-to-disk now stops services and unmounts the partition before repartitioning.
Improved
- Multiview auto-play — tiles now auto-assign running channels on page load instead of requiring manual selection per tile.
- Setup wizard hardening —
safe_addstr prevents curses crashes on small terminals, tty reopen fixes input on serial consoles, scrollable menus handle long option lists.
- Profile-based wizard launch replaces systemd service (eliminates getty conflict on tty1).
- Browser auth popup no longer appears for WHIP ingest endpoints.
New
- UEFI boot support — ISO now boots on both BIOS and UEFI systems with dual syslinux + GRUB EFI bootloaders
- Version number displayed in the browser dashboard header
- Mobile fullscreen support — fullscreen button now works on iOS Safari
Fixed
install_to_disk (underscores) now works as alias for install-to-disk
- Removing WHEP password while editing codec no longer prevents channel from starting
- UEFI install-to-disk correctly partitions GPT with EFI System Partition
- Static IP wizard — nmcli connection name parsing fixed
- AV1 frame stutter resolved — uses actual timestamps instead of fixed 33ms
- AV1 audio made optional with
-map 0:a?
Improved
- Codec fallback display — shows actual codec in use when configured codec unavailable
- Error toasts in dashboard when channel start/stop fails
- Auto-restart broadcasts status update to all connected browsers
Download ISO (912 MB) →
New
- WHIP Output (Alpha) — push channels to remote WHIP ingest endpoints (CDNs, streaming platforms, OME, etc.)
- Per-channel WHIP output configuration from the web UI — endpoint URL, bearer token, enable/disable
- Auto-reconnect with exponential backoff when WHIP endpoints go down
- REST API for WHIP output management (CRUD + start/stop)
- WHIP outputs reuse existing encoded tracks — zero extra CPU/GPU overhead
Improved
- Channel list now sorted alphabetically — no more jumping positions on refresh
- SDP codec negotiation constrained to channel’s actual codec — prevents remote servers picking wrong codec
Fixed
- SVT-AV1 v1.7.0 library symlink fix — ISO was loading system v1.4.1 instead of bundled v1.7.0, breaking AV1 encoding
- FFmpeg rebuilt with clean SVT-AV1 v1.7.0 linkage
Download ISO (906 MB) →
Fixed
- AV1 encoding now works correctly — upgraded SVT-AV1 to v1.7.0 (v1.4.1 had broken rate control)
- AV1 WebRTC playback fixed — upgraded Pion WebRTC to v4.2.9 for proper AV1 RTP packetization
- AV1 scene change detection enabled (scd=1) for better quality at lower bitrates
- Keyframe interval options limited to 1–2 seconds (appropriate for live WHEP streaming)
- OMT identity color matrix now correctly converted to BT.709 for SVT-AV1
Download ISO (877 MB) →
Fixed
- Install-to-disk now correctly removes all live-boot packages and initramfs hooks, enabling reliable disk boot
- Trial license resets automatically after install-to-disk so the 30-day trial starts fresh on the new system
- High-bitrate streaming stability on streams above 20 Mbps
- libvpx compatibility for VP8/VP9 WebRTC output
Improved
- Setup wizard streamlined — install-to-disk is now a separate CLI command (
install-to-disk)
- ISO file size reduced to 903 MB
Download ISO (903 MB) →
New
- License activation via Keygen.sh — activate monthly or lifetime licenses from the web UI
- 30-day free trial with full functionality, no license key required
- Stripe-powered checkout with automatic license key delivery via email
- License key recovery page for retrieving keys by email
Improved
- Web UI redesign with cleaner settings panel and license management
- Improved SRT ingest stability on high-bitrate streams
Download ISO (901 MB) →
New
- AV1 and VP9 codec support for WebRTC output
- Hardware-accelerated transcoding — Intel QSV, NVIDIA NVENC, AMD AMF
- Multi-viewer: multiple browsers can watch the same channel simultaneously
Improved
- Reduced WebRTC glass-to-glass latency to under 200ms on local networks
- Better automatic codec negotiation with browsers
New
- Web-based dashboard for channel management and monitoring
- REST API for programmatic channel control
- Per-channel configuration — resolution, bitrate, codec settings
Improved
- More reliable OMT source discovery on complex networks
- Lower memory usage when running multiple channels
New
- HEVC (H.265) input support alongside H.264
- Audio passthrough — AAC and Opus output to browsers
- HTTPS support with self-signed certificate generation
Fixed
- Resolved intermittent black frames on stream start
- Fixed audio sync drift on long-running streams
Initial Release
- Debian 12 live appliance — boot the ISO and go
- OMT source auto-discovery on the local network
- WebRTC WHEP output — stream to any modern browser with no plugins
- H.264 transcoding with configurable bitrate and resolution
- Sub-second latency video delivery
- Simple web UI for basic configuration