Skip to main content
rebind is the command-line companion to the Rebind app: scaffold a package, validate and lint it offline, run it against your local Rebind app with live logs and hot-reload, then package and publish it. It installs with Rebind and lands on your PATH, with no separate download. check, lint, new, package, and preview work fully offline. run, exec, repl, whoami, publish, import, export, and ui talk to the Rebind app, so it must be running (and signed in, for whoami/publish).

Commands

Every [path] defaults to the current directory and accepts either a package directory or a single .lua/.luau file.

new

The package name is the final path component (rebind new tools/hello creates a package named hello), lowercased. The scaffolded rebind.toml carries a commented-out [marketplace] block (summary, category, icon, media, and [marketplace.price]). The README.md ships inside the .rbp and becomes the listing’s overview when you publish.

check

Offline validation of the package contract: manifest schema and pricing rules, identity declarations, the full require graph, Luau compilation of every reachable module, and a permission audit. The audit covers the two permissions the runtime enforces, net (Net.*) and exec (System.Exec, System.ExecDetached). It compares uses against the entry modeline, so a script that declares exec and forgets net fails here instead of at runtime. Undeclared means all permissions, so for a script that declares none there is nothing to contradict and the comparison is inert. A package carrying a [marketplace] block is held to more: publish refuses an undeclared set, so check fails it here rather than at upload. The audit lexes the source, so a mention inside a string or comment is not a call, but it does not resolve aliases (local n = Net; n.Get()).
Checking a script that lives inside a package shows its container:

lint

Advisory linting over the same require graph, with the Rebind standard library preloaded so HID, Log, hooks, and the rest of the SDK resolve. Warnings never block anything; error-severity findings (definite bugs) exit non-zero and block publish.

run

The dev loop: validates, loads the entry into the running Rebind app, streams the script’s log channel, and hot-reloads when a source file changes.
Only this script’s lines appear: its own Log.* output plus Rebind’s lifecycle notices and errors for it. --all-logs streams every Rebind log line (prefixed with its source) for app-wide debugging. Edits to .lua/.luau/ .toml files and anything under assets/ trigger a reload; a failing re-check keeps the previous run alive. rebind run scripts/wiggle.luau runs a single script from a package’s scripts/ directory. It inherits the package’s min_sdk, and its requires resolve from the package root.

exec and repl

Both run chunks in a persistent scratch runtime inside the Rebind app: the full SDK with real input output, state surviving between calls.
rebind exec - reads the chunk from stdin. A Lua error exits non-zero. rebind repl is the interactive version: same runtime, TAB completion queried live from the VM (your own variables complete, not just SDK names), and unfinished chunks continue on the next line. ⌃D exits.

package

Builds the .rbp registry artifact, a gzipped tarball of the package’s plaintext source and assets. Format details are in Package format.
--out <path> sets the output file. The default is <slug>.rbp in the current directory.

publish

The script marketplace has not been released yet. Publishing requires a Developer account, which is not yet publicly available.
Check → lint → package → upload for review. Error-severity lint findings block the upload; warnings do not. Requires:
  • a package (rebind.toml); a bare script has no listing to publish
  • a Developer account with a claimed @handle
  • a [marketplace] section with summary and category
  • a [marketplace.price] table for a paid listing; omit it for a free listing
  • at least one screenshot .png in media; the first png becomes the cover
  • an optional 128x128 icon, separate from the cover and gallery
The Rebind app’s authenticated session does the uploading; the CLI holds no credentials. The .rbp goes up first, followed by the cover, optional icon, and remaining gallery items in declaration order. A README.md at the package root is sent as the listing’s overview; without one the product page falls back to summary.

preview

Loads the package manifest and opens a self-contained local HTML approximation of its marketplace listing. It reads only rebind.toml, README.md, and local media. No sign-in or running Rebind app is required.
The preview surfaces missing or invalid listing fields, but it is not the store UI. Run rebind check before publishing for the complete package validation.

import and export

import installs a .rbp into the Rebind app’s scripts tree, under scripts/packages/<name>/, with the name taken from the archive’s rebind.toml. --overwrite replaces an existing install of the same package.
export is the inverse: it builds a .rbp from something already installed. The path is relative to the scripts root. --out <path> sets the output file.

whoami

mcid is your registered Rebind Link with its live attachment state; transport is the session mode (hardware when your device drives output, software otherwise).

ui

Opens the Rebind control panel as its own window, using an installed Chromium browser’s app mode. With no Chromium browser, or with the app not yet answering, it opens an ordinary browser tab instead. --url defaults to http://127.0.0.1:19480 and must stay on loopback: the app’s WebSocket guard only accepts localhost, 127.0.0.1, and ::1 origins.