Skip to content

Latest commit

 

History

437 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Group 13

What's Rein

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.

Features

  • 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.

Technical Overview

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.

Input

Rein supports multiple forms of remote input, including:

Trackpad Keyboard and Mouse Touch Virtual Gamepad
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.

WebRTC

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.

Tech Stack

TanStack      TypeScript      WebRTC      GStreamer

Development Setup

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 trigger

Log out and back in after running the commands above.

You can verify access with:

ls -l /dev/uinput

which 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.

Quick Start

  1. Install dependencies:

    npm install
  2. Start the development server:

    npm run dev
  3. Open the local application:

    http://localhost:3000
    

Connecting a Client

1. Configure the Firewall

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/udp

NixOS:

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.

2. Connect Through a Browser

Open the Rein server from a browser using:

http://<YOUR_PC_IP>:3000

The client does not require a separate installation.

Testing Rein on Virtual Machines

When testing Rein inside a Virtual Machine (VirtualBox), the VM must allow other devices on the network to access the server.

Network Configuration

  1. Open VM Settings.
  2. Go to Network.
  3. Change the adapter from NAT → Bridged Adapter.
  4. 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.

macOS

Grant Accessibility permission to your terminal or IDE in:

System Settings → Privacy & Security → Accessibility


Architecture

Rein application architecture and data flow

At a Glance

  • 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.

About

Cross-Platform LAN-Based Remote Input Controller

Resources

Code of conduct

Contributing

Security policy

Stars

38 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages