v1.11.1

Ghost
Mon, 30 Mar 2026 13:19:40 +0000

Root cause: RDP was unresponsive due to frame pipeline bottleneck.

get_frame() held tokio::Mutex while cloning 8.3MB, blocking the
RDP session thread from writing new frames (mutex contention)

Frontend fetched on every backend event with no coalescing

Every GraphicsUpdate emitted an IPC event, flooding the frontend

Fix:

Double-buffer: back_buffer (tokio::Mutex, write path) and
front_buffer (std::sync::RwLock, read path) — reads never block writes

get_frame() now synchronous, reads from front_buffer via RwLock

Backend throttles frame events to every other GraphicsUpdate

Frontend coalesces events via requestAnimationFrame

RdpView props now reactive (computed) for correct resize behavior

rdp_get_frame command no longer async (no .await needed)

screenshot_png_base64 no longer async

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com