Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

CLI reference

rdc [-t TARGET] [--log FILTER] <command>

-t/--target selects the machine for every client command (default local; see Configuration). --log sets the tracing filter (info by default); logs go to stderr, or to a file with --log-file PATH (RDC_LOG_FILE).

Daemon side

rdc serve

Run the daemon on the machine to be controlled. Binds the Tailscale IPv4 on port 7770 unless told otherwise, verifies every caller through tailscaled whois, and refuses to start with an empty allowlist.

FlagMeaning
--allow WHO[=CAPS]identity to permit, optionally limited: --allow tag:ops=view,clipboard (repeatable, added to config)
--port Nlisten port
--bind IPlisten address (must be a Tailscale address)
--dev-loopbackbind 127.0.0.1 and skip authentication for loopback. Testing only.

rdc service install [--elevated] | uninstall | status

Manage a per-user background service that runs rdc serve: a LaunchAgent on macOS (dev.rdc.daemon), a systemd --user unit on Linux, a Task Scheduler logon task on Windows. On Windows the task runs at standard integrity; --elevated requests the highest run level so the daemon can drive elevated windows (see Windows setup). The service runs the binary at the path rdc service install was invoked from, so install from the final location (on macOS, from inside rdc.app).

rdc audit [-n N] [--json] [--path FILE]

Show the last N entries (default 50) of this machine’s audit log as a table, or as raw JSON lines with --json. The file is [serve.audit].path or the platform default. See Configuration.

rdc doctor [--request-permissions]

Prints what rdc can see on this machine: platform and session type, tailscaled connectivity and this node’s identity, permission state, displays with geometry, a timed test screenshot, window count, whether input initialises, the configured grants, and the audit log path. Exits non-zero if something needed for serving is missing. --request-permissions (macOS) triggers the Screen Recording and Accessibility prompts.

Client side

All coordinates are logical desktop points in the virtual desktop that spans every monitor. rdc displays shows each monitor’s rectangle in that space.

CommandWhat it does
rdc displayslist displays as JSON: id, name, rect, scale, primary
rdc windowslist windows as JSON: id, pid, app, title, rect, focused, minimized
rdc shot [--display all|primary|ID] [--max PX] [--jpeg] [-o FILE]screenshot. --max limits the longer edge. Prints the output path; the desktop rect it covers goes to stderr.
rdc move X Ymove the pointer
rdc click X Y [--button left|right|middle] [--double]click
rdc drag X1 Y1 X2 Y2 [--button …]press, move in steps, release
rdc scroll [--dx N] [--dy N] [--at X Y]wheel steps; positive dy scrolls down, positive dx right
rdc type TEXTtype literal text (unicode ok)
rdc key CHORDpress a chord, see below
rdc focus --id ID | --app SUBSTR | --title SUBSTRbring a window forward
rdc clip [TEXT]read the clipboard, or set it
rdc whoamiask the daemon how it identifies you (remote targets only)

Mapping a screenshot pixel to a click

A screenshot of size W×H that covers desktop rect (x, y, w, h) maps pixel (px, py) to (x + px·w/W, y + py·h/H). On a 2× display, a full-resolution screenshot is twice the size of the logical desktop, so halve pixel coordinates. rdc mcp does this automatically; the CLI does not.

Key chords

Tokens joined by +; all but the last are modifiers.

Modifierscmd command super win meta (all = the platform’s Meta key), ctrl control, alt option, shift
Named keysenter/return, esc/escape, tab, space, backspace, delete, insert, home, end, pageup, pagedown, up down left right, capslock, f1f24
Punctuation namesplus minus comma period slash backslash semicolon quote grave equal bracketleft bracketright
Anything elsea single character, typed with the modifiers held

Examples: cmd+shift+4, ctrl+c, alt+f4, enter, ctrl+plus, +.

MCP server

rdc mcp [--target T] [--max PX]

Serve MCP over stdio for an agent. --max sets the longest screenshot edge sent to the model (default 1568). See MCP tools.