SnapRender

v1.5.0

Give your agent eyes on the web — screenshot any URL as an image file. Supports device emulation (iPhone, iPad, Pixel, MacBook), dark mode, full-page scroll,...

0· 925·1 current·1 all-time
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
Name/description (web screenshots, device emulation, dark mode, signed URLs) match the declared requirements: curl and jq are used to POST JSON to a screenshot API, and SNAPRENDER_API_KEY is the only required environment variable. Nothing requested appears unrelated to taking screenshots.
Instruction Scope
SKILL.md gives explicit curl/jq commands to POST url/html/markdown and to write the base64 image and metadata to /tmp. It limits behavior (use exec, do not use browser tool), recommends safe jq --arg usage to avoid shell injection, and only references the API key it declares. The instructions do write to /tmp and save metadata, which is expected for this task.
Install Mechanism
No install spec (instruction-only), so nothing is downloaded or written to disk beyond what the exec commands create at runtime. This is the lowest-risk model for a skill of this type.
Credentials
Only a single environment variable (SNAPRENDER_API_KEY) is required, which is proportional to an API-based screenshot service. No other secrets, unrelated credentials, or config paths are requested.
Persistence & Privilege
The skill is not always-enabled and uses normal autonomous invocation defaults. It does not request persistent system privileges or modify other skills' configs. Its runtime behavior writes temporary files to /tmp, which is expected for saving screenshots.
Assessment
This skill appears coherent for a screenshot API: it only needs curl, jq, and an API key. Before installing: 1) Ensure the SNAPRENDER_API_KEY you provide is from a trusted provider and is scoped/minimal where possible. 2) Understand that screenshots may capture sensitive data — saved images are written to /tmp and signed URLs can be shared publicly, so avoid rendering private content unless you trust the service. 3) Monitor usage and remaining credits (the API returns remainingCredits) and rotate the key if it is ever shared. 4) Because the skill uses the exec tool, verify your runtime's exec sandboxing/policies if you have strict execution controls. If you need stronger assurance, verify the service domain (app.snap-render.com) and the provider's privacy/retention policies before supplying your API key.

Like a lobster shell, security has layers — review code before you run it.

Runtime requirements

Binscurl, jq
EnvSNAPRENDER_API_KEY
ai-agentvk97c0ft3c0sfzk021b5kr8927981az39latestvk97ds5j0zyckw82p9bf7kvy9x184kg63mcpvk97c0ft3c0sfzk021b5kr8927981az39monitoringvk97c0ft3c0sfzk021b5kr8927981az39screenshotvk97c0ft3c0sfzk021b5kr8927981az39visionvk97c0ft3c0sfzk021b5kr8927981az39visual-analysisvk97c0ft3c0sfzk021b5kr8927981az39webvk97c0ft3c0sfzk021b5kr8927981az39
925downloads
0stars
10versions
Updated 1w ago
v1.5.0
MIT-0

SnapRender — Give Your Agent Eyes

Your agent can read the web but can't see it. One command and it captures pixel-perfect screenshots — any site, any device, in seconds.

"Screenshot stripe.com on iPhone", "Compare desktop vs mobile", "Full-page dark mode capture" — just ask.

Free tier: 500 screenshots/month, no credit card. Get a key ->


IMPORTANT: Use the exec tool with curl. NEVER use the browser tool for screenshots.

How to Capture

Run this command via the exec tool. Replace TARGET_URL with the target URL:

jq -n --arg url 'TARGET_URL' \
  '{url: $url, response_type: "json", format: "jpeg", quality: 60, block_ads: true, block_cookie_banners: true}' \
| curl -s -X POST "https://app.snap-render.com/v1/screenshot" \
  -H "X-API-Key: $SNAPRENDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- \
| tee /tmp/snap_response.json \
| jq -r '.image' | sed 's|data:image/[^;]*;base64,||' | base64 -d > /tmp/screenshot.jpg \
&& jq '{url, format, size, cache, responseTime, remainingCredits}' /tmp/snap_response.json

This saves the screenshot to /tmp/screenshot.jpg and prints metadata.

Rules

  1. Use exec tool only — NEVER the browser tool
  2. $SNAPRENDER_API_KEY is already set — use it literally in the command, do NOT replace it
  3. Always build JSON with jq --arg — never interpolate user input directly into shell strings or JSON. Pass values via jq -n --arg to prevent injection
  4. Always use format=jpeg&quality=60 — keeps response small enough for the agent context
  5. Always pipe to save the image to a file — the base64 response is too large to display inline
  6. Report metadata to the user — file size, response time, cache status, remaining credits

Render HTML or Markdown

