free-remote
A cross-platform remote desktop tool written in Rust, where permission is checked on every single message, not just once at connect time.
Sep 2026 – now · Open source · Rust, Noise Protocol, Linux
Sending only changed 128×128 tiles cut an idle desktop from 31 Mbit/s to 5.9 Mbit/s.
Overview
free-remote shares a machine's screen and lets someone else use its mouse and keyboard, but only with permission that a person explicitly granted, and only as much as was granted.
Permissions are per capability (view screen, mouse, keyboard), nothing is granted by default, and every inbound message is re-checked against the live grant. Revoking access takes effect on the very next event, including events already queued.
Every session runs over a Noise XX handshake (25519, ChaChaPoly, BLAKE2s). It builds on Linux, Windows and macOS with no system libraries and no C toolchain.
The problem
Remote desktop tools usually treat permission as a checkbox at connect time. After that, the remote side can do anything.
What I did
I wrote it from scratch in Rust: the wire protocol, encrypted transport, screen capture and encoding, input injection, and both binaries.
- Split the code into small crates for protocol, transport, capture, input, host and viewer.
- Enforced the permission model on the host for every message rather than trusting the viewer.
- Measured the video path and fixed the real bottleneck with tile diffing and back-off.
The result
A remote desktop tool that a nervous user can trust, with published performance numbers and reproducible benchmarks.
- Benchmark commands and results are published in the README.
- Marked clearly as not yet independently audited.
Features
- Per-capability permissions: watch without touching
- Encrypted transport with host fingerprints and peer pinning
- Tile diffing sends only what changed on screen
- Frames are dropped, not queued, so latency cannot build up
- Idle capture backs off, taking CPU from about 38% of a core to 6%
- End-to-end tests that drive the real host binary
Try it
$ cargo build --releaseRun inside a clone of the repository.