Skip to main content

37 posts tagged with "releases"

View All Tags

Kyber 0.19.0

· 3 min read

Kyber 0.19.0 brings meaningful improvements to streaming quality, session observability, and platform robustness. The most impactful user-facing addition is dynamic bitrate control: the streaming bitrate can now be adjusted at runtime without reconnecting, and the web client exposes this through a live bitrate control API. The default minimum video bitrate is set to 5 Mbps, with a configurable floor for deployments that need it lower. Both audio and video buffer sizes are now tunable via command-line options (--audio-buffer and --video-buffer) on the desktop, and exposed through the JavaScript API on the web, giving users direct control over the latency-versus-smoothness trade-off.

Session tracing improves significantly: the server now generates a unique Session ID at the start of each stream, logs it, and sends it to the client. The client logs this ID upon receiving it, making it straightforward to correlate server and client logs for a specific session when diagnosing issues. The QUIC transport layer now filters out duplicate frames in the GopStream protocol, preventing redundant data from reaching the decoder.

On Windows, the capture and encoding server implements a monotonic clock, avoiding timestamp issues caused by non-monotonic system clock sources. The clock source used by the stream processing pipeline is now configurable from kyber_config.toml. The NVENC encoder now correctly sets the GOP size when intra-refresh is disabled. The QUIC transport automatically finds an available IPC port at startup instead of requiring manual configuration. The input handling C API gains rumble unpack support and includes vendor and product IDs in gamepad plug packets, enabling more precise gamepad identification. The web client fixes cases where mouse position events were incorrectly sent instead of relative mouse move events, and adds Client.disconnect_and_stop() for cleaner teardown from JavaScript. Gamepad plug and unplug notifications are now exposed through the JavaScript API, and audio initialization is skipped gracefully when SharedArrayBuffer is unavailable in the browser context.

Changelog

  • avserver/win32: Implement monotonic clock
  • windows_service: Correctly log CreateProcessAsUserW() error
  • kymux: Try to find an available port when starting IPC
  • kyaudioreg: Fix compensation
  • desktop: Add --audio-buffer parameter
  • controller: Remove timeout on avserver kill
  • libclient/rtp: Allow to override the SDP folder with envvar KYBER_CACHEDIR
  • libkynput: Add SDL2 feature to be able to trigger SDL2 support
  • libkynput/capi: Add rumble unpack
  • libkynput/capi: Add vendor/product id in libkynput_gamepad_plug_to_packet()
  • txproto: Rebase to upstream/master
  • desktop: Bitrate can now changed dynamically during runtime
  • avservice: Allow to configure txproto clock source from kyber_config.toml
  • kyaudioreg: Rework underflow log
  • desktop: Add video-buffer option
  • avservice: By default, the video bitrate can't be set under 5 mbps
  • avservice: Allow to configure the minimum allowed video bitrate
  • avservice/nvenc: Set GOP when intrarefresh is disabled
  • controller: Generate, log and send a SessionId on streaming start
  • libclient: Log SessionId sent by controller on streaming start
  • kymux: Filter out duplicates in GopStream
  • (web) jsapi: Add audio_buffer parameter
  • (web) kyproto/kyaudioreg/libclient: Use kywasmtime
  • (web) jsapi: Add live bitrate control
  • (web) libclient: Skip audio initialization if SharedArrayBuffer isn't defined
  • (web) kyaudioreg: Rework underflow log
  • (web) jsapi: Add video_buffer option
  • (web) kymux: Filter out duplicates in GopStream
  • (web) libclient: Log SessionId sent by controller on streaming start
  • (web) jsapi: Expose gamepad plug/unplug notifications
  • (web) inputs: Fix cases where MousePosition where sent instead of MouseMove
  • (web) jsapi: Add Client.disconnect_and_stop() to both disconnect and stop the Client

Kyber 0.18.2

· One min read

Initialisation errors in the server are now written to controller.log, making it easier to diagnose startup failures that would previously have gone unrecorded.

