Share-Safe Renders
Find what a render leaks before you share it: API keys, Discord and Slack webhooks, user names in paths, e-mails, LAN IPs, GPS and hidden MP4 data. The report never prints the leaked text.
Free
Works with the AI Agents you already use
Share-Safe Renders
Example session with this skill installed
I'm going to post the six renders in renders/ on a forum, one at a time. Can you check them first? (The folder holds the six demo files from scripts/make_demo.py, and the page DEMO_EXPECTED.md that comes with them.)
- Read your context and instructions
- Compiled the share-safe renders
- Generated the image
Demo files: the six synthetic files that scripts/make_demo.py writes into renders/ (invented keys, an invented webhook, a made-up user name, address and coordinates). The numbers, places and hashes below are the scanner's real, unedited output (scan.py 1.2.0); the layout is the one SKILL.md prescribes. Nothing was sent or published, and no file was changed.
Verdict. Do not share these files as they are: 12 finding(s) in 5 of 6 file(s) (7 high, 4 medium, 1 low).
Findings (same value in two places is one secret, so those rows are merged)
| Severity | Class | Meaning | File | Where |
|---|---|---|---|---|
| high | K2 + K1 | a value under a secret-looking field name (api_key, token, password, secret, authorization ...); a string shaped like a vendor API key or token (OpenAI, Anthropic, GitHub, AWS, Google, Slack, Stripe live, Hugging Face) | renders/01_png_api_key_and_username.png | png:tEXt, tEXt[prompt]:node:11/inputs/api_key, node 11 |
| high | K3 + H3 | a Discord or Slack webhook URL | renders/02_png_ztxt_webhook.png | png:zTXt, zTXt[workflow]:nodes[1]/widgets_values[0], node 7 |
| high | K2 + K1 + H1 | a value under a secret-looking field name (api_key, token, password, secret, authorization ...); a string shaped like a vendor API key or token (OpenAI, Anthropic, GitHub, AWS, Google, Slack, Stripe live, Hugging Face) | renders/03_png_bypassed_node_secret.png | png:tEXt, tEXt[workflow]:nodes[2]/widgets_values[0]/api_key, node 12, bypassed |
| high | K1 | a string shaped like a vendor API key or token (OpenAI, Anthropic, GitHub, AWS, Google, Slack, Stripe live, Hugging Face) | renders/05_mp4_prompt_tag_and_free_box.mp4 | mp4:box:free, free:raw |
| high | G1 | GPS coordinates (EXIF, XMP, an MP4/MOV location tag or the MP4 loci box) | renders/06_jpeg_exif_gps.jpg | jpeg:exif, exif:GPS |
| medium | P1 | a home-folder path that reveals an account name (Windows, macOS and Linux forms) | renders/01_png_api_key_and_username.png | png:tEXt, tEXt[prompt]:node:9/inputs/image, node 9 |
| medium | P2 | an e-mail address (documentation addresses such as example.com are ignored) | renders/05_mp4_prompt_tag_and_free_box.mp4 | mp4:tag, moov/udta/meta/ilst/prompt:node:20/inputs/~b0a1bd37, node 20 |
| medium | M1 | hidden MP4/MOV data: a tag holding workflow or prompt JSON, or data in a free/uuid/unknown top-level box or after the last box | renders/05_mp4_prompt_tag_and_free_box.mp4 | mp4:tag, moov/udta/meta/ilst/prompt |
| medium | M1 | hidden MP4/MOV data: a tag holding workflow or prompt JSON, or data in a free/uuid/unknown top-level box or after the last box | renders/05_mp4_prompt_tag_and_free_box.mp4 | mp4:box:free, free |
| low | P3 | a private-network address (10.x, 172.16-31.x, 192.168.x) or a .local/.lan/.internal host name | renders/05_mp4_prompt_tag_and_free_box.mp4 | mp4:tag, moov/udta/meta/ilst/prompt:node:20/inputs/server, node 20 |
4 PNG file(s) carry an embedded ComfyUI workflow. The prompt text, model names, seeds and node layout travel with the file although they are not findings.
The scanner did not examine 1 file(s) in the folder because they are not renders: renders/DEMO_EXPECTED.md.
How to fix
- Export a copy of each flagged file without its metadata, into a new folder (the originals stay untouched). Every file name here is plain (letters, digits,
_and.), so the commands can be built from them; a file whose name is not plain would get no command, only a request to rename it ("Names in commands" inSKILL.md):
mkdir reexported
ffmpeg -loglevel error -n -i "renders/01_png_api_key_and_username.png" -map_metadata -1 "reexported/01_png_api_key_and_username.png"
ffmpeg -loglevel error -n -i "renders/02_png_ztxt_webhook.png" -map_metadata -1 "reexported/02_png_ztxt_webhook.png"
ffmpeg -loglevel error -n -i "renders/03_png_bypassed_node_secret.png" -map_metadata -1 "reexported/03_png_bypassed_node_secret.png"
ffmpeg -loglevel error -n -i "renders/05_mp4_prompt_tag_and_free_box.mp4" -map_metadata -1 -map_chapters -1 -c copy "reexported/05_mp4_prompt_tag_and_free_box.mp4"
ffmpeg -loglevel error -n -i "renders/06_jpeg_exif_gps.jpg" -map_metadata -1 -q:v 2 "reexported/06_jpeg_exif_gps.jpg"
- Run those and tell me when the 5 copies exist. I will then scan them (
python "<SKILL_DIR>/scripts/scan.py" "reexported" --json "share-safe-report-2.json") and check that the number of files scanned is 5. - The files with a key or webhook finding (K1, K2, K3): if they were ever posted or sent before, treat that key or webhook as exposed and revoke it at the provider. Removing metadata does not take it back.
What this scan cannot see
- Pixel-hidden data and what the picture shows
- Data inside IDAT, JPEG entropy data and the first mdat, ICC profile contents and UTF-16 text in raw regions
- Contents of C2PA manifests
- Secrets split, re-encoded or glued to a letter, placeholder values, unrecognised secret field names, vendor key formats outside its eight and webhooks other than Discord and Slack
- Formats it cannot open (WebP, GIF, WebM, HEIC) and addresses other than 10.x, 172.16-31.x and 192.168.x (IPv6, loopback, link-local, CGNAT, public)
01_png_api_key_and_username.png
PNG · 1536×1024
Example file from a real run - the skill writes it into your workspace.
Connects securely to your tools. The creator never sees your data.
About this skill
Find out what a render leaks before you share it. Share-Safe Renders gives your agent one scanner for PNG, JPEG and MP4/MOV files and ComfyUI workflow JSON. It reports what people post by accident: API keys and secret-named fields, Discord and Slack webhook URLs, user names inside home-folder paths, e-mail addresses, LAN addresses, GPS coordinates, and secrets hidden where a text search does not look (bypassed ComfyUI nodes, JSON stored inside a string, compressed PNG chunks, hidden MP4 boxes).
Questions it answers
- Does this PNG, JPEG or MP4 carry a key, a webhook, a user name in a path, an e-mail address, a LAN address or GPS?
- Where exactly: which file, which container, which ComfyUI node, and was that node bypassed (it did not run, but its values are still saved)?
- Is anything hidden in a compressed PNG chunk, in JSON stored inside a string, or in an MP4 box that players and
ffprobedo not show? - Which files could not be scanned at all (damaged, too big, WebP or GIF), so nobody mistakes them for checked?
- After I re-export a copy without the metadata, does a second scan of the copy still find what was found?
How it works
The skill is scan-first. scripts/scan.py only reads the files you give it: it never edits, moves or deletes them, and the one file it writes is the JSON report you name. The report never prints the text it found, only the class, the place, the length and a short keyed hash, so a file's metadata cannot put instructions into a report your agent reads. The skill then tells your agent how to export a copy without the metadata (ffmpeg and Pillow commands, run on synthetic files and labelled per build) and to check the copy by scanning it again; another program makes the copy and the scanner checks it, so the check is not circular. The skill tells the agent to give a fixed report: verdict first, then findings, then how to fix, then what the scan cannot see. A file or folder name can contain text that a shell runs, so the skill tells the agent to paste a file name into a command only if the name is plain (ASCII letters, digits, spaces and . _ ( ) + -), and only if the folder you name has no ", $, backtick, %, ! or typographic double quote in it; for any other name it tells the agent to ask you to copy or rename the file, or move it to a plain-named folder, first.
Honest by design A file the scanner could not scan is not reported as clean: it is listed under COULD NOT FULLY SCAN and the run exits 3 when nothing else was found (1 if another file has a finding). Links and file types it does not read, met inside a folder, are skipped, counted and named under NOTES. A run that scanned no file at all exits 3. No verdict line the skill gives the agent says "clean" or "safe", and it tells the agent never to say a file is fine to share. "Nothing found" is not a guarantee: the known misses are written down (data hidden in pixels or in the compressed image and video streams, the contents of C2PA manifests, secrets that were split or re-encoded, vendor key formats outside its list of eight vendors, webhooks of providers other than Discord and Slack). It does not judge your prompt text or what the picture shows.
It does not replace exiftool or trufflehog. exiftool shows more tags than this scanner reads; trufflehog has far more vendor detectors and can check whether a key is live. What this adds is classification (paths, e-mail addresses, LAN addresses, GPS, hidden MP4 boxes), node and bypassed-node attribution, decoding of compressed PNG chunks, a report that never prints the leaked text, and an exit code that does not read a file it knows it could not scan as clean. In a head-to-head on a synthetic corpus (240 files, 194 planted entries; exiftool 13.59, trufflehog 3.99.2), trufflehog scanned none of the real PNG, JPEG or MP4 files as shipped (the only two files it scanned were a text file and random bytes named .png) and, with workarounds, flagged 27 of 68 planted key entries (the scanner: 68 of 68); exiftool's dumps showed 189 of the 194 entries in clear text and classified none. Much of that gap is the shape of the corpus: counted by underlying key, the report lists 32 OpenAI-legacy keys (trufflehog flagged 1; only 1 of the corpus's 43 OpenAI-legacy values has the marker it needs) and 7 lone AWS key ids it never reports, and excluding OpenAI-legacy values and lone AWS key ids trufflehog flagged 33 of the 40 remaining effective K1 entries (82%), a count on a different basis from the 27 of 68. The scanner matched 194 of 194, but 91 of those 194 are classes trufflehog has no detector for, and the scanner was built against that corpus, so that is not an estimate of real-world recall. The numbers and every caveat are in the package.
What is inside
One scanner (scan.py, standard library only), a demo-file maker (make_demo.py) that writes six synthetic files with invented secrets, five reference notes (what leaks and where, how to export a copy, reading the report, known misses, the comparison), a real sample report in Markdown and JSON, and an example session that includes a run that cannot scan everything. A sixth note (references/no-skill-folder.md) is for an agent that receives the skill as text with no skill folder: it names the one file a scan needs (scan.py, about 145 KB) and gives a short program that writes each file the agent loads into a fresh folder in the system temp folder only when its SHA-256 is the published one, and checks that folder before anything runs.
Requirements
Python 3.9 or newer. ffmpeg is needed only for the export commands and the demo MP4; ffprobe is optional. The 692 automated tests ran on Windows 11 and on Linux in Docker (see the compatibility note). They live in the public repository and are not in the zip. Not tested: macOS, and any agent end to end. Free.
Source and licence Source code and tests: https://github.com/sawizzle/share-safe-renders (MIT OR Apache-2.0). The copy you get through Agensi is under Agensi's buyer terms (a personal, non-transferable licence).
How to use
Skills on Agensi run inside your AI agent. Copy the prompt, paste it into your agent, and it connects to Agensi and installs this skill for you. If a payment is needed, your agent shows it to you first.
Reviews
No reviews yet
Be one of the first to try it. Every listed skill passes our trust checks below.
Security scanned
Passed our 8-point scan before listing
Fresh listing
Recently published to Agensi
Free forever
No account required to browse
Trust & safety
Security scanned
Verified clean 3 days ago
- Free to download with an account
Requires