Simple Remote Desktop Controller
A lightweight remote desktop tool built with Python. Control any PC on your local network from a single dashboard using WebSockets for communication.
Here is an example at 10 FPS, with a JPEG quality of 40%:
preview.mp4
- Live Screen Streaming: Real-time JPEG-encoded screen capture with auto-scaling to fit the viewer
- Full Mouse Control: Movement, left/middle/right click, and scroll wheel forwarding
- Full Keyboard Control: All standard keys, modifiers, function keys (F1–F24), numpad, navigation, media keys, and system keys
- Multi-Client Support: Connect and manage multiple remote PCs simultaneously from a single dashboard
- Multi-Monitor Support: Detect and select any individual monitor on the remote PC
- Automatic Reconnection: Client retries connection up to 5 times on failure
- WebSocket Communication: Lightweight bidirectional protocol over a configurable port (default
8765) - Modern Dark UI: Clean Tkinter interface with Catppuccin Mocha theme
- CLI Configuration:
--port,--server, and--nameflags for easy setup with sensible defaults - Reliable Connection Handling: Detects disconnects and updates the dashboard automatically
The system has three components:
-
Controller GUI (
main.py) - Runs on your machine. Opens a Tkinter dashboard that shows connected PCs and displays a live view of their screens. Your keyboard and mouse inputs on the viewer are captured and forwarded. -
WebSocket Server (
server.py) - Embedded in the GUI. Listens for incoming client connections, relays screen frames to the viewer, and sends input events back to the active client. -
Client (
client.py) - Runs on each remote PC you want to control. Connects to the server, continuously captures the screen as JPEG frames, and replays any incoming keyboard/mouse events locally.
- Screen capture uses mss to grab frames, which are compressed to JPEG and sent over the WebSocket as binary messages.
- Input replay uses the keyboard and mouse libraries to physically reproduce key presses, mouse movements, clicks, and scrolls on the remote machine.
- Mouse coordinates are sent as ratios (0–1) relative to the viewed image, then converted to absolute pixel positions on the client side, so mismatched resolutions aren't a problem.
- Python 3.10+
Install dependencies on both machines:
pip install colorama keyboard mouse mss pillow websockets Note
On Linux, keyboard and mouse require root privileges on the client machine.
python main.pyThe GUI opens and the WebSocket server begins listening. Your local IP and port are shown in the sidebar.
| Flag | Default | Description |
|---|---|---|
--port |
8765 |
WebSocket server port |
python client.py --server ws://<controller-ip>:8765Replace <controller-ip> with the IP displayed in the controller's sidebar.
| Flag | Default | Description |
|---|---|---|
--server |
ws://HOST:8765 |
WebSocket URL of the server |
--name |
System hostname | Display name in the dashboard |
Once the client appears in the sidebar, click a monitor button to start streaming. Use Disconnect to stop.
These constants in client.py can be tuned:
| Constant | Default | Purpose |
|---|---|---|
JPEG_QUALITY |
40 |
JPEG compression (1–100) |
FPS |
10 |
Target capture framerate |
MAX_RETRIES |
5 |
Reconnection attempts on failure |
RETRY_DELAY |
3 |
Seconds between retries |
- Hear the sound coming from the remote PC
- See the mouse movements from the remote user
- Use encrypted communication (TLS)
- Configure FPS and JPEG quality from the GUI
- Scroll horizontally (not supported by the Python
mousemodule) - Support all keyboard layouts (not just QWERTY)
- Connect to multiple PCs at the same time
Tip
While designed as a simple educational Remote Desktop Controller rather than a full RAT, its core architecture could easily be adapted into one by adding features like persistent reconnection loops for LAN broadcast discovery with appropriate delays, and auto-startup mechanisms. (This tool doesn't use a reverse-connection model.)
If you have questions, suggestions, or want to hang out with other developers, join my Discord server: Ree-verse GitHub Support.
This project was inspired by Quasar. Many thanks to Quasar for the inspiration.
Released under the MIT License © 2026 Ree-verse.
This project is intended for personal use on your own local network (e.g., managing your own machines). Do not use it to access devices without explicit authorization.