---
name: browser
description: Web browsing via Chrome relay or headless Chromium
default_model: K2.5
---

# Skill: Browser Automation

**Route all browsing tasks to the `k2-browser` agent** (uses K2.5 model).

## Spawning Browser Tasks

From main agent, delegate browsing to K2.5:
```
clawdbot agent --agent k2-browser --message "Browse to X and summarize Y"
```

Or use sessions_spawn tool:
```json
{"agent": "k2-browser", "message": "Browse to https://example.com and extract..."}
```

## Quick Reference

### Available Actions

| Action | Required Params | Description |
|--------|-----------------|-------------|
| `tabs` | — | List open tabs |
| `open` | `targetUrl` | Open new tab with URL |
| `navigate` | `targetUrl`, `targetId` | Navigate existing tab |
| `snapshot` | `targetId` | Get page content (aria tree) |
| `screenshot` | `targetId` | Get page screenshot |
| `act` | `targetId`, `request` | Click/type/interact |

### Profiles

- `profile="chrome"` — Chrome relay (authenticated sites like X.com)
- `profile="fast"` — Headless Chromium (general automation)

## Examples

### 1. List tabs
```json
{"action": "tabs", "profile": "chrome"}
```

### 2. Open a new tab
```json
{"action": "open", "profile": "chrome", "targetUrl": "https://example.com"}
```

### 3. Navigate existing tab
```json
{"action": "navigate", "profile": "chrome", "targetId": "ABC123", "targetUrl": "https://example.com"}
```

### 4. Get page content
```json
{"action": "snapshot", "profile": "chrome", "targetId": "ABC123"}
```

### 5. Click an element (use ref from snapshot)
```json
{"action": "act", "profile": "chrome", "targetId": "ABC123", "request": {"kind": "click", "ref": "e42"}}
```

### 6. Type text
```json
{"action": "act", "profile": "chrome", "targetId": "ABC123", "request": {"kind": "type", "ref": "e15", "text": "hello world"}}
```

## Common Mistakes (AVOID THESE)

❌ **Wrong:** `{"action": "navigate", "url": "https://..."}`
✓ **Right:** `{"action": "navigate", "targetUrl": "https://...", "targetId": "..."}`

❌ **Wrong:** `{"action": "open"}` (missing targetUrl)
✓ **Right:** `{"action": "open", "targetUrl": "https://..."}`

❌ **Wrong:** `{"action": "snapshot"}` (missing targetId)
✓ **Right:** `{"action": "snapshot", "targetId": "ABC123"}`

## Workflow

1. **Get tabs:** `browser(action="tabs", profile="chrome")`
2. **Open/navigate:** Use `targetUrl` for the URL
3. **Read content:** `browser(action="snapshot", targetId="...")` 
4. **Interact:** `browser(action="act", targetId="...", request={...})`

## K2.5 Tips (IMPORTANT)

K2.5 chokes on large snapshots. **Always use `maxChars`**:

```json
{"action": "snapshot", "profile": "chrome", "targetId": "ABC123", "maxChars": 10000}
```

Without this, K2.5 will timeout on content-heavy pages.

## Alternative: web_fetch

For simple page reading without interaction, use `web_fetch` instead:

```json
{"url": "https://example.com"}
```

This is simpler and doesn't require browser profiles or targetIds. Note: Some sites (nu.nl) block web_fetch with 403 — use browser tool instead.