Changelog

  • controller: Log initialization errors in controller.log

Kyber 0.18.1

· One min read

A security fix corrects cookie key generation in the server's authentication layer, which could have produced weak or predictable session cookies. On the web client, input handling now cleanly manages the case where the video canvas is removed from the page during a mouse move event, and window-level event listeners are properly unregistered when the canvas is removed. The client backend now stops correctly when the data plane connection closes.

Changelog

  • avserver: Log when display enumeration has been started
  • avserver: Add pid in logs
  • txproto/dxgi: Add more error logs
  • txproto/wasapi: Reduce some log severity
  • controller: Log actix server errors
  • controller: Log displays at startup
  • libclient: Stop backend on DataPlaneClosed
  • (web) libkynput: Notify JsElementNotFound once in mousemove if canvas has been dropped
  • (web) libkynput: Unregister window events if canvas has been removed
  • (web) libclient: Stop backend on DataPlaneClosed

Kyber 0.18.0

· 3 min read

Kyber 0.18.0 brings a reworked protocol selection system, expanded TLS flexibility, and quality-of-life improvements for audio control. Protocol selection for both video and audio has been refactored and is now exposed through a dedicated --audio-protocol parameter, giving you independent control over the transport used for each stream. Audio can now be sent over an unreliable QUIC channel, which reduces latency at the cost of occasional dropped packets — a useful trade-off for real-time use cases. The complete TLS certificate chain is now loaded correctly by the server, and you can opt in to using the operating system's built-in certificate store on the client side. Server TLS certificates are now optional when using the WebSocket backend, simplifying local and development setups. The QUIC stack has been updated to quinn 0.11.5, wtransport 0.4.0, and rustls 0.23.13.

The desktop client now correctly hides the cursor at startup when the session requires it, and keyboard shortcuts for adjusting audio volume have been added. A workaround has been applied for a Windows-specific issue where negative presentation timestamps could occur while the NTP clock was adjusting backwards, which previously caused encoding problems.

On the web side, a bug that prevented the correct screen resolution from being applied on display selection has been fixed. A spurious warning that appeared in logs on deliberate disconnect has been suppressed, and missing WebTransport certificate hashes from the server are now handled gracefully. Volume and mute controls are available through the JavaScript API.

Changelog

  • desktop: Refactor protocol selection and add audio protocol parameter
  • desktop: Correctly hide cursor at startup if required
  • avserver/win32: Workaround negative PTS generation while NTP goes backward in time
  • controller/ws: Handle close control frame
  • libclient: Update VLC. Kymux branch is now based on 6880921445
  • libclient: Allow to rely on builtin OS TLS certificates
  • desktop/kymux-audio: Add unreliable parameter
  • controller: Correctly load the complete certificate chain
  • controller/ws: Make server certificate generation optional
  • desktop: Add audio volume keyboard shortcuts
  • Update Quic stack (quinn 0.11.5, wtransport 0.4.0, rustls 0.23.13)
  • (web) jsapi: Refactor protocol selection and add audio protocol parameter
  • (web) inputs: Fix display selection. The screen resolution wasn't correctly selected
  • (web) Also log video coded size when receiving libclient::Event::CanvasResized
  • (web) libclient: Avoid to display "Failed to receive audio/video from Kymux" when disconnection has been requested
  • (web) libclient: Handle cases where controller gives no Webtransport hash certificate
  • (web) jsapi: Add audio volume/mute API

Kyber 0.17.1

· One min read

This patch adds a --gamepad_force_xbox360 option for the desktop client, which forces all connected gamepads to be reported as Xbox 360 controllers — useful for games or applications that only recognise that specific controller type. The web client gains the equivalent gamepad_force_xbox360 parameter. A regression introduced in web version 0.5.0 that broke display resolution changes has been fixed. A subsequent web-only patch makes the audio regulator lock-free, eliminating a source of potential audio stalls under load.

