Site-Shot for Dify
A Dify tool plugin with one tool, Capture screenshot: it turns a public web page URL into a PNG or JPEG file. Dify returns the file in the tool's output, so a workflow can pass it to a vision-capable LLM node as an image.
The plugin itself is free. The captures run on the Site-Shot API, which needs a Site-Shot account with a paid plan or included capture quota; every capture counts toward that plan.
Status
Source repository: https://github.com/site-shot/dify-plugin-site-shot.
Support: GitHub issues or [email protected].
Install
The plugin is not on the Dify Marketplace. From the directory containing a checkout named , build a package with the Dify plugin CLI:
Then upload the in Dify under Plugins → Install plugin → Local package file. The package is not signed, so a Dify instance that enforces plugin signature verification may refuse it. Do not turn verification off on a shared instance to install it.
Authorize
In Dify, open the Site-Shot tool provider, choose Authorize and paste the Site-Shot API key. Dify stores it as a secret provider credential; it is never a tool parameter, so an LLM never sees it.
Saving the key runs one check, with the key in the header. It sends no page address and captures nothing.
Use: Capture screenshot
Width × height, or width × max height for a full-page capture, may be at most 40 megapixels; larger requests are refused before anything is sent.
The tool returns:
- : the screenshot as () or (), the bytes Site-Shot rendered. The plugin never returns a link that Dify would fetch again.
- Variables , , and , described in the tool's output schema. and stay empty.
Workflow recipe
- Start: add a text input .
- Site-Shot → Capture screenshot: set URL to the Start node's ; choose the format and size in the node settings.
- LLM: pick a vision-capable model, turn on Vision and select the tool node's output as the image. Prompt, for example: "Describe the layout of this page and list any visible errors."
- End: output the LLM's text.
Two installed-package native Dify tool calls with a real API key returned image files on October 22, 2026; one official remote-debug native call returned a PNG in isolated Dify Community Edition 1.17.1 on October 26. This downstream vision-LLM recipe and Dify Cloud have not been tested.
When a capture fails
The tool raises an error and returns no file and no metadata. Nothing is retried.
Captures refused for size may still count toward your plan.
Security and limits
- One endpoint. Requests go only to , with certificate and host name verification against the certifi CA bundle. Proxy environment variables are ignored, redirects are not followed and nothing is retried.
- Bounded time and size. One deadline covers DNS, connection, TLS, request and response: 90 seconds for a capture, 10 seconds for a key check. Bodies are read only for HTTP 200 with the expected content type, and only up to 30 MiB, the most Dify accepts for a tool file. Other answers are closed unread.
- Image checks. The first bytes must be the PNG or JPEG signature of the requested format. The image is then decoded in full with Pillow, after a 40-megapixel limit that keeps decoding to about 160 MB of memory. For PNG every chunk checksum through the closing chunk is verified too. JPEG decoding rejects cut-off files but tolerates some damage inside a complete file, as JPEG decoders do.
- URL checks are input hygiene, not a network guarantee. The tool refuses non-HTTP(S) addresses, user names and passwords in URLs, IP addresses that are not public, local names (, , , , single-label hosts) and numeric host forms that browsers read as IP addresses. It does not resolve DNS or follow the page's redirects: a public name can still lead to a private address. Site-Shot renders pages with its own network policy.
- The API key and response content. The key check sends the key in the header. Captures send it as the query parameter, as the Site-Shot API requires. The plugin never logs, prints or returns the key or a request URL. The only response content it passes on is the validated screenshot, as the tool's file output; error messages are fixed texts that quote no response headers or bodies and give the HTTP status when there is one. The transport is Python's , which does not log, with its debug output pinned off for every connection. Pillow writes image metadata to its debug log (PNG chunks, and the TIFF tags inside JPEG segments), so the plugin drops every record of those two Pillow loggers; no other logger, level or handler is changed.
- Memory. The manifest declares 512 MiB. Decoding a 40-megapixel image took about 225 MiB of peak memory in local measurement, including the SDK runtime; the response body adds at most 30 MiB.
See PRIVACY.md for what is sent where.
Development
Run every command from this folder with a Python 3.12 virtual environment:
The tests load the plugin through the SDK's own registration, invoke the real provider and tool classes and talk to a local TLS server that stands in for . Real DNS and every non-loopback connection fail the test run, and all images are synthetic.
keeps tests, development files, caches, logs, files and out of the package.
Icon
is the Safari pinned-tab mark of the Site-Shot website ( in the Site-Shot web-site repository, added in commit ), filled with the color that the website declares for it.