August 20, 2026
Jean-Baptiste Kempf

Kyber release 0.28

“Release of our 0.28 version, containing 3 major updates : MacOs hosts, click correction and a new encode engine.”
JBK President

Kyber 0.28!

Kyber 0.28 is out.

Macs can be hosts now, not just clients. Beyond that: clicks that no longer land where you didn't aim them, log files that moved and can finally be turned up or down, an honest answer to "which version am I running", and a new capture engine you can try if you feel like it.

Here are the highlights.

Kyber now streams macOS (alpha version)

A Mac has always been able to connect to a Kyber host. In 0.28 it can be one, for advanced developpers only.

Installation wizard is still in progress, the app is inside a plain zip file. You have to launch the app manually via command line (see gitlab for documentation) — there is no window to leave open and nothing to launch by hand.

Capture uses Apple's ScreenCaptureKit, which picks up the screen and the system audio together, and encoding runs on the Mac's own hardware through VideoToolbox. Both are chosen automatically, so a working Mac host needs no configuration file editing at all. macOS 13 Ventura or later is required for audio capture, and builds are available for Apple Silicon only.

Two things will want your attention the first time. macOS will ask for Screen Recording and Accessibility permission, and without them you get a black screen, dead input, or both. The build is also signed ad hoc rather than with a Developer ID, so Gatekeeper will grumble on first launch.

This is a first release and it shows in places. A Mac host forwards keyboard and mouse only — no gamepads, no clipboard sharing, no remote cursor shapes yet — and the watermark overlay is not available.

Clicks stay on the video

When the video does not fill the whole window — letterbox bars from a different aspect ratio, a windowed session, a client you have resized — clicks landing on the black borders were being sent to the remote machine anyway. You could click something on the host you never aimed at.

Only clicks that actually land on the video are forwarded now. A drag that starts on the video still delivers its release, so nothing gets stuck held down at the other end, and the scroll wheel still works anywhere in the window.

Which version am I running?

A fair question that used to be surprisingly hard to answer, because release builds reported either an empty revision or a meaningless 0.1.0.

kyclient --version now exists and prints the real build. The revision line in the startup log is no longer blank. And on Windows the tray menu shows the build at the top, above Restart and Stop.

The tray also stopped overstating things. It used to flip to "connected" the moment a client logged in over HTTP, and stayed there if that client never managed to start streaming; it now waits for an actual session. The tray icon is the new Kyber mark, as is the desktop client's own icon in your dock and taskbar.

A new capture and encode engine enabling future improvements

Kyber's capture and encoding has been built on txproto. 0.28 ships a second engine built directly on FFmpeg, compiled into the same binary, and lets you pick at runtime with backend = "libavconv" in kyber_config.toml .

txproto stays the default and the fallback. The new engine already covers screen capture, audio, watermarking, bitrate and keyframe control and RTP on Windows and Linux; it is not available on macOS. Treat it as a preview — the whole point of shipping both is that a problem with the new one is a configuration change away from being worked around, rather than a redeployment.

Small things that add up

encoder in kyber_config.toml is now optional. Leave it out and Kyber picks a sensible hardware encoder for the platform: VideoToolbox on a Mac, NVENC elsewhere. Previously a missing `encoder` line stopped the capture server from starting at all, which made hand-trimmed configuration files a trap.

The web client's Download logs button now gives you a complete metrics file at any point during a live session. The browser was only physically writing that file when the stream closed, so downloading mid-session handed you something truncated and you had to disconnect to get your data. Metrics are batched now rather than written one at a time, so a session generating thousands of samples a second stops dropping them on the floor.

If you use the gopstream video transport, Kyber turns intra-refresh off for you when you select it. The two are mutually exclusive — intra-refresh removes the periodic keyframes gopstream relies on to mark boundaries — and the combination used to silently collapse gopstream back to plain reliable behaviour while still paying its overhead. Together with a header fix in the same release, gopstream does what it says for the first time.

Logs moved

This one is worth reading even if you skip the rest.

Every Kyber component used to write its log next to its own executable. They now go where each operating system expects them:

  • Windows services: %ProgramData%\Kyber\logs
  • Windows desktop client: %LOCALAPPDATA%\Kyber\logs
  • macOS: ~/Library/Logs/Kyber , so Console.app finds them
  • Linux: ~/.local/state/kyber/logs

If you have a support runbook, a log collection script or a monitoring rule pointed at the old location, it will now quietly find nothing. KYBER_LOG_DIR still overrides all of this.

In exchange, verbosity is finally adjustable without a rebuild. There is a --log-level flag, a KYBER_LOG_LEVEL variable, and log_level keys in kyber_config.toml — including per component, so you can turn one noisy part of the stack up to trace without drowning in everything else. KYBER_VLC_VERBOSE works properly now too; it used to switch on the log channel without ever telling VLC to actually talk.

One thing that has not changed: log files still grow without limit. Rotation is not in this release.

Reliability fixes

kyclient : Several ways the desktop client could fall over are gone. It no longer panics when its runtime is dropped at the wrong moment, no longer aborts on an out-of-range value reported by the server, no longer discards important events such as Connected when an internal queue fills up, and no longer leaks a metrics task that kept emitting stale numbers every five seconds after you had disconnected.

kymedia : On Wayland hosts, display geometry is discovered properly rather than guessed. On Windows, the remote cursor's side channel retries its connection instead of giving up on the first attempt — a startup race could previously cost you the hardware cursor for an entire session. On Linux DRM/KMS capture, a graphics card that fails to initialise is reported once per device instead of on every poll, which stops multi-GPU hosts filling their logs with the same line thousands of times over.

kymux : Send and receive operations in the transport layer are cancel-safe now, so a connection torn down mid-write cannot leave a half-written packet behind. An unrecognised message no longer kills the connection. And reassembling video or audio that arrived split across several UDP packets allocates once at the right size instead of growing a buffer repeatedly.

kynput : Passing a null pointer to the C API is a no-op instead of undefined behaviour, closing two real crash paths.

Notes for integrators and administrators

Two changes need action if they apply to you.

If you embed Kyber through its C API, this is a breaking release. Type names are now generated with a consistent prefix, which renames a handful of them:

  • Positionkynput_Position
  • Sizekynput_Size
  • UnicodeInput ` → kynput_UnicodeInput
  • VideoLayoutkynput_VideoLayout
  • kyclient_metrics_cbkyclient_MetricsCb
  • kyclient_metrics_json_producerkyclient_MetricsJsonProducer
  • kyclient_metrics_jsonkyclient_MetricsJson

kyclient_event_get_type also takes a reference now. Nothing else in the headers changed, so this should be a mechanical rename pass.

On Linux hosts, if your ` [kyavserver] ` section has no ` grab_backend ` line, 0.28 settles on ` nvfbc ` where 0.27 left the choice open. Non-NVIDIA hosts should now set it explicitly — ` drm `, ` xcb ` or ` wlroots `. The setting itself has not been renamed.

The macOS download file names have changed as well, and there is a new server download alongside the client one, so anything scripted against the old names is worth a look.

Upgrade

Kyber 0.28 is available now.

Head to the downloads page to get the latest version, or pull the updated packages through your usual channel.

Feedback and bug reports are welcome on our discord .

Related Content