Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Interactive element picker for web pages. Opens a browser with click-to-select UI overlay. Use when you need to let users visually select DOM elements, identify element selectors, or get detailed element information interactively. Triggers on "select an element", "pick element", "let me choose", "which element", or any interactive element selection task. Integrates with agent-eyes for visual context.
.claude/skills/majiayu000-agent-canvas/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 75% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 108% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 159% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 8% | 0% |
Interactive element picker that opens a browser window with a DevTools-like selection overlay. Users hover to highlight elements and click to select. Returns detailed element info including selector, bounding box, and computed styles.
Before first use, verify dependencies are installed:
bashuv run .claude/skills/agent-canvas-setup/scripts/check_setup.py check
If checks fail, ask user which installation scope they prefer and run:
bash# Recommended: minimal footprint, uv manages deps on-demand uv run .claude/skills/agent-canvas-setup/scripts/check_setup.py install --scope temporary # Alternative: create .venv in project uv run .claude/skills/agent-canvas-setup/scripts/check_setup.py install --scope local
See agent-canvas-setup skill for full details on installation options.
When using agent-canvas, always follow this pattern:
bash# 1. Launch (user interacts with browser) uv run .claude/skills/agent-canvas/scripts/agent_canvas.py pick http://localhost:3000 --with-edit --with-eyes # 2. After browser closes, read the latest session SESSION_ID=$(ls -t .canvas/sessions/ | head -1) cat .canvas/sessions/$SESSION_ID/session.json | jq '.summary'
bashSKILL_DIR=".claude/skills/agent-canvas/scripts"
Open browser with element picker overlay. Streams selection events as JSON lines until window is closed:
bash# Basic pick - opens browser, streams selections as JSON lines uv run $SKILL_DIR/agent_canvas.py pick http://localhost:3000 # Pick with agent-eyes integration (adds screenshot + detailed styles per selection) uv run $SKILL_DIR/agent_canvas.py pick http://localhost:3000 --with-eyes # Pick with edit panel (floating DevTools for live style editing) uv run $SKILL_DIR/agent_canvas.py pick http://localhost:3000 --with-edit # Full workflow: picker + edit panel + agent-eyes (recommended) uv run $SKILL_DIR/agent_canvas.py pick http://localhost:3000 --with-edit --with-eyes # Save all selections and edits to file when done uv run $SKILL_DIR/agent_canvas.py pick http://localhost:3000 --with-edit --output ./session.json
User interaction:
Streamed output (JSON lines):
json{"event": "session_started", "url": "http://localhost:3000", "timestamp": "...", "features": {"picker": true, "eyes": true, "edit": true}} {"event": "selection", "index": 1, "timestamp": "...", "element": {"tag": "button", "selector": "#submit", ...}} {"event": "style_change", "timestamp": "...", "selector": "#submit", "property": "backgroundColor", "newValue": "#ff0000"} {"event": "session_ended", "timestamp": "...", "total_selections": 1, "total_edits": 1}
With --with-eyes, each selection event also includes eyes (detailed styles) and screenshot fields. With --with-edit, style changes made in the floating panel are emitted as style_change events.
Monitor page for DOM changes, capture screenshots on each change:
bash# Watch with default 2s interval uv run $SKILL_DIR/agent_canvas.py watch http://localhost:3000 # Custom interval uv run $SKILL_DIR/agent_canvas.py watch http://localhost:3000 --interval 5 # Custom output directory uv run $SKILL_DIR/agent_canvas.py watch http://localhost:3000 --output-dir ./snapshots
Outputs JSON events to stdout:
json{"event": "watch_started", "url": "http://localhost:3000", "interval": 2.0} {"event": "change_detected", "iteration": 1, "timestamp": "...", "screenshot": ".canvas/screenshots/..."}
bash uv run $SKILL_DIR/agent_canvas.py pick http://localhost:3000 --with-eyes
bash # Get accessibility info for selected element uv run .claude/skills/agent-eyes/scripts/agent_eyes.py a11y http://localhost:3000 --selector "#selected-element"
bash uv run .claude/skills/agent-eyes/scripts/agent_eyes.py screenshot http://localhost:3000
When --with-eyes flag is used, agent-canvas calls agent-eyes to:
This provides comprehensive visual context for the AI agent to understand and modify the selected element.
When --with-edit flag is used, agent-canvas loads the canvas-edit floating panel:
Recommended workflow:
bashuv run $SKILL_DIR/agent_canvas.py pick http://localhost:3000 --with-edit --with-eyes
This gives users full control to select elements, preview style changes, while the agent receives both the visual context and the specific CSS changes to implement.
Sessions are automatically saved to .canvas/sessions/<sessionId>/ regardless of how the command is run. This is the primary way to retrieve session data - do NOT rely on capturing stdout.
bash# List all sessions (most recent first) ls -lt .canvas/sessions/ | head -5 # Read the latest session cat .canvas/sessions/$(ls -t .canvas/sessions/ | head -1)/session.json # Or use jq for formatted output cat .canvas/sessions/$(ls -t .canvas/sessions/ | head -1)/session.json | jq '.summary'
.canvas/sessions/<sessionId>/
├── session.json # Full event log, selections, edits, screenshots (base64)
└── changes.json # Extracted save_request (if user clicked "Save All to Code")json{ "sessionId": "ses-abc123", "url": "http://localhost:3000", "summary": { "totalSelections": 5, "totalEdits": 3, "hasSaveRequest": true // <-- Check this! false = user didn't save changes }, "events": { "selections": [...], // Element selection events with screenshots "edits": [...] // Style/text changes from edit panel } }
bash# Quick summary cat .canvas/sessions/<sessionId>/session.json | jq '.summary' # See all selections (element info) cat .canvas/sessions/<sessionId>/session.json | jq '.events.selections[] | {selector: .payload.element.selector, text: .payload.element.text}' # See all edits cat .canvas/sessions/<sessionId>/session.json | jq '.events.edits' # Check if save was requested (required for canvas-apply) cat .canvas/sessions/<sessionId>/session.json | jq '.summary.hasSaveRequest'
pick command (user interaction required)watch commandOther measured skills in the registry, with their headline benchmark lift.