Releases: MikeInNs/GhostInput
Release list
v0.1.109-preview
This preview adds mapped Virtual Keyboards, Windows speaker-volume support for
Audio Relay, and a broad set of Client and Studio reliability improvements.
Highlights
Virtual Keyboards
- Added configurable Virtual Keyboard devices to Device Routing. Physical
controller buttons, hats, and axes can produce held keys or chords, key taps,
repeat-while-held actions, threshold and detent actions, and short bounded
macros. - Added a visual key and modifier picker, dedicated mapping editor, validation,
and keyboard Live Preview so mappings can be configured without typing HID
key names or guessing their resulting state. - Virtual Keyboards can be routed as their own USB keyboard, use the Client's
Bluetooth LE keyboard, or join a grouped USB HID device to conserve a Client
USB gadget lane. - Multiple active mappings are merged into one bounded boot-keyboard state with
eight modifiers and six ordinary key slots. Released mappings cannot
accidentally release keys that remain held by another mapping.
Audio Relay volume
- Windows speaker volume and mute changes on the Client USB audio device now
control the relayed speaker/headphone stream. - Volume is applied to captured PCM before Opus encoding, keeping the Host
playback path and realtime network format unchanged. - Clarified the difference between Audio Relay's network-jitter preset and the
Host speaker output buffer so each setting describes the part of playback it
actually controls.
Client reliability and efficiency
- Client output runtime now starts before Windows USB enumeration, preventing
the initial gadget state from blocking profile startup when an endpoint is
not yet writable. - Added stable per-Client USB gadget serial numbers. A Client retains its
Windows-facing USB identity across profile changes and updates instead of
deriving it from transient route details. - Optimized mapped joystick and route lookup paths to reduce repeated work on
the Pi Zero 2 W while preserving ordered button and hat transitions. - Bounded the Client control API's concurrent connections, request headers,
request bodies, and deadlines so stalled or malformed callers cannot consume
resources without limit. - Hardened Client-to-Host control requests with partial-write handling, bounded
responses, strict HTTP validation, and one absolute connect/send/receive
deadline.
Studio and documentation
- Split the largest Studio views and view models into focused components and
reusable commands while preserving the existing workflows and theme styling. - Hardened Virtual Joystick mapping validation and improved provisioning
guidance. - Updated SSH.NET to the patched 2026.0.0 release used by Studio provisioning.
- Added a user-focused FAQ
covering roles, routing, grouping, networking, audio, security, upgrades, and
recovery.
Upgrade notes
Update Studio and its bundled Host and Client payloads together. Virtual
Keyboard mappings and the Client runtime changes require the current Studio and
Client versions.
Reprovisioning is not required. Use the normal Update action for each Pi.
Existing routes, Bluetooth bonds, Audio Relay settings, security identity, and
other device configuration are preserved.
After the Client update, Windows may refresh its USB device information the
first time the gadget reconnects. The new stable Client serial is then reused
across subsequent route and profile changes.
GhostInput control APIs use HTTP and realtime traffic uses UDP without
encryption. Run GhostInput on a private network you trust and do not expose its
ports directly to the internet.
Full changelog
v0.1.108-preview
This preview improves Host-to-Client input pacing, makes discovery resilient to
live network-interface changes, and fixes Audio Relay replay when a Host uses
more than one network interface.
Highlights
Input pacing and diagnostics
- Host joystick, keyboard, and mouse reports now share one Input send
interval. Fresh configurations use a conservative 10 ms default, while
lower intervals remain available for networks and devices that can sustain
them reliably. - Studio's Host-to-Client pacing recommendation now uses a dedicated native
Client receiver that exercises the production UDP drain, session validation,
InputReportBatchdecoder, and in-memory state-application path. - The recommendation starts at 4 ms and screens progressively higher intervals.
Each stable short trial is confirmed at the same interval for 60 seconds; a
failed confirmation advances to the next candidate instead of allowing the
normal 10 ms default to influence the result. - Stability checks now include packet loss and burst size, ordering, kernel
drops, Client drain saturation, arrival timing, sender timing, and pacing
overruns. Studio shows these measurements with each trial so the recommended
interval can be understood and reproduced. - Host pacing lateness telemetry now measures pending work from the point at
which it becomes eligible to send, avoiding misleading lateness caused by
reports that arrived after an earlier pacing boundary.
Network-interface recovery
- Host and Client discovery responders now join the GhostInput multicast group
on every active IPv4 interface and refresh their memberships while running.
Adding Ethernet or disabling Wi-Fi no longer strands discovery on the
interface that happened to be active when the service started. - Multicast membership follows interfaces as they appear and disappear, so
Studio can rediscover a wired Host without requiring a reboot or service
restart. - Audio Relay selective replay now supports multihomed Hosts. Replay requests
remain authenticated by their negotiated UDP port and active audio session
even when Linux routes the Host's response through a different local address.
This keeps deadline-aware retransmission working after moving a Host from
Wi-Fi to Ethernet.
Network guidance and test tools
- Added focused HID UDP sender and receiver tools for measuring pacing, packet
gaps, ordering, and arrival intervals independently of the GhostInput
services and USB gadget output. - Expanded hardware and troubleshooting guidance for the Pi Zero 2 W's 2.4 GHz
Wi-Fi. A 100% signal reading does not measure interference, airtime
congestion, retransmissions, packet loss, or short latency spikes. - The documentation now recommends Ethernet for the Host where possible and a
capable modern 2.4 GHz router or access point for the Client. A separate wired
access point and a clean 20 MHz channel can materially improve realtime HID
and audio delivery.
Upgrade notes
Update Studio and its bundled Host and Client payloads together. The improved
pacing recommendation requires the current Client benchmark receiver, and the
network-interface fixes are part of the updated native services.
Reprovisioning is not required. Use the normal Update action for each Pi.
Existing routes, Bluetooth bonds, Audio Relay settings, and other device
configuration are preserved.
The 10 ms input interval is the conservative default for fresh configurations;
it is not a floor imposed by the pacing recommendation. Run Studio's pacing
test on the actual Host-to-Client path before selecting a lower value. Wired
Host configurations and clean wireless Client links may sustain substantially
lower intervals.
GhostInput control APIs use HTTP and realtime traffic uses UDP without
encryption. Run GhostInput on a private network you trust and do not expose its
ports directly to the internet.
Full changelog
v0.1.107-preview
This preview makes Audio Relay substantially more resilient on Wi-Fi, adds
configurable UDP prioritization and HID activity feedback, and tightens device
updates, provisioning, discovery, and diagnostics.
Highlights
Deadline-aware Audio Relay recovery
- Speaker audio now uses bounded selective replay alongside Opus FEC and packet
loss concealment. The Client caches the latest 16 encoded frames, allowing the
Host to request a missing frame while it can still meet the playback deadline. - Replay never holds newer audio behind stale data. Requests are bounded,
duplicate work is coalesced, live audio remains higher priority, and late
recovery automatically falls back to Opus FEC or concealment. - Studio now reports replay requests, requested and recovered frames, and
failures with the existing Audio Relay telemetry. - Improved Client capture pacing eliminates an unnecessary busy loop and
significantly reduces Client CPU use during Audio Relay. - Refined Host jitter-buffer, ALSA playback, underrun recovery, drift control,
and stale-audio trimming. The recommended Wi-Fi defaults now use a 120 ms
balanced buffer, Opus in-band FEC, and directhw:ALSA endpoints where the
selected device supports them. - Detailed replay and packet timing messages remain behind the audio debug
flags, while meaningful recovery events remain available in the service log.
Network and realtime traffic
- Added Disabled, Balanced, and Wireless PCVR UDP priority modes to
the device Network page. Balanced is the default and marks latency-sensitive
traffic without aggressively competing with other realtime applications. - Added runtime QoS diagnostics so the applied socket priority can be verified
from device status and troubleshooting information. - Wi-Fi network discovery is now an explicit action instead of running during
ordinary status refreshes. The dedicated scan button shows progress without
moving the page or interrupting realtime traffic unnecessarily. - Provisioning disables Wi-Fi power saving and disruptive automatic background
scanning on both Hosts and Clients while retaining manual Wi-Fi discovery. - HID and audio workers retain elevated scheduling priority, while API and
discovery work run at normal priority.
HID responsiveness and diagnostics
- Added an optional HID activity LED for both Host transmission and Client
reception. It covers keyboard, mouse, joystick, and other input batches with
negligible work in the realtime path. - Relative mouse and joystick state handling avoids stale queued motion while
preserving button transitions and the latest axis state. - Prevented paced joystick snapshot failures from entering a tight retry and
journal-spam loop when a downstream Client becomes unavailable. - Live Preview now treats stream startup as synchronization rather than counting
pre-snapshot reports as ignored input. Its rate, ordering, and latency counters
begin from the first complete snapshot. - Host communication status now reports recent send activity instead of showing
Waiting for an otherwise active output stream.
Provisioning, Bluetooth, and Studio reliability
- Same-role provisioning preserves existing Bluetooth bonds. Replacing a Host
with a Client, or a Client with a Host, clearly warns that pairings from the
previous Bluetooth role will be removed. - Client app updates no longer restart the GhostInput BLE HID backend when its
helper and systemd unit are unchanged. This preserves active Windows BLE HID
connections during ordinary updates instead of briefly removing and
re-registering the GATT service. - The clean-configuration option continues to reset GhostInput routes and
runtime settings without removing same-role Bluetooth pairings. - Device Routing refreshes Host device inventory while the page is open, so
connected or removed USB and Bluetooth devices resolve without service
restarts or a separate event-listener subsystem. - Improved stale device detection, provisioning progress, warning contrast,
password clearing, and route correction behavior throughout Studio.
Upgrade notes
Update Studio and its bundled Host and Client payloads together. This release
continues to require the compact realtime protocol introduced in
v0.1.106-preview; older mixed-version peers are not supported.
Reprovisioning is not required for an existing installation. Use the normal
Update action for each Pi so it receives the current runtime, network
defaults, Audio Relay recovery, and service-management behavior.
Bluetooth bonds are preserved by same-role provisioning and app updates. A
Host/Client role replacement intentionally clears the previous role's bonds.
If a release genuinely changes the BLE HID helper or service definition, that
backend must restart to load the new version; the stored Windows bond remains
intact and should reconnect normally.
GhostInput control APIs use HTTP and realtime traffic uses UDP without
encryption. Run GhostInput on a private network you trust and do not expose its
ports directly to the internet.
Full changelog
v0.1.106-preview
This preview adds a lightweight security layer for trusted private networks,
reduces realtime packet overhead, standardizes Audio Relay on Opus, and includes
a broad set of provisioning, routing, Bluetooth, and Studio reliability
improvements.
Highlights
Lightweight control security
- Studio now creates a shared GhostInput installation identity while
provisioning and stores it in Windows Credential Manager. - Provisioned Hosts and Clients require challenge-response authentication for
management actions and stream-start requests. Studio and Clients authenticate
and renew short-lived access tokens automatically. - Reinstalling Studio on a new PC can recover the existing installation
identity from a provisioned Pi through the authenticated SSH provisioning
workflow. - Basic discovery endpoints remain available so Studio can find devices before
authenticating. - Authentication protects the control plane without adding encryption, larger
headers, or cryptographic work to latency-sensitive HID and audio packets.
GhostInput still belongs on a trusted private network and should not be
exposed directly to the internet.
Smaller and more responsive realtime streams
- Introduced the compact realtime protocol v2 for HID and audio traffic. Normal
packets use a 9-byte header, with timestamps included only when Studio Live
Preview requests latency measurements. - Audio settings are negotiated once when a stream starts rather than repeated
in every datagram, and the realtime control channel now uses a fixed compact
packet format. - Removed protocol fallback behavior: Hosts, Clients, and Studio explicitly
negotiate v2 and reject incompatible peers instead of silently mixing wire
formats. - Relative mouse movement is coalesced while preserving button ordering and
total movement, reducing stale movement queues and improving responsiveness
under backpressure. - Improved input batching and reporting terminology so expected state
coalescing is distinguished from harmful output drops. - HID and audio workers now run at elevated priority while discovery and API
work remain at normal priority.
Opus Audio Relay
- Audio Relay now uses a single Opus-based path for speaker/headphone and
microphone streaming. - Opus format details are negotiated when the stream starts, while packet-loss
concealment and optional in-band FEC provide recovery for transient network
loss. - Improved relay replacement handling so enabling, disabling, or changing an
Audio Relay request updates the Host runtime and telemetry without requiring
an additional Client service restart. - Improved jitter-buffer, playback, and stream-health reporting in Studio.
Provisioning and runtime reliability
- Provisioning progress automatically follows the newest step unless the user
takes control of the scrollbar. - Device reboot and final discovery refresh now remain part of one visible
progress flow. The progress indicator stays active through Updating Device
Status instead of appearing finished while Studio refreshes inventory. - The SSH password is cleared after every completed provisioning attempt.
- Added an optional Start with a clean GhostInput configuration provisioning
mode for removing existing routes and runtime settings while preserving the
installation identity, networking, hostname, and Bluetooth pairings. - Provisioning and standalone service installation now disable Wi-Fi power
saving by default to reduce wireless latency and packet loss. The setting can
still be changed from the device Network page. - Empty virtual joysticks no longer prevent the Client profile runtime from
starting. - Studio now distinguishes recovered health from historical transient errors
instead of leaving an otherwise healthy stream permanently flagged.
Device discovery and Studio polish
- Device Routing refreshes relevant Host inventories while the page is active,
allowing connected, removed, or newly available devices to resolve routes
without restarting a service. - Known sleeping Bluetooth controllers can remain available for route
selection, while GhostInput Bluetooth peripherals are excluded from Host
pairing results. - Improved offline detection so stale Client and Host details are not presented
as though the device were still connected. - Refreshed warning accents for clearer contrast in both light and dark themes.
- Increased the main window minimum size to prevent dense routing and device
management layouts from becoming unusably compressed. - Studio now displays the installed release notes after completing an in-app
update. - Refreshed the README introduction and supporting documentation for the
current security, protocol, Audio Relay, and provisioning behavior.
Upgrade notes
Realtime protocol v2 is intentionally not backward compatible. Update Studio
and its bundled Host and Client payloads together; older Hosts or Clients must
be updated before they can start streams with this release.
Reprovisioning or updating existing Pis is recommended so they receive the
installation identity, current service scripts, runtime priorities, and Wi-Fi
defaults. Devices without a provisioned identity remain reachable for migration
but do not receive the new control authentication until updated.
GhostInput control APIs continue to use HTTP, and realtime UDP traffic is not
encrypted. Run GhostInput only on a private network you trust and do not expose
its ports directly to the internet.
Full changelog
v0.1.105-preview
This preview focuses on reliable fresh provisioning, a consolidated Client
Bluetooth HID path, stronger Host/Client runtime handoff, and clearer Studio
feedback throughout setup.
Highlights
Consolidated Bluetooth HID support
- Updated Client Bluetooth compatibility for current Raspberry Pi OS images
based on Debian Trixie. Testing after the OS/kernel and BlueZ upgrade exposed
unreliable advertisement registration, discovery, and Windows pairing in the
older mixed Bluetooth implementation. - Replaced that legacy path with a dedicated BlueZ BLE HID-over-GATT service,
including explicit adapter setup, pairing-agent ownership, managed
advertising, and a stable local report handoff from the Client runtime. This
updates the complete integration rather than treating the observed regression
as a kernel-only issue. - Consolidated Client keyboard and mouse output on the standalone BlueZ BLE HID
backend and removed the superseded Bluetooth daemon and legacy helper path. - BlueZ BLE is now the default Client Bluetooth mode. The radio and helper stay
dormant while no Bluetooth route uses them, so an enabled Client reports an
idle state without keeping the Bluetooth runtime active. - Improved BLE advertising, Windows pairing, reconnect behavior, and backend
readiness reporting. - Client provisioning now configures the Bluetooth controller consistently for
the BLE HID path and deploys the required Python, D-Bus, and systemd support. - Host Bluetooth pairing now attempts to connect the device and refreshes the
Host inventory so newly connected controllers can appear under Add Input
Source without a service restart. - Studio now distinguishes Bluetooth disabled, enabled-idle, active, and
genuinely unavailable states more accurately.
Safer and clearer provisioning
- Host and Client provisioning now both schedule and monitor the required
reboot before reporting the device fully online. - Reboot progress is split into clear stages: Reboot scheduled, Device offline,
SSH restored, Service active, and API responding. - Added Stop Waiting, which stops Studio monitoring without cancelling or
damaging the installation already running on the Pi. - Preflight now warns before replacing an existing Host installation with a
Client, or an existing Client installation with a Host. - Provisioning actions are locked after installation begins to prevent duplicate
SSH or bootstrap submissions. - Failure results now include the failed stage, last successful stage, target
address, and a Copy Diagnostics action. - After provisioning, Studio refreshes Client and Host discovery, versions,
device counts, selectors, and About-page inventory automatically. - A newly provisioned Client becomes active automatically when no Client is
selected; otherwise Studio asks whether to switch from the current Client.
Installation and runtime reliability
- Aligned standalone Host installation with Studio provisioning, including
consistent service files, runtime packages, udev access, and service-account
permissions. - Added the Host service account to the required input and audio groups so
Bluetooth controllers and ALSA playback devices work after fresh provisioning. - Hardened Client profile handoff and status refresh after route changes and
service restarts. - Replacement Host stream requests now stop omitted speaker or microphone relay
workers and clear their telemetry, so disabling a relay is reflected
immediately. - Improved Bluetooth route readiness refresh after applying a profile.
Studio and documentation polish
- Renamed the Devices navigation page to Device Routing to make its
purpose clearer alongside Client, Host, and Bluetooth device management. - Updated setup, Bluetooth, provisioning, troubleshooting, and Audio Relay
documentation for the current workflows. - Added Bluetooth headset Audio Relay guidance: BlueALSA normally uses classic
A2DP, which adds latency; larger playback buffers can improve stability at the
cost of additional delay.
Upgrade notes
This release changes Client Bluetooth service layout and provisioning behavior.
Update Studio and its bundled Host/Client payloads together. The supported
Client Bluetooth choices are now Disabled and BlueZ BLE; removed legacy
backends are no longer accepted.
Reapplying the current Host or Client package is recommended for existing Pis so
the updated systemd units, Bluetooth configuration, udev rules, and service
account permissions are installed. Studio provisioning performs and monitors
the required reboot automatically.
Full changelog
v0.1.104-preview
This preview focuses on Studio reliability, clearer device onboarding, safer
configuration workflows, and interface polish.
Highlights
More reliable device discovery and connection
- Fixed Host and Client version information remaining stale after an update
and reconnect. - Update availability and action-button state now refresh after devices return
online. - Manual Host and Client addresses are validated before attempting a
connection. - Failed manual connection attempts now provide immediate feedback and no
longer create unusable entries in the known-device list. - Superseded manual connection attempts are cancelled so an earlier failure
cannot appear after a later connection succeeds. - Studio now distinguishes an empty network from an actual discovery failure.
- Improved first-run guidance when no Hosts or Clients have been discovered.
Safer configuration workflows
- Added unsaved-change protection when navigating away, closing dialogs, or
starting a Studio update. - Added Apply, Discard, and Cancel choices where pending configuration could
otherwise be lost. - Added inline validation and clearer error messages for network addresses and
provisioning credentials. - Added standard keyboard behavior across dialogs, including Enter to confirm
and Escape to close or cancel where appropriate. - Improved empty states and refresh actions in device-selection and Add Device
workflows.
Improved Studio update experience
- Added clear downloading and installing activity indicators to the About
page. - Download and Install actions now use the pending-action color when an update
is available. - Added a confirmation explaining that Studio will exit, install the update,
and restart. - Installation is blocked while unsaved changes remain.
Interface and status polish
- Improved Live Preview button layout for devices with both small and large
button counts, with a maximum of 16 buttons per row. - Added a dismiss action to the USB-lane warning card.
- Reduced false persistent communication warnings from isolated stale or
reordered packets while retaining meaningful health alerts. - Improved loading of selected-device Wi-Fi details on the About page.
- Made inactive Wi-Fi signal bars theme-aware and consolidated their shared
presentation. - Improved action placement, button consistency, informative dialog colors,
and provisioning iconography.
Upgrade notes
This is a Studio-focused update. Host and Client protocol and runtime behavior
are unchanged from v0.1.103-preview, so coordinated device upgrades are not
required for these fixes.
Full changelog
v0.1.103-preview
This preview focuses on lower latency, stronger UDP stream reliability,
reduced runtime overhead, and a more consistent Studio experience.
Highlights
Faster, more resilient input streaming
- Reduced packet encoding, decoding, and HID report copying.
- Improved fairness between joystick, keyboard, and mouse input sources.
- Added time-budgeted UDP burst processing to prevent prolonged receive-loop
stalls. - Preserved button and hat transitions while coalescing replaceable joystick
axis states. - Added bounded Host and Client queues to prevent latency from growing
indefinitely. - Tuned the default 5 ms input pacing for balanced latency and stability.
- Increased the default Client UDP receive buffer to 1 MiB and exposed
kernel-drop diagnostics.
More reliable rumble, force feedback, and device output
- Added redundant downstream HID delivery without applying commands twice.
- Added session, sequence, duplicate, stale-packet, and ordering validation.
- Added retries for temporary physical-device write backpressure.
- Reduced idle polling and packet-processing overhead.
- Improved Studio health counters for downstream delivery and write failures.
Speaker relay improvements
- Reduced ALSA playback buffering and startup latency.
- Added configurable Speaker buffering presets in Studio.
- Bounded capture, playback, and UDP processing queues.
- Reduced audio frame copying and telemetry overhead.
- Improved Opus FEC recovery latency.
- Limited audio datagrams to MTU-safe sizes to avoid IP fragmentation.
Microphone relay improvements
- Added ordered packet-loss recovery and Opus FEC support.
- Bounded decoded microphone audio to prevent permanently delayed playback.
- Improved handling of stalled USB microphone consumers.
- Reduced receive-loop, decoding, and telemetry overhead.
- Consolidated shared speaker and microphone packet framing.
Studio improvements
- Harmonized Apply behavior across Client and Host management pages.
- Apply buttons now clearly indicate pending changes and only apply the
settings owned by the current page. - Audio Relay changes no longer overwrite unrelated profile settings.
- Fixed USB-lane validation when enabling or disabling audio relay streams.
- Added a persistent Audio Relay Apply footer.
- Improved action colors, refresh controls, destructive-button hover states,
and service restart iconography. - Stabilized Studio builds launched from WSL paths by isolating Windows build
outputs and automatically recovering damaged build caches.
Runtime and diagnostics
- Reduced hot-path telemetry work while retaining health visibility.
- Reused packet buffers, polling descriptors, and destination addresses.
- Added clearer queue, backpressure, packet-loss, socket-drop, and downstream
write diagnostics. - Compact Bluetooth HID handoff now uses a five-byte binary header.
- Expanded Host, Client, protocol, common, and Studio test coverage.
Upgrade notes
Studio, Host, and Client should be updated together because this release
includes transport and packet-handling changes, particularly for downstream
HID and Bluetooth HID delivery.
The Client now requests a 1 MiB UDP receive buffer by default. It can be
adjusted with GHOSTINPUT_CLIENT_UDP_RECEIVE_BUFFER_BYTES if required.