* refactor(monitor): unify action node lifecycle in addAction function - Updated the addAction function to consolidate the handling of action types (start, streaming, complete, error, aborted) into a single node per runId, improving data consistency and reducing redundancy. - Enhanced the logic to ensure that all states for the same runId share one node ID, streamlining the update process and maintaining accurate session state representation. * refactor(parser): streamline event handling for lifecycle and assistant streams - Updated the agentEventToAction function to remove placeholder content for lifecycle events, relying on UI labels for clarity. - Enhanced parseEventFrame to process assistant stream events, allowing for the inclusion of streaming content while maintaining lifecycle event handling. - Improved overall event processing logic for better data consistency and clarity in session representation. * fix(parser): enhance text handling in agentEventToAction and parseEventFrame - Updated agentEventToAction to handle both 'text' type and string text properties for improved event processing. - Modified parseEventFrame to accommodate the new structure of assistant stream events, ensuring accurate handling of streaming content. - This change enhances the robustness of event parsing and improves data consistency across different event types. * refactor(monitor): update ActionNode component for improved state representation - Replaced the Play icon with Loader2 for the 'start' state to better reflect the action's progress. - Adjusted border and background colors to enhance visual distinction for the 'start' state. - Enabled animation for the 'start' state, improving user feedback during action execution. * refactor(graph-layout): improve session sorting for stable layout representation - Updated the sorting logic for rootSessions to use session keys instead of lastActivityAt, ensuring stable node positions during streaming and preventing unintended swaps in the layout.
🦀 Crabwalk
Real-time companion monitor for Moltbot (Clawdbot) agents by @luccasveg.
Watch your AI agents work across WhatsApp, Telegram, Discord, and Slack in a live node graph. See thinking states, tool calls, and response chains as they happen.
Features
- Live activity graph - ReactFlow visualization of agent sessions and action chains
- Multi-platform - Monitor agents across all messaging platforms simultaneously
- Real-time streaming - WebSocket connection to clawdbot gateway
- Action tracing - Expand nodes to inspect tool args and payloads
- Session filtering - Filter by platform, search by recipient
Installation
Docker (recommended)
docker run -d \
-p 3000:3000 \
-e CLAWDBOT_API_TOKEN=your-token \
-e CLAWDBOT_URL=ws://host.docker.internal:18789 \
ghcr.io/luccast/crabwalk:latest
Note: When running Crabwalk in Docker, the Moltbot gateway typically runs on the host. Use
CLAWDBOT_URL=ws://host.docker.internal:18789so the container can connect. If you're running Moltbot withbind: loopbackandtailscale servefor secure tailnet-only access, you'll need to run the crabwalk container with host networking - replacep:3000:3000with--network hostThis allows the container to reach 127.0.0.1:18789 while maintaining the security benefits of loopback-only binding.
Or with docker-compose:
curl -O https://raw.githubusercontent.com/luccast/crabwalk/master/docker-compose.yml
CLAWDBOT_API_TOKEN=your-token CLAWDBOT_URL=ws://host.docker.internal:18789 docker-compose up -d
If gateway is
bind: loopbackonly, you will need to edit thedocker-compose.ymlto addnetwork_mode: host
From source
git clone https://github.com/luccast/crabwalk.git
cd crabwalk
npm install
CLAWDBOT_API_TOKEN=your-token npm run dev
Open http://localhost:3000/monitor
Configuration
Requires clawdbot gateway running on the same machine.
Gateway Token
Find your token in the clawdbot config file:
# Look for gateway.auth.token
cat ~/.clawdbot/clawdbot.json | rg "gateway\.auth\.token"
Or with jq:
jq '.gateway.auth.token' ~/.clawdbot/clawdbot.json
Or copy it directly:
export CLAWDBOT_API_TOKEN=$(python3 -c "import json,os; print(json.load(open(os.path.expanduser('~/.clawdbot/clawdbot.json')))['gateway']['auth']['token'])")
Accessing from a remote host
If you are running this on a remote server and accessing it through a non-local browser, the default allowedHosts behaviour will prevent access to the web UI.
If running in docker, you can pass the environment variable ALLOWED_HOSTS with a comma-separated list of hosts you wish to allow access to the crabwalk UI.
If running from source, you can either pass ALLOWED_HOSTS as an env var at the command line, or use a .env file.
Stack
TanStack Start, ReactFlow, Framer Motion, tRPC, TanStack DB

