v1.7 shipped POST /key as attempt-first, honest mode: real OS-level events when possible (isTrusted: true), automatic fallback to the in-page synthetic dispatch, and the response always reports which mode ran. The README links here for where each platform stands.
Status per platform
- Windows (wry / WebView2) — verified end-to-end.
SendInput + SetForegroundWindow, targeting the WebView2 child HWND via EnumChildWindows. Native events land in the page; this is the reference implementation.
- Linux (wry / WebKitGTK) — implemented, X11 sessions.
x11rb XTEST fake_input with keycode resolution from the live keymap. The ghost window is brought on-screen first (X11 refuses focus to unviewable windows), and deliberately no gtk::main_iteration() runs on the HTTP thread (GTK is main-thread-only; pumping from a worker deadlocked the loop — that was CI exit 52). Headless CI has no focus target → falls back cleanly.
- macOS — parked, deliberately. CGEvents can be posted, but routing them into a headless WKWebView reliably needs an app-bundle activation story the Window Server only grants to real foreground apps; the experimental on-screen approach (git history) still left
document.hasFocus() == 0. Until that's solved, macOS reports "native unavailable" and falls back to synthetic.
Open work
v1.7 shipped
POST /keyas attempt-first, honest mode: real OS-level events when possible (isTrusted: true), automatic fallback to the in-page synthetic dispatch, and the response always reports whichmoderan. The README links here for where each platform stands.Status per platform
SendInput+SetForegroundWindow, targeting the WebView2 child HWND viaEnumChildWindows. Native events land in the page; this is the reference implementation.x11rbXTESTfake_inputwith keycode resolution from the live keymap. The ghost window is brought on-screen first (X11 refuses focus to unviewable windows), and deliberately nogtk::main_iteration()runs on the HTTP thread (GTK is main-thread-only; pumping from a worker deadlocked the loop — that was CI exit 52). Headless CI has no focus target → falls back cleanly.document.hasFocus() == 0. Until that's solved, macOS reports "native unavailable" and falls back to synthetic.Open work
session_show-assisted native typing on the visible window)x11_keysymtable; special keys/modifiers on all three paths