Changelog

  • desktop: Add --gamepad_force_xbox360
  • libclient: Log intra_refresh setting received in StreamingSessionConfig
  • (web 0.5.2) jsapi/start_streaming: Correctly return an error when displaylist is unknown
  • (web 0.5.1) Correctly handle display resolution change (0.5.0 regression)
  • (web 0.5.1) libclient: Log intra_refresh setting received in StreamingSessionConfig
  • (web 0.5.1) jsapi: Add gamepad_force_xbox360 parameter

Kyber 0.17.0

· 2 min read

Version 0.17.0 focuses on multi-display support, encoder configurability, and gamepad improvements. You can now stream multiple displays simultaneously by specifying the number of screens with --display_count, making Kyber much more practical for multi-monitor setups. Encoder intra-refresh can be configured directly from the command line with --intra_refresh, and the capture and encoding server can now accept encoder configuration overrides from kyber_config.toml for fine-grained tuning without rebuilding. The data plane port is also overridable, giving more flexibility in network environments that require specific port assignments.

Two bugs in the QUIC transport layer for unreliable datagrams have been fixed — duplicate datagram handling and the sequencer — improving reliability of the low-latency transport path. On Windows, PlayStation controllers are now registered as PS4 controllers, ensuring correct button mapping in games that distinguish between controller types. The console window on Windows is hidden so Kyber runs more cleanly in the background. Audio regulator integration is now complete on both desktop and web, providing stable, drift-free audio playback. The web client also gains the ability to send gamepad Product and Vendor IDs to the host.

Changelog

  • libclient: Integrate kyaudioreg
  • avserver: Allow to overload encoder configuration from kyber_config.toml
  • kymux: Fix duplicate datagram handling with unreliable
  • kymux: Fix sequencer for unreliable protocols
  • desktop/win32: Hide console
  • desktop: Add multiscreen support. Can be enabled with option --display_count
  • desktop: Allow to configure Intra refresh with option --intra_refresh
  • inputserver/win32: Plug PlayStation controllers as PS4 controllers
  • controller: Allow to override dataplane port
  • (web) libclient: Integrate kyaudioreg
  • (web) Add intra_refresh parameter. This allows to override encoder configuration
  • (web) libkynput: Send gamepad's Product Id and Vendor Id
  • (web) libkynput: Avoid to spam when rumble isn't supported

Kyber 0.16.1

· 2 min read

This patch release addresses several correctness and reliability issues. A bug in the QUIC transport layer that caused an incorrect header size for unreliable datagrams has been fixed, resolving potential data corruption on that protocol path. On macOS 14 Sonoma, a regression that caused the window to report an invalid size when resized has been corrected. Both the capture and encoding server and the input server on Windows are now properly DPI-aware, which prevents scaling issues on high-DPI displays. At session start, the host cursor position is now synchronised to the local cursor position so the pointer appears in the right place immediately on connection. The web client patches include the transport fix, improved connection logging, and a lock-free rework of the audio regulator that eliminates a class of potential contention issues.

Changelog

  • kymux: Fix unreliable header size
  • desktop: Expose kymux_unreliable protocol
  • macos: Fix window size sometimes being invalid when resizing on macOS 14 Sonoma
  • avserver/win32: Make process DPI aware
  • inputserver/win32: Make process DPI aware
  • desktop: Move the host cursor position to match the local one at startup
  • libclient: Improve start and stop logs
  • (web 0.4.2) libclient: Make AudioRegulator lock free
  • (web 0.4.1) kymux: Fix unreliable header size
  • (web 0.4.1) Expose kymux_unreliable protocol
  • (web 0.4.1) libclient: Improve start and stop logs

Kyber 0.16.0

· 2 min read

