Rebind runs a small WebSocket server that speaks plain JSON: external code sends
HID output, reads screen and input state, and subscribes to live event streams,
all in the language you already use, with no Luau on the client side.
A web app, a Python process, a home-automation hub, or a local AI model connects to
the running Rebind instance and controls a real keyboard and mouse: standard USB
HID from the Rebind Link, or OS-level output in software mode.
Three ways to drive it
All three speak the same protocol against the same server; pick whichever
fits how you work.
- From your language: the official TypeScript, Python, and Rust clients
wrap the protocol in typed APIs, with automatic reconnection in TypeScript
and Python. The recommended path for real
programs. See Client libraries.
- From any language: the protocol is just JSON over WebSocket, so anything
that can open a socket can drive Rebind directly. The
Protocol is a single page.
- From an AI agent: the MCP server exposes screenshot,
click, type, and
run_lua as Model Context Protocol tools, so an agent
(OpenClaw, Claude Desktop, your own) drives a real keyboard and mouse.
Run the server
The server is the free
Remote Control
package, a single Luau script you can read and extend locally. It exposes the
full SDK (HID, System, Screen, Window, Input, Clipboard, App, Process, Env, Hash,
Codec, Regex, Config, File, Net, Dialog, Math, Macro, Audio, Timer, Registry, UI)
over protocol 1.3. Shell exec, filesystem, registry, and lua.exec are gated
off by default.
- Install it from the marketplace listing, or run
rebind install @rebind/remote-control. No account is needed.
- Open the installed package’s
main.luau in Rebind, select Options, and
set a strong Auth token.
- Start the script. It binds a WebSocket server on
ws://0.0.0.0:19561 (the
port is a slider in Options).
- Connect with a client library, the MCP server, or your own code.
Updating the package replaces main.luau, so re-apply any gate edits after an
update.
If you ran the older downloadable remote.luau or remote_access.lua, stop it
first: both default to port 19561. If you used remote_access.lua, its token
moved from the AUTH_TOKEN constant to the Auth token field in Options;
until you set it, the server accepts every client and still answers auth with
success.
0.0.0.0 exposes the server to every network interface. Without an auth token,
any peer that can reach the port can send input and use every enabled read or
control command. There is no script setting for a localhost-only bind. Set a
strong auth token before starting the server on any machine connected to a LAN,
and restrict port 19561 with the host firewall when remote access is not needed.