All notable changes to InputSync are documented in this file.
Format follows Keep a Changelog. Versions follow Semantic Versioning.
Startup panic: Unable to install global subscriber: SetLoggerError(())
- The app crashed immediately on launch with a panic from
tracing-subscriber. - Root cause:
egui_logger::builder().init()andtracing_subscriber::fmt().init()both attempt to install the global log backend. Only one can win — the second call panics unconditionally (no.ok()guard). - Fix: removed
tracing_subscriber::fmt().init()entirely. Enabled thelogfeature on thetracingcrate so alltracing::info!()/warn!()etc. calls automatically bridge to thelogcrate, whichegui_loggercaptures for display in the Logs tab. No separate subscriber is needed. - Removed
tracing-subscriberdependency (was only used for the conflicting init).
Linux — .deb install fails with file conflict against old input-sync package:
- Installing
inputsync_1.1.1_amd64.debon a machine that previously had the old Tauri-basedinput-syncpackage would fail: dpkg refused to overwrite shared icon files (/usr/share/icons/hicolor/*/apps/inputsync.png) owned byinput-sync. - Added
Conflicts: input-syncandReplaces: input-syncto the package metadata. dpkg now automatically removes the old package when installing InputSync 1.1.1+. - The "Broken pipe / lzma write error" was a side-effect of dpkg aborting mid-extract on the conflict — resolved by the same fix.
Linux — "Illegal instruction (core dumped)" on non-AVX2 CPUs:
- Binary was compiled with
target-cpu=native(AVX2/AVX512 instructions) and cached dependency objects were reused even after changing the CPU target. Fullcargo cleanplus-C target-feature=-avx,-avx2,-avx512fensures the binary runs on any x86_64 CPU, not just Haswell-era and newer.
Architecture — Full migration from Tauri/WebView2/React to pure Rust + egui:
- Replaced the entire Tauri + React frontend with a native egui (eframe 0.31 + glow) UI — no browser engine, no WebView2, no Node.js required at build or runtime
- Single portable native binary (~9 MB stripped) replaces the .deb/.exe installer package
- Windows no longer requires WebView2 Runtime — completely self-contained executable
- Screen edge switching — moving the cursor to any configured screen edge automatically forwards control to the connected client
- Dead corners — configurable corner regions that block edge triggers to prevent accidental switching
- Dead zones — configurable rectangular screen regions that suppress edge activation
- Optional TLS transport — self-signed TOFU certificate via
rcgen+rustls+tokio-rustls; layered on top of the existing ChaCha20 session encryption - Settings persistence — all configuration saved to
~/.local/share/inputsync/config.jsonvia serde_json - In-app log viewer — real-time log output in the Logs tab via
egui_logger - Mini screen-map widget — clickable Painter-based widget in Settings for configuring edge targets
- Tabs: Main | Settings | Logs
- Server restart after stop —
Start Servernow auto-stops any running server; no stale state - Stopped TCP listener now releases port immediately on shutdown
Windows/Linux — Server restart (os error 98 "Address already in use"):
- Stopping and restarting the server showed "Address already in use" error — the TCP accept loop held port 24800 open indefinitely because the shutdown signal was never delivered (the oneshot receiver was immediately dropped). Replaced the broken oneshot with a
CancellationToken; the TCP loop now exits and drops theTcpListenerthe instantStop Serveris clicked, releasing the port immediately. Start Servernow auto-stops any previously running server instead of returning "Server already running" — clicking Start Server always works even if a prior session wasn't explicitly stopped.
Windows — WebView2 required even on stripped Windows (Windows Lite, etc.):
- The app required WebView2 to be pre-installed or downloaded from the internet, breaking on lightweight/locked-down Windows installations. Switched NSIS installer to
offlineInstallermode — the full WebView2 runtime is now bundled inside the.exeinstaller (~150 MB total). No internet connection, no Microsoft services, and no manual WebView2 installation required.
Windows:
- Installer appeared frozen during WebView2 download — NSIS hook now detects whether WebView2 is present. If missing, shows a dialog before the download begins: "The installer is NOT frozen — please wait." If already installed (most Windows 10/11), skips silently.
- App silently failed to open when WebView2 was missing or damaged — replaced the silent panic with a native Windows MessageBoxW error dialog with exact fix steps and a download link.
Linux (Wayland/Hyprland):
- App showed no UI on Wayland compositors (Hyprland, etc.) — .desktop entry now launches with
GDK_BACKEND=x11 WEBKIT_DISABLE_DMABUF_RENDERER=1to force XWayland. - Tray icon caused a startup panic — icons regenerated as 8-bit RGBA (were 16-bit, causing
ImageBufferSizemismatch in the tray icon loader).
- X25519 ECDH key exchange with HKDF-SHA256 session key derivation
- ChaCha20-Poly1305 authenticated encryption on all input events
- 6-character alphanumeric session code pairing system
- TCP control channel (port 24800) for handshake and session management
- UDP event channel (ports 24801/24802) for low-latency input forwarding
- Cross-platform input capture via
rdev(Linux X11, Windows) - Cross-platform input simulation via
enigo(Linux X11, Windows) - Mouse, keyboard, and scroll wheel event forwarding
- Relative mouse movement (resolution-independent across screens)
- ScrollLock hotkey to toggle input forwarding without touching the UI
- Bounded input event channel with backpressure (drops stale packets)
- Counter-window UDP resync (up to 64 packets ahead on packet loss)
- Dedicated OS thread for input simulation (enigo compatibility)
- Pixel-art CRT terminal logo with blinking cursor SVG animation
- Dark theme React UI: Server panel, Client connect panel, Status bar
- Session code copy-to-clipboard button
- Linux
.debpackage (Ubuntu/Debian) - Windows NSIS installer (
.exe) via GitHub Actions CI - GitHub Actions workflow: builds Linux + Windows on every tagged release
- All keyboard and mouse events encrypted before leaving the network adapter
- Nonces are XOR-combined from both server and client contributions
- Forward-only counter window prevents replay of captured packets
- Session codes are single-use per server start
- Clipboard sync across machines
- Linux Wayland support (libei)
- mDNS/Bonjour server auto-discovery
- Configurable switch hotkey (not hardcoded ScrollLock)
- Ping/pong latency measurement display
- Code signing for Windows SmartScreen bypass
- RPM and Arch (AUR) packages
- Multi-monitor layout configuration
- macOS support
- Multi-client support with named client slots