---
name: cf-browser
description: Fetch any webpage as markdown, JSON, or screenshot using Cloudflare Browser Rendering. Use when web_fetch fails on JS-heavy pages (SPAs, Zillow, Redfin, PCPAO, Cloudflare-protected sites). Handles full JS rendering on Cloudflare global network.
---

# Cloudflare Browser Rendering

Use this skill when you need to fetch a webpage that WebFetch can't handle — JS-heavy SPAs, sites behind Cloudflare protection, or pages that need full browser rendering to load content.

## When to use

- WebFetch returns empty/incomplete content
- The site is a SPA (React, Vue, etc.) that requires JS execution
- The site is behind Cloudflare bot protection
- You need a visual screenshot of a page
- You need to scrape specific elements via CSS selectors

## How to call

The script is at `/home/johan/clawd/skills/cf-browser/scripts/cf-fetch.sh`.

### Get page as markdown (most common)

```bash
/home/johan/clawd/skills/cf-browser/scripts/cf-fetch.sh markdown https://example.com
```

Returns clean markdown of the rendered page. This is the best option for reading page content.

### Take a screenshot

```bash
/home/johan/clawd/skills/cf-browser/scripts/cf-fetch.sh screenshot https://example.com [output.png]
```

Saves a PNG screenshot to the specified path (defaults to `/tmp/screenshot.png`). Use this when you need to see what a page looks like visually.

### Scrape structured data with CSS selectors

```bash
/home/johan/clawd/skills/cf-browser/scripts/cf-fetch.sh scrape https://example.com ".price, .title"
```

Returns JSON with the text content of elements matching the given CSS selectors. Use this when you need specific data points from a page.

## Interpreting output

- **markdown**: Raw markdown text printed to stdout. Pipe or capture as needed.
- **screenshot**: Prints the output file path on success. View the PNG with your screenshot/image tools.
- **scrape**: JSON array printed to stdout. Each element has `selector`, `results` with matched text content.

## Error handling

If the API returns an error, the script prints the error message to stderr and exits with code 1. Common issues:
- Invalid URL (must include https://)
- Cloudflare API rate limits
- Page timeout (very slow sites)
