remotedev docs
← machinesStart sharing a machine
remotedev up --broker {this broker's URL}
Prints one share link. Open it in any browser for the screen, terminal, files, clipboard and management tabs. The slug in the link is the only credential — keep the link private.
Manual download & install
No store, no account: this broker serves the exact code it is running, bundled with the one-command starters, so a new machine is set up from here in one step.
# macOS / Linux
curl -LO {this broker's URL}/code/remotedev.zip
unzip remotedev.zip && cd remotedev && ./start.sh
# Windows (PowerShell)
curl.exe -LO {this broker's URL}/code/remotedev.zip
Expand-Archive remotedev.zip; cd remotedev\remotedev; .\start.ps1
The starter creates a .venv next to itself on first run,
installs everything, and prints the share link. Installed hosts keep
themselves current automatically: they poll this broker and self-update
whenever new code is deployed. Direct links:
remotedev.zip ·
remotedev.tar.gz
Share an Android phone
The RemoteDev app registers a phone here exactly like a computer does: its screen streams to a share link, and remote taps, swipes and typing work once its accessibility service is enabled.
# on the phone: open this page and install the app
{this broker's URL}/download/remotedev.apk
Sideloading needs “install unknown apps” for your browser. In the app, leave the broker URL as it is, tap Start sharing, allow screen capture, and the share link appears — tap it to copy. For remote control, tap Accessibility settings and turn RemoteDev on; without it the phone is view-only. A notification stays up the whole time the screen is shared. Direct link: remotedev.apk
HTTP endpoints (per share link)
Everything below hangs off /s/<slug>.
| endpoint | what it does |
|---|---|
| GET /status | liveness: online, ended, name, width,
height, os, viewers, host_version |
| GET /shot | one fresh JPEG frame (screenshot on demand,
no-store) |
| GET /thumb | last cached frame (cheap preview) |
| GET /stream | MJPEG stream of pushed frames |
| POST /input | queue one input event; acks
{ok, queued, t, fx, fy} |
| POST /rpc | run any host command (see below); JSON
{"cmd": ..., ...args} |
| GET /activity | recent command names + outcomes |
| GET|POST /port/<n> | HTTP tunnel to
localhost:<n> on the host |
| POST /sendto | machine-to-machine file copy |
| POST /end | end the session |
Input events
POST /s/<slug>/input
{"type":"click","fx":0.5,"fy":0.5,"button":"left"}
Types: move, click, mouse_down, mouse_up, scroll, text, key,
clipboard. Coordinates are fractional (fx, fy in 0–1),
so they survive resolution changes.
RPC commands
POST /s/<slug>/rpc
{"cmd":"state"}
Observability
| cmd | returns |
|---|---|
| state | focused window {id, title}, screen size,
platform, backend, control owner |
| info | platform, hostname, screen size, version |
| screenshot | PNG/JPEG as base64, optional
region, scale, quality, if_hash |
| list_windows / monitors / capabilities | windows, displays, what this backend can do |
| cursor_position | current pointer x, y |
Browser (CDP bridge)
Works against a browser started with
--remote-debugging-port=9222 (override the base with a
"cdp" field or REMOTEDEV_CDP).
| cmd | what it does |
|---|---|
| page | active tab {url, title, ready_state} —
confirms a navigation actually landed |
| dom | interactive elements with CSS selectors + on-screen boxes |
| dom_click | {"selector": "#save"} —
scrollIntoView + click, returns the element's center |
| dom_eval | {"js": "..."} — evaluate and return a
JSON value |
| cdp | {"method": "Page.navigate", "params": ...}
— raw DevTools passthrough |
Control
| cmd | what it does |
|---|---|
| exec | run a shell command, capture output |
| launch / open_url | start an app / open a link in the default browser |
| type / key / click / move / scroll | raw input by pixel coordinates |
| click_text / click_image | OCR / template-match a target, then click it |
| keepawake | {"on": true} — inhibit screensaver
and display power-off for the session |
| wake_display / wol | wake a blanked display / send Wake-on-LAN to a sibling machine |
| clipboard_get / clipboard_set | text (and image) clipboard both ways |
Files, processes & more
| cmd | what it does |
|---|---|
| ls / read_file / write_file / mkdirs / rm / mv | filesystem, chunked transfers for big files |
| ps / kill_proc / proc_output | process list, kill, captured output |
| sched_add / sched_delete / sched_pause | recurring commands on the host |
| record_start / record_stop | screen recording on the host |
| self_update | update the host package and restart on the same link |
Everything is curl-able
# what is on screen right now?
curl -s $BASE/s/$SLUG/shot -o now.jpg
# what has focus?
curl -s -X POST $BASE/s/$SLUG/rpc -d '{"cmd":"state"}'
# click a button by selector instead of pixels
curl -s -X POST $BASE/s/$SLUG/rpc \
-d '{"cmd":"dom_click","selector":"button.submit"}'