Changelog
Generated at build time from changelog.yml. Cross-reference GitHub Releases for download links and signed artifacts.
4.2.0
2026-08-30
- Stream recording writes H264 or H265 video to keyframe-aligned fMP4/HLS segments without a second encode; the new recording UI supports live playback, poster frames, storyboard hover previews, filmstrip seeking, session size and duration, and start/stop/delete controls (
485db82) - Recording sessions now finalize cleanly after write failures, producer replacement, or shutdown; same-second restarts no longer overwrite earlier sessions, active storyboard images avoid stale browser caches, and reported size and duration include the final flushed segment (
393f481) - Sources can run a shell command that emits yuv4mpegpipe frames; VideoNode reads geometry and frame rate from the Y4M header, reports the detected format to dependent encoders, falls back to NO SIGNAL on EOF, and retries the command once per second (
6e70147) - Staged source frames are exported through udmabuf before GPU import, fixing black composer slots when the source uses cached memfd-backed buffers and making import failures visible in the log (
5d69332) - Composer inputs reconnect after a source process restarts instead of freezing on the last frame; retries are non-blocking and limited to once per second per slot (
0784f23) - Composer output preserves red and blue correctly during BGRA-to-NV12 conversion, fixing swapped colors in canvas snapshots, SCM broadcasts, and downstream streams (
90ec17d) - Linux password authentication now runs through the packaged videonode-session PAM helper; the daemon and its child processes no longer inherit shadow-group access, and upgrades revoke the old membership (
d06dbaf) - SSE event delivery no longer leaves 2 kHz dispatcher goroutines behind after clients disconnect, removing the measured 16 to 20 percent idle CPU load on RK3588 after the first UI connection (
d72b7f7) - A composer's video coverage can be exported as an OBS alpha mask from the composer and stream pages, so the canvas layers over other scene content instead of arriving as one opaque rectangle; download a canvas-sized PNG for the Image Mask/Blend filter, or copy a browser-source URL whose player clips the live video to the same regions with no OBS plugin (
2329b0c)
4.1.1
2026-06-09
- SRT egress improvements for H265: subscribers joining between keyframes now get VPS/SPS/PPS prepended so the decoder starts immediately instead of stalling until the next IDR; the listener also gains tunable latency/bandwidth/idle-timeout knobs and aligns its payload to 1316 bytes (7x188) so MPEG-TS packets stay intact (
37ff943)
4.1.0
2026-06-08
- Processes panel rebuilt on a dedicated SSE process stream — live per-process stats pushed instead of polled, with explicit process-removed events; the UI fetches once on start/reconnect, then follows pushes (
6d32de6) - the daemon now appears as its own self row with live CPU/RSS, the InfoBar derives its stats from the processes stream (dropping /api/system), and host GPU/MPP/NPU utilization is surfaced alongside (
897d5fd) - source capture hardened — zero-copy dma-heap DMABUF capture, a libplacebo CSC fallback when RGA can't convert NV24, 64B NV12 stride padding, and steadier behavior through signal loss and HDMI link flaps; the v1->v2 config migration and migrate-config command are gone, so streams.toml must already be version 2 (
820265a) - smaller operational fixes: auth falls back to Basic when /etc/shadow is unreadable, WHEP DELETE is idempotent for an already-closed peer, and an opt-in net/http/pprof debug server for live profiling (
519fcb9)
4.0.0
2026-06-03
- new pipeline architecture: sources, composers, and streams are three independent top-level entities wired by explicit upstream refs, governed by a single pipeline master switch, with encoders that spawn lazily on the first reader and stop after the last (
b22080f) - native RK3588 media pipeline: videonode-source/composer/sink processes move NV12 dma-bufs zero-copy over SCM_RIGHTS, with a libplacebo GPU compositor and an NV12-end-to-end path carrying colorimetry through to the encoder (
1a42a4d) - GPU composer with a live layout editor: multi-source compositing onto a canvas, a Region/Content model with per-slot rotation, crop, pan/zoom and fit, per-input perspective effects, configurable background, and edits that apply without restarting the pipeline — plus composer config TOML export/import (
c1a4d04) - WebRTC playback via a WHEP egress endpoint with H265, fanning out alongside SRT and RTSP from the built-in local relay (
f412934) - RK3588 hardware acceleration end to end: hardware MJPEG decode through MPP, rkmpp encoders ingesting BGRA/RGB directly, and an S32_LE-capable audio capture path for the on-board ADC (
cea24f4) - rebuilt operational web UI on a single typed SSE entity stream: live pipeline/source/stream stats and sparklines, per-entity log panels, consumer counts and client IPs, process restart controls, an embedded WHEP player, and dead-rig detection (
22fbdd1) - unified .deb packaging with a GitHub Pages APT repo, shadow-group-gated auth with postinst enrollment, and service auto-start on install — replacing goreleaser, the in-app self-update service, and install.sh (
55a842b) - VitePress documentation site with Mermaid diagrams, search, and versioned navigation (
cdd37c1)
4.0.0-rc12
2026-05-31
- MJPEG sources with 4:2:2/4:4:4 chroma (e.g. HDMI-USB capture dongles) no longer show a red color ghost — the source converts them to NV12 instead of mislabeling the decode (
0df70cf)
4.0.0-rc11
2026-05-31
- composer pipeline goes NV12 end-to-end: GPU NV12 canvas output, NV12 composer inputs, an NV12-only sink carrier, and snapshots that read the staged NV12 fds, with colorimetry/VUI tags carried through (
8ed71b8) - zero-copy canvas broadcast gated on per-consumer read completion, plus a GPU canvas clear and depth-4 ring, cutting per-frame CPU on the compositor (
7746e7b) - UI surfaces the detected source colorimetry, and the stream audio config now lays out on a single line (
4057bcb) - composer config exports to and imports from TOML — copy-paste in the browser or a .toml file, including overwriting an existing composer in place (
9069dd2) - pipeline start is best-effort so one failing stage no longer blocks the rest; the composer also clears a stuck snapshot request on RPC timeout (
ba2024f) - journald logging de-noised: dedup is keyed on the full record rather than message text, and the packaged service no longer double-logs to the journal (
2403997)
4.0.0-rc10
2026-05-31
- rkmpp encoders ingest BGRA/RGB32 directly, converting in hardware instead of via a CPU-heavy software nv12 filter (
7e869b2) - readers dialing a stream that isn't configured now get a clean 404 instead of a logged warning and a spawned encoder (
89b821e) - the .deb ships the videonode asound.conf so the RK3588 audio capture config is present on install (
e533874)
4.0.0-rc9
2026-05-31
- WHEP egress endpoint (POST/DELETE /whep/{stream}) for WebRTC playback, with working H265 and a fix for motion smearing (
f412934) - WebRTC peers and SRT consumers now share a single hex client-ID scheme (
cde5b5c)
4.0.0-rc8
2026-05-30
- RK3588 audio capture reworked: routed through an mmap plug->dsnoop PCM that converts the card-native format (the Hollyland Lyra is S32_LE-only) to whatever the encoder requests, with a larger dsnoop ring to kill xruns under the 1080p60 transcode load (opus output ~8kbps silence -> ~85kbps); the service unit gains the audio group and streams now honor per-stream audio config (
de9c2d1) - native source/sink robustness: the source gates NV12 ring reuse on consumer read-completion (per-slot refcount + generation), fixing the venetian-blind tearing seen across snapshot, composer, and encoder output; vn-sink reconnects across a source/composer restart instead of feeding a dead RTSP relay; the composer fails fast on a GPU-less host (
661e15c) - hardware MJPEG decode adopts MPP's info-change handshake (two buffer groups, packet-owned input, one-shot SET_INFO_CHANGE_READY), fixing the per-frame jpegd reset that left Lyra MJPEG frames undecoded (
975e2d3) - SSE entity payload is typed end-to-end as a oneOf+discriminator keyed on a
typetag, so the UI narrows on event.type with no casts; idle now publishes a full zeroed status, so partial payloads can no longer crash the source panel (56558e4) - connection robustness: the UI detects a dead rig in ~20s via an 8s request timeout and a 20s SSE heartbeat watchdog instead of waiting out the TCP timeout, the shared SSE connection persists across navigation, reconnect is health-gated, and offline stats blank to dimmed em-dashes instead of frozen fake-ticking values (
02dcb7a) - unified POST /api/processes/{id}/restart for source/composer/encoder, with restart buttons on the detail pages (
3b5bfba) - the .deb no longer hard-depends on out-of-band board libraries (librga2, librockchip-mpp1) that come from a 3rd-party repo or a from-source build, fixing uninstallable 'apt install videonode' where no owning package exists (
c38e3bc)
4.0.0-rc7
2026-05-29
- composer layout editor rebuilt on a Region/Content model: Region is the axis-aligned output rectangle, Content the rotatable source overlay (0/90/180/270, cover/fit/stretch, pan/zoom), fixing rotated-slot resize at the root; edits now persist while the pipeline is idle (
c1a4d04) - real-time updates collapse onto a single entity-envelope SSE stream, replacing the legacy per-event publishes; consumer-set changes fire a dedicated source.consumers event only on membership change (
8275702) - operational UI: infobar shows live pipeline uptime/CPU/mem via a new daemon resource endpoint, source list shows format/res/fps and live consumer count, and the header tints with no thrown errors when the backend connection drops (
22fbdd1) - hardware MJPEG decode now works, driven through MPP's advanced 1-in-1-out path with input-buffer sync (the prior simple-API loop never produced a frame); adds an mpp-jpeg-probe diagnostic (
cea24f4) - source/capture robustness: reports no-signal when the device is absent, stops busy-spinning on capture-fd errors, stamps status with wall-clock time, and keeps the encoder idle until a reader connects (rebuilding it on a dimension change) (
4b21ceb) - release target moves to Debian 13 (trixie) so the composer libplacebo backend builds; .deb runtime deps are derived from the real binaries via dpkg-shlibdeps, and installs on bookworm now fail with a readable apt error (
7720917)
4.0.0-rc6
2026-05-29
- arm64 .deb builds on Debian bookworm and declares its native runtime libraries (gRPC, protobuf, abseil, libplacebo, turbojpeg), fixing missing-shared-object and GLIBCXX-version failures on bookworm/Armbian SBCs (
0e467ef)
4.0.0-rc5
2026-05-28
- streams drop configurable publish targets: encoders publish to the built-in local RTSP relay, SRT/WebRTC fan out from there (breaking) (
3ccdfaf) - remove the in-app self-update service; updates ship via the .deb / APT repo only (breaking) (
1de2fe0) - sources expose a liveness signal distinct from status, surfaced with per-entity log panels over the shared SSE stream (
d5d9270) - stream editing UI: partial-PATCH edits and auto-start preview that wakes an idle stream (
4676230) - pipeline fixes: compositor honors the NV12 UV-plane offset, source pins and reports the real capture rate via G_PARM (
47767b1) - packaging cleanup: drop the legacy install.sh and the network-online unit dependency (
321b127)
4.0.0-rc4
2026-05-28
- packaging: enroll SUDO_USER on upgrade, not just first install (
37f0656)
4.0.0-rc3
2026-05-27
- VitePress docs site with Mermaid, search, versioned navbar (
cdd37c1) - release pipeline rewrite: matrix build replaces goreleaser, chglog-driven .deb (
feff078) - shadow-group-gated auth + postinst enrollment, service auto-start on install (
f62e5a3) - composer UI: auto-slot on input add, canvas rotation moved to inspector (
74749ac) - source reports placeholder dims while V4L2 inactive (
16f5389)
4.0.0-rc1
2026-05-27
- feat(packaging): unified .deb via nfpm + GitHub Pages APT repo (
c57d69e) - refactor(packaging): replace CPack with nfpm (
72c5d66)
3.1.0
2026-05-18
- feat: v3.1.0 release (
676bf30)