coderClaw

Nodes

A node is a companion device (macOS/iOS/Android/headless) that connects to the Gateway WebSocket (same port as operators) with role: "node" and exposes a command surface (e.g. canvas.*, camera.*, system.*) via node.invoke. Protocol details: Gateway protocol.

Legacy transport: Bridge protocol (TCP JSONL; deprecated/removed for current nodes).

macOS can also run in node mode: the menubar app connects to the Gateway’s WS server and exposes its local canvas/camera commands as a node (so coderclaw nodes … works against this Mac).

Notes:

Pairing + status

WS nodes use device pairing. Nodes present a device identity during connect; the Gateway creates a device pairing request for role: node. Approve via the devices CLI (or UI).

Quick CLI:

coderclaw devices list
coderclaw devices approve <requestId>
coderclaw devices reject <requestId>
coderclaw nodes status
coderclaw nodes describe --node <idOrNameOrIp>

Notes:

Remote node host (system.run)

Use a node host when your Gateway runs on one machine and you want commands to execute on another. The model still talks to the gateway; the gateway forwards exec calls to the node host when host=node is selected.

What runs where

Start a node host (foreground)

On the node machine:

coderclaw node run --host <gateway-host> --port 18789 --display-name "Build Node"

Remote gateway via SSH tunnel (loopback bind)

If the Gateway binds to loopback (gateway.bind=loopback, default in local mode), remote node hosts cannot connect directly. Create an SSH tunnel and point the node host at the local end of the tunnel.

Example (node host -> gateway host):

# Terminal A (keep running): forward local 18790 -> gateway 127.0.0.1:18789
ssh -N -L 18790:127.0.0.1:18789 user@gateway-host

# Terminal B: export the gateway token and connect through the tunnel
export CODERCLAW_GATEWAY_TOKEN="<gateway-token>"
coderclaw node run --host 127.0.0.1 --port 18790 --display-name "Build Node"

Notes:

Start a node host (service)

coderclaw node install --host <gateway-host> --port 18789 --display-name "Build Node"
coderclaw node restart

Pair + name

On the gateway host:

coderclaw nodes pending
coderclaw nodes approve <requestId>
coderclaw nodes list

Naming options:

Allowlist the commands

Exec approvals are per node host. Add allowlist entries from the gateway:

coderclaw approvals allowlist add --node <id|name|ip> "/usr/bin/uname"
coderclaw approvals allowlist add --node <id|name|ip> "/usr/bin/sw_vers"

Approvals live on the node host at ~/.coderclaw/exec-approvals.json.

Point exec at the node

Configure defaults (gateway config):

coderclaw config set tools.exec.host node
coderclaw config set tools.exec.security allowlist
coderclaw config set tools.exec.node "<id-or-name>"

Or per session:

/exec host=node security=allowlist node=<id-or-name>

Once set, any exec call with host=node runs on the node host (subject to the node allowlist/approvals).

Related:

Invoking commands

Low-level (raw RPC):

coderclaw nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'

Higher-level helpers exist for the common “give the agent a MEDIA attachment” workflows.

Screenshots (canvas snapshots)

If the node is showing the Canvas (WebView), canvas.snapshot returns { format, base64 }.

CLI helper (writes to a temp file and prints MEDIA:<path>):

coderclaw nodes canvas snapshot --node <idOrNameOrIp> --format png
coderclaw nodes canvas snapshot --node <idOrNameOrIp> --format jpg --max-width 1200 --quality 0.9

Canvas controls

coderclaw nodes canvas present --node <idOrNameOrIp> --target https://example.com
coderclaw nodes canvas hide --node <idOrNameOrIp>
coderclaw nodes canvas navigate https://example.com --node <idOrNameOrIp>
coderclaw nodes canvas eval --node <idOrNameOrIp> --js "document.title"

Notes:

A2UI (Canvas)

coderclaw nodes canvas a2ui push --node <idOrNameOrIp> --text "Hello"
coderclaw nodes canvas a2ui push --node <idOrNameOrIp> --jsonl ./payload.jsonl
coderclaw nodes canvas a2ui reset --node <idOrNameOrIp>

Notes:

Photos + videos (node camera)

Photos (jpg):

coderclaw nodes camera list --node <idOrNameOrIp>
coderclaw nodes camera snap --node <idOrNameOrIp>            # default: both facings (2 MEDIA lines)
coderclaw nodes camera snap --node <idOrNameOrIp> --facing front

Video clips (mp4):

coderclaw nodes camera clip --node <idOrNameOrIp> --duration 10s
coderclaw nodes camera clip --node <idOrNameOrIp> --duration 3000 --no-audio

Notes:

Screen recordings (nodes)

Nodes expose screen.record (mp4). Example:

coderclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10
coderclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10 --no-audio

Notes:

Location (nodes)

Nodes expose location.get when Location is enabled in settings.

CLI helper:

coderclaw nodes location get --node <idOrNameOrIp>
coderclaw nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000

Notes:

SMS (Android nodes)

Android nodes can expose sms.send when the user grants SMS permission and the device supports telephony.

Low-level invoke:

coderclaw nodes invoke --node <idOrNameOrIp> --command sms.send --params '{"to":"+15555550123","message":"Hello from CoderClaw"}'

Notes:

System commands (node host / mac node)

The macOS node exposes system.run, system.notify, and system.execApprovals.get/set. The headless node host exposes system.run, system.which, and system.execApprovals.get/set.

Examples:

coderclaw nodes run --node <idOrNameOrIp> -- echo "Hello from mac node"
coderclaw nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"

Notes:

Exec node binding

When multiple nodes are available, you can bind exec to a specific node. This sets the default node for exec host=node (and can be overridden per agent).

Global default:

coderclaw config set tools.exec.node "node-id-or-name"

Per-agent override:

coderclaw config get agents.list
coderclaw config set agents.list[0].tools.exec.node "node-id-or-name"

Unset to allow any node:

coderclaw config unset tools.exec.node
coderclaw config unset agents.list[0].tools.exec.node

Permissions map

Nodes may include a permissions map in node.list / node.describe, keyed by permission name (e.g. screenRecording, accessibility) with boolean values (true = granted).

Headless node host (cross-platform)

CoderClaw can run a headless node host (no UI) that connects to the Gateway WebSocket and exposes system.run / system.which. This is useful on Linux/Windows or for running a minimal node alongside a server.

Start it:

coderclaw node run --host <gateway-host> --port 18789

Notes:

Mac node mode