Website Screenshot
Take screenshots of any website using Notte browser automation.
How to use it
- Hit Copy the whole skill.
- Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
ChatGPT: make a Project and paste it into Instructions.
Neither? Paste it at the top of a new chat — it works for that chat. - Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/research-tools/capabilities/website-screenshot-notte#main ~/.claude/skills/website-screenshot-notteFor one project only, change the path to .claude/skills/website-screenshot-notte.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Show the full text123 lines
Website Screenshot
Setup
Read your credentials from ~/.gooseworks/credentials.json:
export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])")
export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")
If ~/.gooseworks/credentials.json does not exist, tell the user to run: npx gooseworks login
All endpoints use Bearer auth: -H "Authorization: Bearer $GOOSEWORKS_API_KEY"
Take screenshots of any website URL and save them as image files.
Requirements
- Orthogonal CLI:
npm install -g @orth/cli
Workflow
Take a screenshot of a URL in 4 steps:
Step 1: Start a browser session
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/start","body":{"headless":true}}'
Save the session_id from the response.
Step 2: Navigate to the URL
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/execute","body":{"type":"goto","url":"https://example.com"}}'
Step 3: Take the screenshot
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/screenshot","body":{}}'
For a full-page screenshot:
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/screenshot","body":{"full_page":true}}'
Step 4: Stop the session
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/stop"}'
Full Example
# 1. Start session
SESSION=$(curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/start","body":{"headless":true}}' | python3 -c "import json,sys;d=json.load(sys.stdin);print(json.dumps(d.get('data',d)))" | python3 -c "import sys,json; print(json.load(sys.stdin)['session_id'])")
# 2. Navigate
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/$SESSION/page/execute","body":{"type":"goto","url":"https://example.com"}}'
# 3. Screenshot
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/$SESSION/page/screenshot","body":{}}'
# 4. Cleanup
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/$SESSION/stop"}'
Options
| Parameter | Description |
|---|---|
full_page |
Set to true to capture the entire scrollable page |
headless |
Set to false to see the browser window (default: true) |
viewport_width |
Custom viewport width in pixels |
viewport_height |
Custom viewport height in pixels |
Tips
- Always stop the session when done to free resources
- Sessions auto-expire after 3 minutes of idle time
- Use
-oflag to save the screenshot to a file (required for binary data) - The output file must not already exist (use a unique name or delete first)
| 1 | |
| 2 | name website-screenshot-notte |
| 3 | description Take screenshots of any website using Notte browser automation. Use when asked to screenshot, capture, or snap a webpage. |
| 4 | source orthogonal |
| 5 | |
| 6 | |
| 7 | |
| 8 | # Website Screenshot |
| 9 | |
| 10 | ## Setup |
| 11 | |
| 12 | Read your credentials from ~/.gooseworks/credentials.json: |
| 13 | |
| 14 | export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])") |
| 15 | export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))") |
| 16 | |
| 17 | |
| 18 | If ~/.gooseworks/credentials.json does not exist, tell the user to run: `npx gooseworks login` |
| 19 | |
| 20 | All endpoints use Bearer auth: `-H "Authorization: Bearer $GOOSEWORKS_API_KEY"` |
| 21 | |
| 22 | |
| 23 | Take screenshots of any website URL and save them as image files. |
| 24 | |
| 25 | ## Requirements |
| 26 | |
| 27 | Orthogonal CLI: `npm install -g @orth/cli` |
| 28 | |
| 29 | ## Workflow |
| 30 | |
| 31 | Take a screenshot of a URL in 4 steps: |
| 32 | |
| 33 | ### Step 1: Start a browser session |
| 34 | |
| 35 | |
| 36 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 37 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 38 | -H "Content-Type: application/json" \ |
| 39 | -d '{"api":"notte","path":"/sessions/start","body":{"headless":true}}' |
| 40 | |
| 41 | |
| 42 | Save the `session_id` from the response. |
| 43 | |
| 44 | ### Step 2: Navigate to the URL |
| 45 | |
| 46 | |
| 47 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 48 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 49 | -H "Content-Type: application/json" \ |
| 50 | -d '{"api":"notte","path":"/sessions/{session_id}/page/execute","body":{"type":"goto","url":"https://example.com"}}' |
| 51 | |
| 52 | |
| 53 | ### Step 3: Take the screenshot |
| 54 | |
| 55 | |
| 56 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 57 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 58 | -H "Content-Type: application/json" \ |
| 59 | -d '{"api":"notte","path":"/sessions/{session_id}/page/screenshot","body":{}}' |
| 60 | |
| 61 | |
| 62 | For a full-page screenshot: |
| 63 | |
| 64 | |
| 65 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 66 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 67 | -H "Content-Type: application/json" \ |
| 68 | -d '{"api":"notte","path":"/sessions/{session_id}/page/screenshot","body":{"full_page":true}}' |
| 69 | |
| 70 | |
| 71 | ### Step 4: Stop the session |
| 72 | |
| 73 | |
| 74 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 75 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 76 | -H "Content-Type: application/json" \ |
| 77 | -d '{"api":"notte","path":"/sessions/{session_id}/stop"}' |
| 78 | |
| 79 | |
| 80 | ## Full Example |
| 81 | |
| 82 | |
| 83 | # 1. Start session |
| 84 | SESSION=$(curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 85 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 86 | -H "Content-Type: application/json" \ |
| 87 | -d '{"api":"notte","path":"/sessions/start","body":{"headless":true}}' | python3 -c "import json,sys;d=json.load(sys.stdin);print(json.dumps(d.get('data',d)))" | python3 -c "import sys,json; print(json.load(sys.stdin)['session_id'])") |
| 88 | |
| 89 | # 2. Navigate |
| 90 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 91 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 92 | -H "Content-Type: application/json" \ |
| 93 | -d '{"api":"notte","path":"/sessions/$SESSION/page/execute","body":{"type":"goto","url":"https://example.com"}}' |
| 94 | |
| 95 | # 3. Screenshot |
| 96 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 97 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 98 | -H "Content-Type: application/json" \ |
| 99 | -d '{"api":"notte","path":"/sessions/$SESSION/page/screenshot","body":{}}' |
| 100 | |
| 101 | # 4. Cleanup |
| 102 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 103 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 104 | -H "Content-Type: application/json" \ |
| 105 | -d '{"api":"notte","path":"/sessions/$SESSION/stop"}' |
| 106 | |
| 107 | |
| 108 | ## Options |
| 109 | |
| 110 | | Parameter | Description | |
| 111 | |-----------|-------------| |
| 112 | | `full_page` | Set to `true` to capture the entire scrollable page | |
| 113 | | `headless` | Set to `false` to see the browser window (default: true) | |
| 114 | | `viewport_width` | Custom viewport width in pixels | |
| 115 | | `viewport_height` | Custom viewport height in pixels | |
| 116 | |
| 117 | ## Tips |
| 118 | |
| 119 | Always stop the session when done to free resources |
| 120 | Sessions auto-expire after 3 minutes of idle time |
| 121 | Use `-o` flag to save the screenshot to a file (required for binary data) |
| 122 | The output file must not already exist (use a unique name or delete first) |
| 123 |
Discussion
Alternatives
Also in Scraping & extractionAI Crawler Access Analysis SkillAI crawler access analysis. Checks robots.txt, meta tags, and HTTP headers to determine which AI crawlers can access the site. Provides a complete access map and recommendations for maximizing AI visibility while maintaining appropriate control.Blog feed monitorScrape blog posts via RSS feeds (free, no API key) with Apify fallback for JS-heavy sites. Use when you need to monitor competitor blogs, track industry content, or aggregate blog posts by keyword.Extract webpage dataExtract structured data from web pages using AINotte - Browser Automation APIBrowser automation - control browser sessions, scrape pages, and run AI agents