Changelog
Generated at build time from changelog.yml. Cross-reference GitHub Releases for download links and signed artifacts.
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)