Skip to main content

Remote desktop client/server for Windows computers on the same LAN, with autodiscovery. Provides screen, keyboard, mouse, and clipboard sharing without RDP or Microsoft authentication.

Project description

Remote Desktop

CI Coverage PyPI Python License: MIT

A Python client/server application that provides remote desktop for Windows computers on the same LAN, with autodiscovery of servers.

The server can optionally start automatically when you log in to Windows — a checkbox on its Status tab registers it under the per-user Run key (no administrator rights needed). The Status tab also has a Restart server button that relaunches the app in a fresh process; since the server's screen can be controlled remotely, this lets you update the software from a remote desktop session and restart into the new version without visiting the machine (approved clients reconnect without a new permission prompt).

Connections are made to the desktop screen, keyboard, mouse, and clipboard. Other connections are not provided, such as shared drives, devices, or multimedia (e.g., audio).

The screen transfer is optimized for ordinary desktop work — documents, code, terminals — where most of the screen is static between frames: it is lossless (pixel-exact at full resolution) and only changed screen regions are transmitted. Smooth playback of fast-changing full-screen content, such as video or games, is a non-goal.

The client and server are PySide6 (Qt) GUI apps, each run on its respective computer. The client requests connection to the server, and for the initial connection the user on the server side must permit the connection. After that, the client can connect to the server whenever the server is running, without the server having to grant permission again.

This does not use Windows RDP nor rely on any Microsoft-based authentication.

Status

The core feature set works: autodiscovery, live screen viewing, mouse/keyboard control, and two-way clipboard sync. A running server appears in the client's Servers panel; opening it (after the server user approves the first connection) shows the remote screen, clicking into the view forwards mouse and keyboard input, and text/images copied on either side appear on the other. Input forwarding is safe against interruptions: if the viewer loses focus, a drag ends outside the view, or a client disconnects mid-keystroke, anything still held down is released on the server — no stuck keys or mouse buttons.

The connection is encrypted with TLS, and after the server user approves a client once, that client reconnects automatically using a stored token. Unapproved connections are limited to small handshake messages until the server user admits them. The security model is tuned for a trusted LAN: the server's certificate is self-signed and trusted on first use, favoring reliable reconnection over strict certificate checking — if the server's certificate ever changes, the client logs a warning and updates its stored fingerprint rather than refusing to connect.

Both apps have a second tab listing every peer seen on the LAN — on the server, the clients that have connected or attempted to; on the client, the servers it has discovered or tried to reach — with each peer's current state, number of attempts, and when it was first and last seen. From that tab the server can revoke a client (disconnecting it and requiring approval to reconnect) and the client can forget a server. This inventory, and all other state (identity, pairings, settings), is stored in a SQLite database and persists across restarts. Its location is chosen by platformdirs (on Windows, %LOCALAPPDATA%\remotedesktop).

Requirements

  • Windows
  • Python 3.14+
  • uv

Running

From a clone of this repository, double-click run_server.bat on the computer to be shared and run_client.bat on the viewing computer. Each script prepares the environment (installing dependencies on first use) and then launches the app, closing its console window once the app is running.

To run from a terminal instead:

uv run remotedesktop-server
uv run remotedesktop-client

The apps are also published on PyPI as remotedesktop.

How discovery works

The client broadcasts a small JSON probe over UDP (port 48653); each server on the LAN replies with its hostname and connection port. Windows Firewall must allow Python to receive inbound UDP on that port for a server to be discoverable from other machines.

Development

uv sync          # set up the environment
uv run pytest    # run the tests

Run the tests from PowerShell or cmd, not Git Bash: Git Bash puts Git's MinGW OpenSSL DLLs on PATH, which Qt's TLS backend loads and crashes on. From PowerShell, Qt uses the Windows schannel backend as intended.

The badges branch

The coverage badge above is served from the badges branch (raw.githubusercontent.com/.../badges/coverage.svg). CI regenerates the SVG after each test run on master and force-pushes it there as a single orphan commit. It lives on its own branch because master only accepts pull requests (a repository ruleset), so CI cannot commit to it directly; keeping the badge in the repo avoids depending on an external coverage service. The branch is generated output — never branch from it or merge it.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

remotedesktop-0.16.0.tar.gz (108.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

remotedesktop-0.16.0-py3-none-any.whl (63.7 kB view details)

Uploaded Python 3

File details

Details for the file remotedesktop-0.16.0.tar.gz.

File metadata

  • Download URL: remotedesktop-0.16.0.tar.gz
  • Upload date:
  • Size: 108.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for remotedesktop-0.16.0.tar.gz
Algorithm Hash digest
SHA256 398f4f63f1bc3e28df10d64864cef7f5b70cc982156974497ac67ef2e080640c
MD5 63c24961d24d993dda86f0674d43d9be
BLAKE2b-256 ad27ca96f1bf592226d46856a9501930f0a55d817aa0e358d2eb83fcf2a9ebaf

See more details on using hashes here.

File details

Details for the file remotedesktop-0.16.0-py3-none-any.whl.

File metadata

  • Download URL: remotedesktop-0.16.0-py3-none-any.whl
  • Upload date:
  • Size: 63.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for remotedesktop-0.16.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d6c7132a35290c920c133c1a77baf9599ea4cc0bd2e7b7bca4eb53157fa0c740
MD5 c93ba0070047b1cb72cdb0677359e333
BLAKE2b-256 ade67f310b590f25fdfa2084e2ccb701dc6188bbf5320bb1d2ec66deeaf1a7f4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page