Focused operator studio for OpenClaw. Connect to your gateway, manage agents, run chats, monitor system metrics, configure cron schedules, and handle exec approvals — all from one interface.
- Node.js 20.9+ with
npm - OpenClaw installed and running on your gateway machine
- GitHub CLI (
gh) authenticated (for auto-fix skill)
git clone https://github.com/simonCatBot/rocclaw.git
cd rocclaw
npm install
npm run devOpen http://localhost:3000.
If OpenClaw and rocCLAW run on the same machine, you need extra configuration because browsers block WebSocket connections to non-localhost origins.
Set the gateway to allow LAN connections and disable strict device identity checks:
# Allow connections from LAN (not just 127.0.0.1)
openclaw config set gateway.bind lan
# Allow control-ui to connect without strict HTTPS/localhost checks
openclaw config set gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback true
openclaw config set gateway.controlUi.dangerouslyDisableDeviceAuth true
# Restart the gateway
openclaw gateway restart
⚠️ Security note: These settings relax security checks. Only use them on trusted local networks or single-user machines.
Create a .env file in your rocCLAW directory. Replace YOUR_USERNAME with your actual username:
cat > .env << 'EOF'
# rocclaw .env - Local development configuration
# Point to your OpenClaw state directory (update YOUR_USERNAME)
OPENCLAW_STATE_DIR=/home/YOUR_USERNAME/.openclaw
# Gateway URL - MUST use localhost for browser security
NEXT_PUBLIC_GATEWAY_URL=ws://127.0.0.1:18789
# SSH target for gateway operations (optional - for agent workspace cleanup)
# Only needed if rocCLAW and OpenClaw are on different machines
OPENCLAW_GATEWAY_SSH_TARGET=
OPENCLAW_GATEWAY_SSH_USER=
EOFExample for user "alice":
OPENCLAW_STATE_DIR=/home/alice/.openclaw
NEXT_PUBLIC_GATEWAY_URL=ws://127.0.0.1:18789Important:
NEXT_PUBLIC_GATEWAY_URLmust use127.0.0.1orlocalhost, not your machine's LAN IP.
openclaw config get gateway.auth.tokenCopy this token — you'll paste it into rocCLAW.
npm run dev- Open http://localhost:3000 (must use
localhost, not IP) - Enter gateway URL:
ws://127.0.0.1:18789 - Paste the token from step 3
- Click Test Connection — should show "Connection test succeeded"
- Click Save Settings
| Gateway location | Upstream URL | Prerequisites |
|---|---|---|
| Same machine | ws://localhost:18789 |
See same-machine setup above |
| Tailscale | wss://<gateway-host>.ts.net |
Tailscale on both ends, HTTPS enabled |
| SSH tunnel | ws://localhost:18789 |
Run ssh -L 18789:127.0.0.1:18789 user@gateway-host |
| Cloud with TLS | wss://<vm-address> |
Valid SSL certificate on gateway |
Your OpenClaw gateway is rejecting the connection because the browser's security context doesn't match. Fix:
- Ensure you're accessing rocCLAW via
http://localhost:3000, nothttp://<ip>:3000 - Add these OpenClaw settings:
openclaw config set gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback true openclaw config set gateway.controlUi.dangerouslyDisableDeviceAuth true openclaw gateway restart
The test uses a different path than the actual WebSocket. Make sure:
NEXT_PUBLIC_GATEWAY_URLuses127.0.0.1orlocalhost, not a LAN IP- You restarted rocCLAW after creating
.env
Delete the saved settings to reset:
rm ~/.openclaw/openclaw-studio/settings.jsonThen reconnect via http://localhost:3000.
If you see The git reference could not be found, the @multiavatar/multiavatar dependency has an invalid commit hash. This was fixed in PR #10 — pull the latest code:
git pull origin main
npm installrocCLAW is a server-side dashboard — the browser never connects directly to the gateway.
Browser ──HTTP/SSE──► rocCLAW Server ──WebSocket──► OpenClaw Gateway
(Next.js + ws) (your AI runtime)
• owns the gateway connection
• writes events to SQLite outbox
• redacts the gateway token from the browser
• enforces rate limits
The server maintains a SQLite outbox of all gateway events. When the browser reconnects, it replays from its last-seen event ID so nothing is missed.
Create, rename, and delete agents. Each agent has personality files (SOUL.md, AGENTS.md, USER.md, IDENTITY.md) that live in its workspace directory on the gateway host.
Agent creation captures only a name and avatar. rocCLAW then applies a permissive default: commands set to Auto, web access on, file tools on.
Real-time messaging via SSE. Controls in the chat header:
- New session — clears the conversation context
- Model / Thinking level — per-session overrides
- Tool calls / Thinking traces — toggle visibility of internal reasoning and tool use in the transcript
- Stop run — halt the current agent run
Live gauges for CPU, memory, GPU, disk, and network. Data comes from the machine running rocCLAW.
Schedule agent runs using cron expressions. Schedules survive gateway restarts. Run immediately or on a timer.
When an agent's command is blocked by the approval policy, rocCLAW shows an in-chat card:
- Allow once — approve this exact command for this run
- Allow always — add the command pattern to the agent's permanent allowlist
- Deny — block this time
Approvals are enforced by the gateway — they survive rocCLAW being offline.
Per-agent token consumption dashboard.
rocCLAW exposes four settings that control what an agent can do. For the full model, see Permissions & Sandboxing.
| Setting | Options | What it controls |
|---|---|---|
| Command mode | Off / Ask / Auto | Whether exec commands need approval, run silently, or are blocked |
| Sandbox mode | Off / Non-main / All | Whether sessions run sandboxed (non-main = everything except the main session) |
| Workspace access | None / Read-only / Read-write | What the sandbox can see of the agent's workspace |
| Tools profile | Minimal / Coding / Messaging / Full | Which tool groups are available |
Warning
workspaceAccess = Read-only does more than it sounds. It also disables the agent's write, edit, and apply_patch tools inside sandboxed sessions — even when those tools are nominally allowed by the tools profile. This is enforced by the gateway.
Both machines on the same tailnet. On the gateway machine, set gateway.bind to your Tailscale IP or hostname:
# On the gateway machine — find your Tailscale IP
ip addr show tailscale0 | grep inet
# Set and restart
openclaw config set gateway.bind <tailscale-ip>
openclaw restartThen use wss://<gateway-host>.ts.net as the Upstream URL in rocCLAW.
# On your laptop
ssh -L 18789:127.0.0.1:18789 user@gateway-hostKeep the tunnel open. Connect rocCLAW to ws://localhost:18789.
- Is the gateway running?
openclaw status - Is the URL correct? (
ws://for plain,wss://for TLS — mixing them causesEPROTO) - Is the token correct?
openclaw config get gateway.auth.token - Is the port right?
openclaw config get gateway.port - Is the network/firewall allowing outbound WebSocket connections?
- rocCLAW itself: if you set
ROCCLAW_ACCESS_TOKENon the server, clients must send it as a bearer header - Gateway: the gateway token is wrong or expired — re-run the config command and paste fresh
npm run verify:native-runtime:repairIf that fails: xcode-select --install (macOS) or sudo apt install build-essential python3 (Ubuntu).
The server reconnects with exponential back-off (1s → 15s max). Frequent drops usually mean the gateway machine is under memory or GPU pressure.
- Check the sidebar: ● running, ○ offline
- Look for a pending exec approval card in chat
- Try a new session (chat header → New session)
- Check gateway logs on the host
Not sure where to look? Start here:
| What you want | Go to |
|---|---|
| How to connect, what it looks like | This README |
| How each settings tab works | UI Guide |
| How chat events flow from gateway to browser | Chat Streaming |
| Sandbox modes, workspace access, exec approvals in depth | Permissions & Sandboxing |
| Project structure, route inventory, event model | Architecture |
| Dev setup, testing, contributing | CONTRIBUTING.md |
See LICENSE