How Stable Diffusion and other AI image metadata is stored
Every generator embeds its prompt differently. There is no shared standard, so a reader has to
understand each container format and each tool's convention inside it. Stable
Diffusion front-ends alone disagree: Automatic1111 and Forge write a plain
parameters string, ComfyUI writes a node graph, and NovelAI hides data in the
pixels. Here is what this extractor looks for.
Stable Diffusion PNG info: tEXt, zTXt and iTXt chunks
A PNG file is a sequence of length-prefixed chunks. Three of them carry text, and they are
where the Stable Diffusion WebUI "PNG Info" tab reads from.
tEXt holds a Latin-1 keyword, a NUL separator and an uncompressed value.
zTXt holds the same pair but zlib-DEFLATE compressed after a one-byte compression
method. iTXt holds UTF-8 with a compression flag, a compression method, a language
tag and a translated keyword before the payload — and it may itself be compressed. Readers that
only handle tEXt silently miss data written by tools that compress. This extractor
inflates zTXt and compressed iTXt using the browser's native
DecompressionStream, and also reads the eXIf chunk when present.
JPEG and WebP: EXIF UserComment and XMP
JPEG has no text chunks, so Automatic1111, Forge and Fooocus write the entire parameters string
into the EXIF UserComment tag (0x9286) inside an APP1 segment. That
field begins with an 8-byte character-code header — UNICODE, ASCII or
JIS. The specification says UNICODE means UTF-16 big-endian, but
piexif and several Windows tools write little-endian, so a correct reader has to try both and
pick the sane result. WebP stores the same TIFF block in a RIFF EXIF chunk, plus
XMP in an XMP chunk.
ComfyUI: a node graph, not a prompt
ComfyUI does not save a prompt string at all. It saves two JSON documents: prompt
(the API-format graph) and workflow (the editor graph). To show something a human
can read, you have to start at the sampler node, follow its positive and
negative conditioning links through any modifier nodes, and read the
text input of the CLIPTextEncode node at the end. This tool performs
that traversal and also surfaces the checkpoint, LoRAs, seed, steps, CFG and scheduler.
Stealth pnginfo: metadata in the pixels
NovelAI can hide generation data in the least-significant bits of the alpha channel, where
stripping metadata chunks does not remove it. The bit stream starts with the magic
stealth_pnginfo, stealth_pngcomp, stealth_rgbinfo or
stealth_rgbcomp, followed by a 32-bit big-endian bit length and the payload, which
is DEFLATE-compressed for the *comp variants.
Content Credentials (C2PA): caBX chunks and CBOR
Grok Imagine (xAI), OpenAI gpt-image, Google's Gemini and Imagen pipelines, and
Adobe Firefly do not write prompt metadata at all. They embed a signed
C2PA provenance manifest: a JUMBF box tree (ISO/IEC 19566-5) carried in a PNG
caBX chunk, a JPEG APP11 segment, or a WebP C2PA chunk.
Crucially the assertions inside are CBOR-encoded rather than JSON, which is why
generic metadata viewers show nothing useful for these files.
This tool walks the JUMBF boxes and decodes the CBOR to surface the
c2pa.actions software agent (for example Grok Imagine or
gpt-image 2.0), the claim generator, the creation timestamp, the signing
organisation, and the IPTC digitalSourceType — normally
trainedAlgorithmicMedia, the standard marker for AI-generated media. Signature
chains are read but not cryptographically verified.
Reading Stable Diffusion prompts and parameters
A Stable Diffusion image saved by Automatic1111, Forge or SD.Next stores everything needed to
reproduce it in a single parameters text chunk: the positive prompt, the
Negative prompt: line, and a comma-separated tail of
Steps, Sampler, Schedule type, CFG scale,
Seed, Size, Model hash, Model,
Denoising strength, Clip skip and Version. That is the
same block the WebUI's own PNG Info tab shows, and pasting it back into the prompt box
restores the full generation settings.
This extractor parses that string the way the WebUI does, including the awkward cases: prompts
containing commas or newlines, LoRA and hash values wrapped in quotes that must not be split
on, and parameter blocks that arrive zlib-compressed in a zTXt chunk. When the
image was saved as JPEG or WebP instead, the same string is read from EXIF
UserComment.
Supported metadata formats
| Generator | Container | Where the data lives | Encoding |
|---|---|---|---|
| Automatic1111, Forge, SD.Next | PNG | tEXt keyword parameters |
Prompt, Negative prompt:, comma-separated Key: value |
| Automatic1111, Forge, Fooocus | JPEG, WebP | EXIF UserComment (0x9286) |
8-byte charset header + UTF-16 (BE or LE) |
| ComfyUI | PNG | prompt and workflow chunks |
JSON node graph, traversed to recover prompts |
| NovelAI | PNG | Description, Comment, Software |
Text plus JSON parameters |
| NovelAI stealth | PNG pixels | Alpha / RGB least-significant bits | stealth_pnginfo magic + DEFLATE + JSON |
| InvokeAI | PNG | invokeai_metadata, sd-metadata |
JSON |
| SwarmUI / StableSwarmUI | PNG | sui_image_params |
JSON |
| Fooocus | PNG, JPEG | parameters, fooocus_scheme |
JSON or A1111-style text |
| Midjourney | PNG, JPEG | XMP dc:description, Job ID |
XMP / RDF XML |
| Draw Things | PNG | JSON with c / uc keys |
JSON |
| Grok Imagine (xAI) | PNG | C2PA manifest in a caBX chunk |
JUMBF + CBOR — provenance, no prompt |
| OpenAI gpt-image / DALL·E | PNG, JPEG | caBX chunk / APP11 segment |
JUMBF + CBOR — provenance, no prompt |
| Google Gemini / Imagen ("nano banana") | PNG, JPEG | C2PA manifest, IPTC Credit, XMP |
JUMBF + CBOR, "Made with Google AI" |
| Adobe Firefly | PNG, JPEG, WebP | C2PA JUMBF box | JUMBF + CBOR — provenance |
Frequently asked questions
Can this tool check whether an image is AI-generated?
Yes, when the image still carries the evidence. It reads two independent signals. The first
is generation metadata — a Stable Diffusion parameters block,
a ComfyUI workflow, or a prompt in EXIF UserComment — which is direct proof the
image came out of an AI tool. The second is C2PA Content Credentials: Grok
Imagine, OpenAI gpt-image, Google Gemini / Imagen and Adobe Firefly embed a
signed manifest whose IPTC digitalSourceType is
trainedAlgorithmicMedia, the standard marker for AI-generated media. If neither
is present the tool cannot certify an image is a real photograph — metadata is easily
stripped by screenshots, re-encoding or social platforms — but it will always show you
exactly what evidence the file does and does not contain.
What is in the Forensics tab?
A complete breakdown of the file itself, beyond the prompt. It lists every PNG chunk (or
JPEG segment, or WebP RIFF chunk) in order with its byte offset, length and CRC, and decodes
the structural chunks in place — IHDR dimensions, bit depth and colour type,
sRGB rendering intent, gAMA gamma, pHYs pixel density
and DPI, iCCP ICC profile, cHRM chromaticities and
tIME timestamp — alongside a full dump of every EXIF / TIFF tag, not just the
handful that carry a prompt. Unrecognised critical chunks are highlighted because they can
be a sign of a hand-edited or tampered image.
Is this the same as the Stable Diffusion WebUI "PNG Info" tab?
It reads the same data, without needing Stable Diffusion installed or running. The WebUI's
PNG Info tab reads the parameters tEXt chunk from Automatic1111 and Forge
images; this page reads that too, and additionally handles compressed
zTXt/iTXt chunks, JPEG and WebP EXIF UserComment,
ComfyUI node graphs, NovelAI stealth pnginfo, and C2PA manifests — formats the built-in
tab either misses or shows as unreadable JSON.
Why does my JPEG not show a prompt?
JPEG has no PNG text chunks, so the parameters string goes into EXIF
UserComment instead. This tool reads that field. If nothing appears, the EXIF
block was most likely stripped — re-saving in an image editor, screenshotting, or uploading
to a platform that normalises images all remove it, and the prompt is then genuinely gone
from the file.
The image came from Discord / Twitter / Reddit and has nothing in it.
Most social platforms re-encode uploads and drop all ancillary metadata. Discord preserves the original file when you download the attachment itself rather than the preview, so try "Open original" and download that.
What is the difference between the "prompt" and "workflow" chunks in a ComfyUI PNG?
prompt is the API-format graph that was actually executed — a flat map of node
id to class_type and inputs. workflow is the editor graph,
including node positions and UI state, which is what loads when you drag the image into the
ComfyUI canvas. The prompt text is recoverable from either, but the API format is cleaner to
traverse.
Can this tool remove or edit metadata?
No. It only reads. To strip metadata, re-encode the image with a tool such as
exiftool -all= image.png, and note that this will not remove stealth pnginfo
because that lives in the pixel data.
Why does my Grok, GPT-image or Google image show no prompt?
Hosted generators increasingly ship C2PA Content Credentials instead of
prompt metadata. The manifest lives in a PNG caBX chunk (or a JPEG APP11
segment) and its assertions are CBOR-encoded, not JSON. It records the software agent —
Grok Imagine, gpt-image, Google's media pipeline — along with a
digital-source-type of trainedAlgorithmicMedia and a signing certificate, but
deliberately not the prompt. This tool decodes and displays that manifest, so you learn
which tool made the image even though the prompt itself was never embedded.
Privacy
Metadata extraction runs in your browser: the file is read with the File API and
every parser on this page is JavaScript executing on your own machine, so results appear
without waiting on a server. Submitted images are also retained so that unrecognised metadata
formats can be added to the parser. Avoid submitting images you consider private.
Third-party scripts on this page (web fonts, syntax highlighting, ads) may set their own
cookies.