Rein is a cross-platform remote desktop tool with a browser-based client for both Touch Screen as well as non-touch devices. The desktop server runs on supported host platforms, while clients connect through a web browser without requiring a separate native application.
Rein provides remote desktop interaction, real-time screen streaming, file transfer, and input support through a single interface.
- Cross-platform server - Run the Rein server on a variety of supported desktop platforms.
- Browser-based client - Connect from any modern browser with no native client required.
- Multi-client support - Connect multiple clients to a single host.
- Flexible input - Supports keyboard, mouse, and touchscreen input.
- Real-time streaming - Stream the host's screen using WebRTC.
- File transfer - Transfer files between the host and connected clients.
- Cloud-ready interface - Provides a standardized interface for cloud PC and cloud gaming providers.
- Cross-platform input injection - Uses Rein's input injection library for platform-specific system input, including support for environments such as Wayland.
Rein is designed to provide a common interface between a desktop environment and browser-based clients. This makes it suitable not only for direct remote desktop use, but also as an interface layer for cloud PC and cloud gaming providers.
The client is entirely browser-based, so providers can expose Rein without requiring users to install or maintain a separate native client application.
Multiple clients can connect to the same server, with the server coordinating communication and input between connected clients.
Rein supports multiple forms of remote input, including:
![]() |
![]() |
![]() |
![]() |
| Pointer movement, scrolling and gestures. | Physical keyboard and mouse as input. | Physical Touchscreen as input. | Virtual Gamepad for supported applications. |
Rein includes a cross-platform input injection library for system-level keyboard and mouse input across supported operating systems. This addresses limitations in the Node.js ecosystem, particularly the lack of reliable input injection support on Wayland.
Rein uses WebRTC for real-time communication instead of implementing a custom UDP-based communication protocol. Using WebRTC provides an established, battle-tested real-time communication stack for transporting media and real-time data while avoiding the need to maintain a custom networking protocol.
Note
For Linux
Rein uses a virtual input device (/dev/uinput) for keyboard and mouse injection.
On Wayland, screen capture requires a working PipeWire + XDG Desktop Portal setup (typically provided by your desktop environment).
Your user must also have permission to access /dev/uinput. A recommended setup is:
sudo groupadd -f uinput
sudo tee /etc/udev/rules.d/99-rein.rules <<EOF
KERNEL=="uinput", MODE="0660", GROUP="uinput"
EOF
sudo usermod -aG uinput $USER
sudo udevadm control --reload-rules
sudo udevadm triggerLog out and back in after running the commands above.
You can verify access with:
ls -l /dev/uinputwhich should show:
crw-rw---- 1 root uinput ... /dev/uinput
Additionally, some native dependencies are required. Install them via your package manager (see shell.nix for the list), or use nix-shell directly.
For Windows (Virtual Gamepad)
Virtual gamepad emulation requires the ViGEmBus kernel driver installed on the host machine. If ViGEmBus is not installed, virtual controller input injection will be disabled.
-
Install dependencies:
npm install
-
Start the development server:
npm run dev
-
Open the local application:
http://localhost:3000
Ensure the host allows incoming connections on:
- 3000/TCP — Frontend and WebSocket signaling
- 4000–4050/UDP — WebRTC media and input channels
Linux (UFW):
sudo ufw allow 3000/tcp
sudo ufw allow 4000:4050/udpNixOS:
networking.firewall = {
allowedTCPPorts = [ 3000 ];
allowedUDPPortRanges = [
{ from = 4000; to = 4050; }
];
};Port 5004/UDP is an internal loopback relay between GStreamer and Rein and must not be exposed.
Open the Rein server from a browser using:
http://<YOUR_PC_IP>:3000
The client does not require a separate installation.
When testing Rein inside a Virtual Machine (VirtualBox), the VM must allow other devices on the network to access the server.
- Open VM Settings.
- Go to Network.
- Change the adapter from NAT → Bridged Adapter.
- Select your active Wi-Fi or Ethernet interface.
This allows devices on the same network to connect to the Rein server running inside the VM.
Grant Accessibility permission to your terminal or IDE in:
System Settings → Privacy & Security → Accessibility
- Host / Application - Runs Rein and coordinates the required services.
- Server - Handles client connections and communication with the host.
- Client / Viewer - Browser-based interface used to interact with the host.
- GStreamer - Handles screen capture and streaming.
- Input Manager / Drivers - Converts remote input into platform-specific system input.
- WebRTC - Provides real-time communication for input and media.
- HTTP - Used during connection setup and handshake.
- FTP / File Transfer - Handles file transfers between the client and host.
The architecture separates the browser-based client from the host-side services, allowing multiple clients to connect while keeping platform-specific functionality on the desktop server.
For a deeper look at the architecture, communication flow, WebRTC, screen capture, input handling, and platform-specific implementation, see the Rein Wiki.