Kyber 0.16.0 delivers encoder and audio improvements alongside a number of dependency updates. The capture and encoding server now supports YUV 4:4:4 colour for HEVC when using Intel Quick Sync Video, joining the NVENC support added in 0.15.0. FFmpeg has been updated to version 6.1.1, and the NVENC headers, Intel VPL, and AMD AMF driver libraries on Windows have been refreshed as well. A bug causing missing Direct3D 11 flags on certain AMD Ryzen 7 PRO hardware has been fixed, restoring reliable AMF encoding on those systems.

The most user-visible change in this release is that audio is now enabled by default — you no longer need to pass an extra flag to hear sound from the remote machine. Audio playback now uses the audio regulator on Windows, Linux, and macOS, producing smoother, more consistent output. The web client benefits from the same audio regulator and gains support for YUV 4:4:4 HEVC decoding in Chrome 126 and later.

Changelog

  • avserver: Support yuv444p for hevc when using qsv
  • avserver/win32: Update nv-codec-headers to n12.1.14.0
  • avserver/win32: Update vpl to v2.10.1
  • avserver/win32: Update amf to 1.4.33
  • avserver: Update ffmpeg to 6.1.1
  • libclient: Update VLC. Kymux branch is now based on dfd6d83e50
  • vlc: Use AudioRegulator on Windows/Linux/macOS
  • desktop: Audio is now enabled by default
  • Update Rust dependencies
  • kymux: Revert timeout detection
  • libclient: Stop websocket on ControlPlaneClosed
  • libclient: Log PlayerConfig on start_streaming()
  • avserver: Improve initialization logs in dxgi and packet_sink
  • avserver/amf: Add missing D3D11 flags to support AMD Ryzen 7 PRO 5875U
  • (web) libclient: Use AudioRegulator
  • (web) Update Rust dependencies
  • (web) kymux: Revert timeout detection
  • (web) libkynput/wasm: Log gamepad id
  • (web) libclient: Send a notification to the main worker when VideoDecoder is configured
  • (web) libclient: Support yuv444p for hevc. Requires Chrome 126

Kyber 0.15.0

· 3 min read

Version 0.15.0 is a substantial update that improves error detection, encoder flexibility, and connection resilience throughout the stack. The capture and encoding server now runs on an integrated media pipeline that enables more sophisticated stream processing. Encoder selection now applies consistently whether you are using QUIC or RTP transport, and HEVC streaming with NVENC now supports the YUV 4:4:4 colour format for richer colour fidelity. When the encoding server encounters a problem — whether during initialisation, frame acquisition, or encoding itself — the error is now detected and forwarded to the application, and outright crashes are also reported rather than silently disappearing. The server will drop already-captured frames instead of encoded ones when the network cannot keep up, which keeps latency lower under congestion.

Connection robustness has also improved: the data plane now has a one-minute timeout so stalled connections are detected, the client stops cleanly if the data plane fails or the streaming session cannot start, and a race condition that was causing spurious 403 errors when starting a stream has been fixed. Support for the Side and Extra mouse buttons has been added to input handling, and macOS builds now use FFmpeg 5.1.1. A new /stop_streaming endpoint lets you stop a streaming session without tearing down the entire server process.

The web client picks up all of these improvements and adds the ability to stop and restart both the client and the streaming session independently without reloading the page. Gamepad detection now works even without a gamepadconnected browser event firing, a decoder crash that affected Mac users has been fixed by increasing the video decoder queue size, and log noise on data plane disconnect has been reduced.

