| name | camera-claw | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| description | Security camera for your AI agent — sandbox, record, and monitor OpenClaw | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| version | 2026.3.12 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| icon | assets/camera-claw-icon.png | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| entry | scripts/monitor.js | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| deploy | deploy.sh | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| requirements |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| parameters |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| capabilities |
|
A security camera for your AI agent.
Security cameras watch people. Camera Claw watches AI agents. You wouldn't let a stranger into your house without a security camera — why let an AI agent run on your machine without one?
Camera Claw provides three layers:
- The Room — A Docker sandbox with a virtual desktop (Xvfb + Chrome) for OpenClaw
- The Camera — KasmVNC live view + periodic snapshots with metadata
- The DVR — Snapshot timeline with agent logs, network events, and optional VLM analysis
Each OpenClaw instance runs in an isolated Docker stack with a virtual desktop:
| Service | Image | Purpose |
|---|---|---|
openclaw-gateway |
openclaw:local |
AI agent gateway + Control UI (port 18789) |
openclaw-cli |
Same image | CLI for onboarding, channel setup |
Inside the container: Xvfb (virtual display :99) + Chrome + KasmVNC (integrated VNC server + web client on :6080).
Each instance = separate docker-compose stack with unique ports and config.
Communicates via JSON lines over stdin/stdout.
All events emitted by CameraClaw on stdout reach the Aegis frontend via skill-response in skill-runtime-manager.cjs. The frontend filters by skillId === 'camera-claw' and dispatches to the appropriate handler.
CameraClaw can request Aegis services (LLM, VLM, system info) via the inline query protocol — no direct HTTP connection needed.
{"event":"ready", "mode":"docker", "openclaw_version":"latest", "monitoring":true}
{"event":"instance_started", "instance_id":"default", "gateway_url":"http://localhost:18789", "kasmvnc_url":"http://localhost:6080", "token":"abc123...", "name":"Default Agent"}
{"event":"instance_stopped", "instance_id":"default", "reason":"user_request"}
{"event":"error", "message":"Docker daemon not running", "retriable":false}{"event":"vnc_ready", "instance_id":"default", "kasmvnc_url":"http://localhost:6080", "view_only_url":"http://localhost:6080/?viewOnly=true"}
{"event":"snapshot", "instance_id":"default", "path":"/abs/path/snap_001.jpg", "ts":"2026-03-11T14:00:05Z", "screen_diff_pct":42.3}
{"event":"screen_change", "instance_id":"default", "diff_pct":42.3, "snapshot_path":"/abs/path/snap_002.jpg", "ts":"2026-03-11T14:00:07Z"}
{"event":"activity_summary", "instance_id":"default", "status":"active", "ts":"2026-03-11T14:00:10Z", "vlm_summary":"Agent is composing a tweet about AI developments", "vlm_safety":"ok"}
{"event":"idle", "instance_id":"default", "idle_since":"2026-03-11T14:10:00Z", "idle_seconds":120}{"event":"console", "instance_id":"default", "stream":"stdout", "line":"Agent started task: browse twitter", "ts":"..."}
{"event":"network", "instance_id":"default", "remote_ip":"104.244.42.1", "domain":"twitter.com", "remote_port":443, "direction":"outbound", "ts":"..."}
{"event":"alert", "instance_id":"default", "type":"unknown_connection", "detail":"Connection to 185.43.210.1:8080", "ts":"..."}
{"event":"health", "instance_id":"default", "cpu_percent":12.3, "memory_mb":256, "uptime_seconds":3600, "ts":"..."}CameraClaw can request VLM analysis from Aegis without direct HTTP:
{"query":"vlm_chat", "id":1, "messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,..."}},{"type":"text","text":"Describe what the AI agent is doing on screen. Note any concerns."}]}], "max_tokens":256}Aegis responds on stdin:
{"response":1, "ok":true, "content":"Agent is browsing twitter.com/home, scrolling through the feed. No concerns.", "model":"gemma-3-4b", "usage":{"prompt_tokens":800,"completion_tokens":45}}{"command":"create_instance", "instance_id":"work", "name":"Work Agent"}
{"command":"stop_instance", "instance_id":"work"}
{"command":"list_instances"}
{"command":"stop"}{"command":"pause_recording", "instance_id":"default"}
{"command":"resume_recording", "instance_id":"default"}
{"command":"take_snapshot", "instance_id":"default"}{"command":"analyze_screen", "instance_id":"default"}Triggers an immediate VLM analysis of the current screen. CameraClaw captures a snapshot, sends a
vlm_chatquery to Aegis, and emits anactivity_summaryevent with the result.
Messages without a command field (e.g. detection frame events from other skills) are silently ignored.
The OpenClaw desktop appears as a camera tile using KasmVNC in view-only mode:
// Frontend: embed KasmVNC iframe with viewOnly=true for monitor tile
const iframe = document.createElement('iframe');
iframe.src = viewOnlyUrl; // http://localhost:6080/?viewOnly=true
iframe.style.cssText = 'width:100%;height:100%;border:none';
tileElement.appendChild(iframe);- Live desktop stream, scaled to thumbnail
- Click tile → opens OpenClaw Panel (switches to interactive)
- Motion indicator when
screen_changeevents arrive
Full interactive KasmVNC session:
// Frontend: embed KasmVNC iframe with full interaction for panel
const iframe = document.createElement('iframe');
iframe.src = kasmvncUrl; // http://localhost:6080 (interactive)
iframe.style.cssText = 'width:100%;height:100%;border:none';
iframe.allow = 'clipboard-read; clipboard-write';
panelElement.appendChild(iframe);- Full mouse/keyboard control
- Clipboard sharing enabled
- Used for onboarding, configuration, manual intervention
CameraClaw handles recording internally:
- Periodic snapshots at
snapshot_fpsrate (default 0.5 fps) - Screen diff between consecutive snapshots
- If diff >
screen_change_threshold→ emitscreen_changeevent - Metadata enrichment: each snapshot paired with agent logs + network events
- VLM analysis (if enabled): triggered on significant changes or periodically
- Storage: snapshots + JSONL metadata in
~/.aegis-ai/media/camera-claw/<instance_id>/
~/.aegis-ai/media/camera-claw/default/
├── 2026-03-11/
│ ├── snaps/
│ │ ├── 14-00-01.jpg
│ │ ├── 14-00-03.jpg
│ │ └── 14-00-05.jpg
│ └── timeline.jsonl ← enriched metadata per snapshot
Each line in timeline.jsonl:
{"ts":"2026-03-11T14:00:01Z", "snap":"snaps/14-00-01.jpg", "diff_pct":0, "agent_log":"Browsing feed", "network":[{"domain":"twitter.com","bytes":45200}]}
{"ts":"2026-03-11T14:00:05Z", "snap":"snaps/14-00-05.jpg", "diff_pct":42.3, "agent_log":"Composing tweet", "vlm":"Agent composing tweet about AI", "vlm_safety":"ok"}./deploy.sh # Node.js deps + Docker image build (with KasmVNC) + config dir setup- Checks for Node.js ≥18
- Runs
npm install - Verifies Docker and Docker Compose
- Creates
~/.openclaw/config directory - Builds OpenClaw Docker image (with KasmVNC + desktop packages)
- Validates
docker-compose.yml