<< All versions
Skill v1.0.0
currentTrusted Publisher100/100cloudflare/moltworker/cloudflare-browser
──Details
PublishedJune 17, 2026 at 04:45 AM
Content Hashsha256:2e28b6bd3be81869...
Git SHA
──Files
Files (1 file, 2.9 KB)
SKILL.md2.9 KBactive
SKILL.md · 101 lines · 2.9 KB
version: "1.0.0" name: cloudflare-browser description: Control headless Chrome via Cloudflare Browser Rendering CDP WebSocket. Use for screenshots, page navigation, scraping, and video capture when browser automation is needed in a Cloudflare Workers environment. Requires CDP_SECRET env var and cdpUrl configured in browser.profiles.
Cloudflare Browser Rendering
Control headless browsers via Cloudflare's Browser Rendering service using CDP (Chrome DevTools Protocol) over WebSocket.
Prerequisites
CDP_SECRETenvironment variable set- Browser profile configured in openclaw.json with
cdpUrlpointing to the worker endpoint:
``json "browser": { "profiles": { "cloudflare": { "cdpUrl": "https://your-worker.workers.dev/cdp?secret=..." } } } ``
Quick Start
Screenshot
bash
node /path/to/skills/cloudflare-browser/scripts/screenshot.js https://example.com output.png
Multi-page Video
bash
node /path/to/skills/cloudflare-browser/scripts/video.js "https://site1.com,https://site2.com" output.mp4
CDP Connection Pattern
The worker creates a page target automatically on WebSocket connect. Listen for Target.targetCreated event to get the targetId:
javascript
const WebSocket = require('ws');const CDP_SECRET = process.env.CDP_SECRET;const WS_URL = `wss://your-worker.workers.dev/cdp?secret=${encodeURIComponent(CDP_SECRET)}`;const ws = new WebSocket(WS_URL);let targetId = null;ws.on('message', (data) => {const msg = JSON.parse(data.toString());if (msg.method === 'Target.targetCreated' && msg.params?.targetInfo?.type === 'page') {targetId = msg.params.targetInfo.targetId;}});
Key CDP Commands
| Command | Purpose | |
|---|---|---|
| Page.navigate | Navigate to URL | |
| Page.captureScreenshot | Capture PNG/JPEG | |
| Runtime.evaluate | Execute JavaScript | |
| Emulation.setDeviceMetricsOverride | Set viewport size |
Common Patterns
Navigate and Screenshot
javascript
await send('Page.navigate', { url: 'https://example.com' });await new Promise(r => setTimeout(r, 3000)); // Wait for renderconst { data } = await send('Page.captureScreenshot', { format: 'png' });fs.writeFileSync('out.png', Buffer.from(data, 'base64'));
Scroll Page
javascript
await send('Runtime.evaluate', { expression: 'window.scrollBy(0, 300)' });
Set Viewport
javascript
await send('Emulation.setDeviceMetricsOverride', {width: 1280,height: 720,deviceScaleFactor: 1,mobile: false});
Creating Videos
- Capture frames as PNGs during navigation
- Use ffmpeg to stitch:
ffmpeg -framerate 10 -i frame_%04d.png -c:v libx264 -pix_fmt yuv420p output.mp4
Troubleshooting
- No target created: Race condition - wait for Target.targetCreated event with timeout
- Commands timeout: Worker may have cold start delay; increase timeout to 30-60s
- WebSocket hangs: Verify CDP_SECRET matches worker configuration