Self-hosted · Windows & Linux

Your computers, from any browser.

Remote desktop, an interactive terminal and system management for machines you own. No port forwarding on the controlled computer: the agent connects out to your server, and you open a browser tab.

Everything in one tab

Remote desktop

See and control the screen with noVNC. Windows uses a built-in capture server; Linux works with wayvnc (Hyprland, Sway) or x11vnc. Keyboard and clipboard work in both directions.

Terminal

A real shell in xterm.js: PowerShell, cmd or Git Bash on Windows, and Bash, Zsh or Fish on Linux. Multiple tabs, resizing, Ctrl+C and the current folder shown live.

Manage

Live CPU, memory, swap, disk, uptime and signed-in users. Lock, restart or shut down a computer, each behind its own permission.

Locked down by default

Password and emailed code to sign in, per-computer permissions, signed one-time grants for every session, an emergency stop and a full audit log.

No open ports

The agent dials out to your server over WSS and reconnects on its own. Nothing listens for inbound connections on the computers you control.

Starts at boot

Runs as a Windows service that can show the lock and sign-in screen, or as a systemd user unit on Linux. Restarts on its own after a crash.

How it works

Three parts. You run the server; each computer runs a small agent; you use a browser.

You Browser React · xterm.js · noVNC
Your server Server Node · Fastify · SQLite
Each computer rcagent Rust · tokio · rustls
  1. Pair. The web UI issues a single-use code. The agent generates its own Ed25519 key, and the server stores only the public half.
  2. Connect. The agent opens an outbound WebSocket and signs a fresh challenge from the server on every connection.
  3. Relay. When you open a desktop or terminal, the server relays it between your browser and the agent with a 60-second, single-use grant.

Get started

Requirements: Node 22.18 or newer (24 recommended) and stable Rust.

1 Run the server and web UI

npm install
cp .env.example server/.env
npm run dev:server   # http://127.0.0.1:8787
npm run dev:web      # http://localhost:5173

Open the web UI and create an account. In development, the sign-in code is printed in the server console.

2 Build the agent

cd agent
cargo build --release

This produces the rcagent binary for Windows or Linux.

3 Pair a computer

Choose Add computer in the web UI to get a pairing code, then on the computer to control:

rcagent pair --server http://127.0.0.1:8787 \
  --code ABCD-EFGH --allow desktop,terminal
rcagent run

--allow is the host owner's own allow-list. The web UI can never enable more.

4 Start at boot

# Windows, elevated terminal
rcagent service install

# Linux, no root
rcagent service install
loginctl enable-linger $USER

Check what the agent detected with rcagent status.

Remote desktop backends

HostBackendSetup
WindowsBuilt-in (GDI capture, SendInput, Tight/JPEG)Nothing to install
Hyprland, Sway, other wlrootswayvnc on a private unix socketpacman -S wayvnc
X11 (any desktop)x11vnc on a private unix socketapt install x11vnc
GNOME / KDE on WaylandExisting local VNC serverSet desktop.backend = "vnc"

Reach it from the internet

The server refuses plain HTTP on anything but localhost. Put it behind a TLS reverse proxy, set PUBLIC_ORIGIN, TRUST_PROXY=1 and SMTP, then npm run build && npm start.

# Caddyfile
remote.example.com {
    reverse_proxy 127.0.0.1:8787
}

Security model

Sign-in

A scrypt-hashed password and a single-use, 10-minute emailed code. Rate limited with generic errors. Optional re-verification before terminal or power actions.

Sessions

Random HttpOnly, SameSite=Strict cookies with idle and absolute expiry. You can list and revoke them. The Origin is checked on every change and every WebSocket upgrade.

Devices

An Ed25519 key is created on the host, and the server keeps only the public key. Each connection signs a fresh nonce, and the agent pins the server's signing key.

Permissions

Desktop, terminal and power are separate permissions, with desktop only by default. Every request carries a signed, single-use grant that the agent checks against its own allow-list.