Skip to main content
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.
  1. 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.
  2. 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.
  3. 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.
  1. Install it from the marketplace listing, or run rebind install @rebind/remote-control. No account is needed.
  2. Open the installed package’s main.luau in Rebind, select Options, and set a strong Auth token.
  3. Start the script. It binds a WebSocket server on ws://0.0.0.0:19561 (the port is a slider in Options).
  4. 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.