Changelog

  • Rust toolchain updated to 1.76.0
  • controller: Update wtransport to 0.11.0
  • controller/cors: Allow Access-Control-Allow-Credentials
  • controller: Add /stop_streaming endpoint
  • controller: Fix racy kymux stop. Should fix the remaining 403 errors when starting kymux
  • avserver: Integrate libtxproto
  • avserver: Encoder selection now applies also to RTP backend
  • avserver: Detect Initialization/Acquisition/Encoding errors and forward them to the application
  • controller: Forward avserver crash to the application
  • kymux/kycom: Fix TcpStream read error
  • controller/libclient: Implement connection timeout detection (1 minute) on Data Plane. The event is only logged for now
  • libclient: Stop if Data Plane connection fails, or if streaming start fails
  • libclient/macos: Use ffmpeg 5.1.1 (like Windows) instead of master
  • avserver: Support yuv444p for hevc when using nvenc
  • libkynput: Handle Side/Extra MouseButtonType
  • txproto: Avoid to drop encoded frames when network is slow. Drop acquired frames instead
  • kymux: Correctly handle write during congestion, when using wtransport backend
  • (web) Client can now be stopped and restarted
  • (web) Streaming can now be stopped and restarted
  • (web) libclient/http: Set credentials=include when calling fetch()
  • (web) avserver: Detect Initialization/Acquisition/Encoding errors and forward them to the application
  • (web) controller: Detect avserver crashes and forward them to the application
  • (web) Implement connection timeout detection (1 minute) on Data Plane. The event is only logged for now
  • (web) libclient: Stop if Data Plane connection fails, or if streaming start fails
  • (web) libkynput: Plug gamepad when detected without gamepadconnected
  • (web) libclient: Increase Demuxer -> Decoder video queue size to fix decoder crash on Macs
  • (web) libkynput: Handle Side/Extra MouseButtonType
  • (web) libkynput: Avoid to spam when DataPlane is disconnected

Kyber 0.14.0

· 3 min read

Kyber 0.14.0 brings meaningful improvements to connection reliability and visibility on both desktop and web. The connection process is now split into two distinct stages — first establishing the control plane link, then starting the streaming session — making it clearer exactly where a connection stands at any given moment. If either stage fails, you now receive a specific notification explaining what went wrong and why the session ended, rather than a silent timeout. A one-minute timeout guards the control plane connection, so a failed or stalled attempt is detected and surfaced quickly rather than left hanging indefinitely.

On Windows, a long-standing latency issue with H.264 hardware decoding in Chromium-based browsers has been resolved through a fix to how encoder parameters are packaged for the stream, resulting in noticeably snappier video for affected users.

The web client receives all of the same connection-lifecycle improvements alongside several stability fixes. The host cursor shape is now applied correctly only when the pointer is actually inside the video canvas. A new API lets you query which video codecs the browser supports, and notifications — including canvas resize events — are now delivered through a unified notification system. The client will now automatically stop itself on a video decoding error rather than hanging, and audio decoding errors are handled gracefully as well. Gamepad handling no longer panics on unrecognised buttons or axes, and two startup crashes have been fixed.

⚠️ The web client JavaScript API and the server protocol both contain breaking changes in this release. Existing web integrations will need to be updated.

Changelog

  • controller/libclient: Implement connection timeout detection (1 minute) on Control Plane
  • Add client lifecycle notifications (connection failed, disconnected + reason)
  • Connection steps are now splitted (1. Connect to the Control plane, 2. Start streaming session)
  • avserver/win32: Correctly patch NVENC H264 SPS to fix H264 latency issue on Windows Chromium when using hardware decoding
  • (web) ⚠️ This version introduces breaking changes ⚠️
  • (web) The JS has breaking changes
  • (web) The protocol with the controller has breaking changes
  • (web) Implement connection timeout detection (1 minute) on Control Plane
  • (web) cursor: Apply Host cursor shape only when the cursor is inside the canvas
  • (web) Add supported_video_codecs()
  • (web) Add a generic notification API. "canvas_resized" is now passed through this API
  • (web) Add client lifecycle notifications (connection failed, disconnected + reason)
  • (web) Improve callstack decoding in browser console
  • (web) Client is now automatically stopped if a video decoding error is detected
  • (web) Handle audio decoding errors correctly
  • (web) gamepad: Avoid to panic when receiving unknown button/axis
  • (web) Connection steps are now splitted (1. Connect to the Control plane, 2. Start streaming session)
  • (web) Fix a case where cursor was hidden and not send after connection
  • (web) Log client revision at startup
  • (web) Fix a crash when VideoFrame queue is full at startup