Use POST with a JSON body to render raw HTML or Markdown content (no URL needed). Always use jq --arg to safely pass content:

# HTML
jq -n --arg html '<html><body><h1>Hello</h1><p>World</p></body></html>' \
  '{html: $html, format: "jpeg", quality: 60, response_type: "json"}' \
| curl -s -X POST "https://app.snap-render.com/v1/screenshot" \
  -H "X-API-Key: $SNAPRENDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- \
| tee /tmp/snap_response.json \
| jq -r '.image' | sed 's|data:image/[^;]*;base64,||' | base64 -d > /tmp/screenshot.jpg \
&& jq '{source, format, size, cache, responseTime, remainingCredits}' /tmp/snap_response.json
# Markdown
jq -n --arg md '# Hello World\n\nThis is **bold** text.' \
  '{markdown: $md, format: "jpeg", quality: 60, response_type: "json"}' \
| curl -s -X POST "https://app.snap-render.com/v1/screenshot" \
  -H "X-API-Key: $SNAPRENDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- \
| tee /tmp/snap_response.json \
| jq -r '.image' | sed 's|data:image/[^;]*;base64,||' | base64 -d > /tmp/screenshot.jpg \
&& jq '{source, format, size, cache, responseTime, remainingCredits}' /tmp/snap_response.json

Provide exactly one of url, html, or markdown in the JSON body. HTML max 2MB, Markdown max 500KB.

Signed URLs

Generate a pre-signed URL that anyone can use to view the screenshot without an API key. Signing is free; rendering the URL costs one credit.

jq -n --arg url 'TARGET_URL' \
  '{url: $url, expires_in: 86400}' \
| curl -s -X POST "https://app.snap-render.com/v1/screenshot/sign" \
  -H "X-API-Key: $SNAPRENDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- \
| jq '.'

The response contains signed_url, expires_at, and expires_in. Use the signed_url in <img> tags, share it, or open it in a browser. No API key needed to render it.

Parameters

Pass as fields in the JSON body:

ParameterValuesDefault
urltarget URLrequired
response_typejsonjson (always use this)
formatjpeg, png, webp, pdfjpeg
quality1-10060
deviceiphone_14, iphone_15_pro, pixel_7, ipad_pro, macbook_prodesktop
dark_modetrue, falsefalse
full_pagetrue, falsefalse
block_adstrue, falsetrue
block_cookie_bannerstrue, falsetrue
width320-38401280
height200-10000800
delay0-100000 (ms wait after page load)
cachetrue, falsefalse (set true to enable caching)
cache_ttl0-259200086400 (seconds, clamped to plan max)
hide_selectorsCSS selectorsnone (comma-separated, hides elements before capture)
click_selectorCSS selectornone (clicks element before capture)
user_agentstringdefault Chrome UA

To add extra options, include them as fields in the jq JSON object. Example for dark mode on iPhone:

jq -n --arg url 'TARGET_URL' \
  '{url: $url, response_type: "json", format: "jpeg", quality: 60, block_ads: true, block_cookie_banners: true, device: "iphone_15_pro", dark_mode: true}' \
| curl -s -X POST ...

Examples

Desktop screenshot of stripe.com:

jq -n --arg url 'https://stripe.com' '{url: $url, response_type: "json", format: "jpeg", quality: 60, block_ads: true, block_cookie_banners: true}' | curl -s -X POST "https://app.snap-render.com/v1/screenshot" -H "X-API-Key: $SNAPRENDER_API_KEY" -H "Content-Type: application/json" -d @- | tee /tmp/snap_response.json | jq -r '.image' | sed 's|data:image/[^;]*;base64,||' | base64 -d > /tmp/screenshot.jpg && jq '{url, format, size, cache, responseTime, remainingCredits}' /tmp/snap_response.json

Mobile screenshot: add device: "iphone_15_pro" to the jq object

Full scrollable page: add full_page: true to the jq object

Dark mode: add dark_mode: true to the jq object

Compare desktop vs mobile: make two calls, save to /tmp/screenshot_desktop.jpg and /tmp/screenshot_mobile.jpg

After Capturing

  1. Tell the user the screenshot was saved to /tmp/screenshot.jpg (or the filename you used)
  2. Report metadata: file size, response time, cache status, remaining credits
  3. For comparisons, save each screenshot to a different filename

Errors

  • 401: Invalid API key — check SNAPRENDER_API_KEY
  • 429: Rate limit or quota exceeded — wait or upgrade plan
  • Timeout: Target site is slow — add delay: 3000 to the jq object to wait longer
  • Empty response: URL unreachable or blocked

Get an API Key

Free at https://snap-render.com/auth/signup — 500 screenshots/month, no credit card.

Comments

Loading comments...