Changelog
1.4.41 - 2026-05-18
- Built a new Windows package from the current viewer/server working tree.
- Updated version metadata to 1.4.41.
1.4.39 - 2026-05-18
- Changed Auto encoding negotiation to prefer desktop-safe encodings first:
Tight (7) -> ZRLE (16) -> Zlib (6) -> Hextile (5), withTRLE (15)andJPEG (21)kept only as compressed compatibility fallbacks before Raw. - Fixed standalone
JPEG (21)rectangles for RealVNC by emitting the JPEG/JFIF stream directly. The payload now starts with theFF D8SOI marker instead of a 4-byte length prefix, preventingNot a JPEG file: starts with 0x00 0x06disconnects. - Updated Display Settings copy to make
Tightthe best default,ZRLEthe preferred lossless desktop fallback, andJPEGan explicit lossy photo/video mode. - Bumped desktop app and release metadata to 1.4.39.
1.4.38 - 2026-05-18
- Removed ZRLE2 and JRLE from the Default Encoding dropdown. The server cannot emit those formats (RealVNC's wire format is proprietary), so listing them as user-selectable options was dishonest. They still appear in clients' SetEncodings lists - we simply ignore them and pick the best standard compressed encoding the client also advertised.
- Reordered Auto negotiation from most compressed to least compressed:
Tight (7) -> JPEG (21) -> ZRLE (16) -> Zlib (6) -> TRLE (15) -> Hextile (5) -> Raw (0). Auto walks every supported compressed encoding the viewer advertised before falling back to Raw. - Raw is now a true last-resort fallback (used only when the viewer advertised no compressed encoding we can speak), not a refused option. RFC 6143 mandates every viewer support Raw, so this keeps even unusual viewer configurations (for example RealVNC Viewer with PreferredEncoding=ZRLE2 and no other standard encodings offered) connected.
- The server logs a clear WARN line when it falls back to Raw, including the client's offered encoding list and the recommendation to set PreferredEncoding=ZRLE in the viewer for a compressed stream.
- Bumped desktop app and release metadata to 1.4.38.
1.4.37 - 2026-05-18
- Added support for additional RFC 6143 compressed encodings to match the full RealVNC Viewer encoding list:
Zlib (6)- historic zlib-compressed raw pixel stream.TRLE (15)- Tiled Run-Length Encoding (ZRLE without the per-connection zlib wrapper).JPEG (21)- one JPEG blob per rectangle (lossy; best for photos / video).
- Updated the Display Settings dropdown to expose every encoding the server can negotiate: Auto, Tight, ZRLE, ZRLE2, TRLE, Hextile, Zlib, JPEG, JRLE, Raw.
- The RealVNC-only encodings
ZRLE2 (24)andJRLE (22)have undocumented proprietary wire formats; selecting them in the UI now transparently routes toZRLEandJPEGrespectively, so RealVNC Viewer always gets a compressed stream it can decode regardless of the operator's preference. - Fixed a latent infinite loop in the per-connection zlib flush path that could stall encoding under pathological input sizes; the new shared
compress_with_sync_flushhelper issues exactly oneFlushCompress::Syncper rectangle. - Bumped desktop app and release metadata to 1.4.37.
1.4.36 - 2026-05-18
- Finite fix for RealVNC Viewer reporting
Last-used encoding: Raw. The previous release advertised support for RealVNC's proprietaryZRLE2(encoding 24) and emitted standard ZRLE bytes under the ZRLE2 rectangle type, which RealVNC Viewer cannot decode; the decoder failure caused the viewer to fall back to Raw on its side. - Removed
Encoder::ZRLE2andEncodingType::ZRLE2from the server. The server now only ever advertises and emits RFC 6143 standard encodings: Tight (7), ZRLE (16), Hextile (5). - Negotiation: Auto now picks Tight when offered (RealVNC Viewer always offers it), then ZRLE, then Hextile. Raw is refused both as an explicit preference and as a silent fallback. A client that only offers Raw (or only ZRLE2+Raw) is refused at the protocol layer instead of being silently downgraded.
- Session dashboard now displays the encoding name (for example
Tight) instead of the numeric encoding id. Sessions showNegotiatinguntil the client has sentSetEncodings. - Added a WARN-level log line that prints the full list of encodings each client advertised, so a packet capture is no longer needed to diagnose negotiation failures.
- Bumped desktop app and release metadata to 1.4.36
1.4.35 - 2026-05-18
- Added explicit IANA/RealVNC ZRLE2 encoding support (
24) so RealVNC Viewer can negotiate ZRLE2 instead of falling back to Raw. - Auto negotiation now prefers Tight, ZRLE2, ZRLE, then Hextile, while still refusing Raw-only framebuffer streams.
- Updated session display state to start as
Negotiatinginstead of misleadingly showing Raw before encoding negotiation completes. - Bumped desktop app and release metadata to 1.4.35
1.4.34 - 2026-05-18
- Disabled Raw framebuffer fallback for interactive VNC sessions. Auto negotiation now requires a compressed client-supported encoding: Tight, ZRLE, or Hextile.
- Fixed RealVNC compatibility handling so proprietary ZRLE2 advertisements no longer force tiled Raw; the server ignores unsupported ZRLE2 and uses the best standard compressed encoding the client also advertised.
- Refuses Raw-only clients instead of silently sending uncompressed multi-megabyte macOS framebuffer payloads.
- Added encoder negotiation tests for compressed preference order, Raw refusal, Raw preference rejection, and RealVNC ZRLE2 behavior.
- Bumped desktop app and release metadata to 1.4.34
1.4.33 - 2026-05-18
- Bumped desktop app and release metadata to 1.4.33
1.4.32 - 2026-05-18
- Replaced the in-stream overlay's 8x8 pixel-art bitmap font with proper TrueType rasterization (Roboto Regular, embedded) using ab_glyph. Sub-pixel coverage and crisp anti-aliased glyphs at every scale, so the menu title, "SELECT WHAT TO STREAM", "22 APPS", "LIVE", thumbnail labels, and badge counts all render at native resolution instead of looking like blocky upscaled pixel art.
- Replaced nearest-neighbor scaling of the embedded 512x512 Kinect app icon (used on the FAB and in the menu header) with Lanczos3 high-quality downsampling, cached per output size so each FAB/header dimension is resampled once. The K logo now looks like a real high-resolution icon instead of a pixelated 1990s GIF.
- Added a font-aware
measure_text_aa_widthhelper and used it for FAB count badge centering, header "X APPS" pill width, and "LIVE" pill width so text now sits visually centered/contained in the new glyph metrics. - Removed the now-unused 8x8 bitmap font code path (
font8x8dependency,draw_char_aa,sample_glyph,glyph_bit,glyph_bounds_x,glyph_advance). - Bumped desktop app and release metadata to 1.4.32
1.4.31 - 2026-05-18
- Doubled the in-stream window selector button size for better readability on standard monitors
- Bumped desktop app and release metadata to 1.4.31
1.4.30 - 2026-05-18
- Eliminated stuck modifier keys in the viewer using the noVNC/Guacamole-recommended approach: every keyboard and mouse event now reconciles tracked-modifier state against the browser-reported
getModifierState. When the browser drops a Shift/Ctrl/Alt/Meta keyup (a well-known issue on system shortcuts like Cmd+Tab, Cmd+Space, Cmd+Shift+4, Print Screen), the next user event automatically releases the stale modifier on the remote. - Switched the viewer to document-level capture-phase key listeners so events route consistently regardless of focus, with a per-canvas active flag to gate when to forward them. Eliminates duplicate releases that the previous React + DOM dual handlers produced.
- Added the macOS Cmd-held quirk fix: when Cmd is held, the browser does not deliver keyup for the non-Cmd key, so the viewer now synthesizes an immediate release per noVNC and Apache Guacamole.
- Added the Windows Shift quirk fix: when one Shift is released while the other is held, the suppressed keyup is detected via getModifierState and both sides released.
- Bumped desktop app and release metadata to 1.4.30.
1.4.29 - 2026-05-17
- Fixed stuck keys on macOS server release events: modifier flags on key-up are now derived from the live modifier state instead of the press-time snapshot, so the OS sees consistent state and doesn't latch keys when modifiers are released in a different order than they were pressed
- Bumped desktop app and release metadata to 1.4.29
1.4.28 - 2026-05-17
- Overhauled keyboard handling for full macOS server compatibility
- Replaced static keysym table with layout-aware UCKeyTranslate dictionaries built from the active keyboard layout (matches libvncserver mac.c reference); chords like Shift+1, Cmd+C, Ctrl+T now produce the correct character on QWERTY, AZERTY, Dvorak, German and other layouts
- Switched server to a private CGEventSource and the session event tap to stop modifier keys from getting stuck on the OS side
- Server now records the (keycode, flags) used to press each keysym and replays the exact same parameters on release, so chords released in any order (e.g. Shift first, then 1) no longer leave keys stuck
- Viewer now ignores browser key-repeat events (the controlled OS does its own auto-repeat), tracks pressed keys by physical code instead of keysym, and releases all held keys on blur, tab hide, and unmount
- Bumped desktop app and release metadata to 1.4.28
1.4.27 - 2026-05-17
- Switched macOS server cursor capture to NSCursor (AppKit) so the viewer receives the real OS cursor image with the correct hotspot for arrow, I-beam, hand, resize, busy spinner, etc.
- Removed all framebuffer cursor compositing; the cursor is now delivered exclusively via the standard RFB Cursor pseudo-encoding (rectangle x/y = hotspot, payload = pixels + transparency mask) per RFC 6143
- Bumped desktop app and release metadata to 1.4.27
1.4.26 - 2026-05-17
- Tripled the size of the in-stream window selector button so it remains readable on standard monitors while still staying out of the way
- Bumped desktop app and release metadata to 1.4.26
1.4.25 - 2026-05-17
- Removed the synthetic fallback cursor on macOS so the viewer only ever displays the real OS system cursor; if the cursor cannot be captured no cursor is shown
- Bumped desktop app and release metadata to 1.4.25
1.4.24 - 2026-05-17
- Restored macOS system cursor visibility on Intel and Apple Silicon by dynamically loading CGDisplayCopyCursorImage and falling back to a synthetic arrow when unavailable
- Fixed held modifier keys (Shift, Ctrl, Alt, Cmd) on macOS servers by posting CGEvents with proper modifier flags instead of relying on enigo's modifier state
- Bumped desktop app and release metadata to 1.4.24
1.4.23 - 2026-05-17
- Fixed held Shift/Ctrl/Alt/Meta keyboard behavior in first-party viewer sessions
- Preserved physical key press/release events for modifier chords while keeping normal text input reliable
- Bumped desktop app and release metadata to 1.4.23
1.4.22 - 2026-05-17
- Reduced the in-stream window selection button to 10% of its previous size
- Hid the local viewer cursor so the captured remote OS cursor is visible during sessions
- Bumped desktop app and release metadata to 1.4.22
1.4.21 - 2026-05-17
- Tightened RealVNC macOS compatibility by forcing tiled Raw updates and disabling cursor pseudo-rects in the ZRLE2 compatibility path
- Included latest viewer address book and server configuration updates
- Bumped desktop app and release metadata to 1.4.21
1.4.20 - 2026-05-17
- Hardened RealVNC macOS compatibility by resetting framebuffer state on format changes and suppressing side-channel text messages during the compatibility path
- Bumped desktop app and release metadata to 1.4.20
1.4.19 - 2026-05-17
- Fixed RealVNC reconnect loops against macOS servers by avoiding problematic Hextile fallback framing
- Bumped desktop app and release metadata to 1.4.19
1.4.18 - 2026-05-17
- Website scaffolding and branded marketing surface
- Window Sharing landing page
- Security and compatibility content
- Docs, blog, and changelog pipeline