Skip to main content

stick-stream

stick-stream is an ultra low-latency, virtual USB streaming system for Linux-based OSes. It is designed as an Linux-native, open-source alternative to VirtualHere for gaming purposes.

stick-stream can be used to forward controller input from one machine (for example, a Raspberry Pi with USB gamepads attached) to another machine over the network and exposes those controllers as virtual Linux input devices via uinput.

stick-stream is designed to work seamlessly with Sunshine and Steam for gaming. The original use case was to forward controller inputs from a Raspberry Pi in my living room to my gaming PC which resides in a different room.

Features

  • 🎮 Stream one or more gamepads over a local network.
  • ⚡ Low-latency UDP-based transport. I play FPS games with stick-stream and do not notice any input lag.
  • 🧠 Correctly handles analog sticks, triggers, D-pads, and all controller buttons.

How It Works

stick-stream consists of two components:

  1. Broadcaster – Runs on the machine with the physical controllers attached

    • Reads input events from /dev/input/event*
    • Serializes button and axis events
    • Sends them over the network
  2. Receiver – Runs on the host machine (e.g. Sunshine server)

    • Receives events over UDP
    • Recreates controllers using uinput

From the perspective of games and applications, the streamed controller is indistinguishable from a locally connected USB gamepad.

Usage

These instructions are split into what you need to do on both the broadcast and receiving computers.

  • Broadcast computer: has gamepads plugged into it
  • Receiving computer: receives the gamepad events

⚠️ Ensure Python 3.12.7 is installed on both the broadcast and receiving computer.

On both the broadcast and receiving computers

  1. Install the stick-stream package. It is available via pip.
  • pip install stick-stream

On the broadcast computer

  • stick-stream broadcast --to={IP of the receiving computer} --port={an empty port the service can used for communication}

To get the IP address for the receiving computer, you can run: ip addr on modern Linux distros.

You don't need to specify a port. The default is 9999 if not specified.

On the receiving computer

  • stick-stream receive --port={the same port used by the first command}

If the software is working properly, you can now do gamepad inputs from the broadcast computer and see them reflected in the receiver computer!

FAQs

Does this replace VirtualHere?

Short answer: no.

VirtualHere supports anything that can be plugged into a USB port (like flash drives and Bluetooth dongles). stick-stream is really only designed to forward gamepad inputs.

My guess is that VirtualHere captures everything sent into the USB port and somehow replays them remotely to the connected VirtualHere clients. This is much different than stick-stream which only forwards controller input at the Linux input (evdev) level.

However, if you were only using VirtualHere to forward your gamepad inputs over the network, then stick-stream will accomplish these same goals.

Does this work on non-Linux OSes?

No, not in it's current state. stick-stream relies heavily on some Linux-specific Kernel features and I have no plans to port it to other operating systems.

Metadata

Release files for stick-stream 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for stick-stream 0.1.5
File Size Uploaded
stick_stream-0.1.5.tar.gz 6.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for stick-stream 0.1.5
File Interpreter ABI Platform
stick_stream-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 13.3 kB

Release files / stick_stream-0.1.5.tar.gz

Download URL stick_stream-0.1.5.tar.gz
Size 6.0 kB
Tags Source
SHA-256 checksum
How to use checksums
9071048aadddee4867fb92e2432ac764bd444b38265338d1c1175fd4000fd85e
BLAKE2b-256 checksum
How to use checksums
89abd0db06053d4593f8395554835e2a6cb0e1f2037a04104b779fa9cc4913a0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.7

Release files / stick_stream-0.1.5-py3-none-any.whl

Download URL stick_stream-0.1.5-py3-none-any.whl
Size 7.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
607f2c823835cebca5a66e505f81b699fd94a90fb09a40f42bba0298b2a23fdb
BLAKE2b-256 checksum
How to use checksums
2786cebfc671648d5da44b4080b82e5c185a8d3015a12de27960e3420529c1ba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.7

Release history Release notifications | RSS feed

This release

0.1.5 This release

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page