<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Remove AI Meta]]></title><description><![CDATA[Remove AI Meta]]></description><link>https://removeaimeta.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Mon, 26 Oct 2026 22:06:09 GMT</lastBuildDate><atom:link href="https://removeaimeta.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Stable Diffusion and ComfyUI PNGs carry your prompt: how to see what's inside]]></title><description><![CDATA[Before you post a Stable Diffusion PNG, check what's inside it. The default save from several popular UIs stores the recipe as plain text in the file. This…]]></description><link>https://removeaimeta.hashnode.dev/stable-diffusion-and-comfyui-pngs-carry-your-prompt-how-to-see-what-s-inside</link><guid isPermaLink="true">https://removeaimeta.hashnode.dev/stable-diffusion-and-comfyui-pngs-carry-your-prompt-how-to-see-what-s-inside</guid><dc:creator><![CDATA[Remove AI Meta]]></dc:creator><pubDate>Fri, 02 Oct 2026 14:34:08 GMT</pubDate><content:encoded><![CDATA[<p>Before you post a Stable Diffusion PNG, check what's inside it. The default save from several popular UIs stores the recipe as plain text in the file.</p>
<h2>What each tool writes</h2>
<ul>
<li>AUTOMATIC1111's web UI writes a PNG text chunk named <code>parameters</code>. It holds your prompt, negative prompt, steps, sampler, CFG scale, seed, size, model name and model hash, plus anything an extension adds.</li>
<li>ComfyUI stores the API graph in a text chunk called <code>prompt</code>, and the UI graph in another called <code>workflow</code>, unless metadata is disabled on the server. A workflow can be big and may include checkpoint and LoRA file names from your machine.</li>
<li>None of this is signed. It is ordinary metadata, not a C2PA manifest, so anybody can read it and anybody can remove it.</li>
</ul>
<h2>List the chunks yourself</h2>
<p>This short Python script has no dependencies. It lists text chunks (tEXt, iTXt, zTXt), any C2PA container (<code>caBX</code>) and an EXIF block in a PNG.</p>
<pre><code>import struct, sys

for path in sys.argv[1:]:
    b = open(path, "rb").read()
    if b[:8] != b"\x89PNG\r\n\x1a\n":
        print(path, "is not a PNG"); continue
    i = 8
    while i + 8 &lt;= len(b):
        size, kind = struct.unpack("&gt;I4s", b[i:i + 8])
        body = b[i + 8:i + 8 + size]
        if kind == b"tEXt":
            key, _, val = body.partition(b"\0")
            print(f"tEXt  {key.decode('latin-1'):&lt;12} {len(val)} bytes: {val[:70].decode('latin-1')!r}")
        elif kind in (b"iTXt", b"zTXt"):
            key = body.split(b"\0", 1)[0]
            print(f"{kind.decode()}  {key.decode('utf-8', 'replace'):&lt;12} {size} bytes")
        elif kind == b"caBX":
            print(f"caBX  (C2PA/JUMBF container) {size} bytes")
        elif kind == b"eXIf":
            print(f"eXIf  EXIF block {size} bytes")
        i += 12 + size
</code></pre>
<p>Run it as <code>python3 pngtext.py image.png</code>. If you see <code>parameters</code>, <code>prompt</code> or <code>workflow</code>, the generation recipe will travel with the file.</p>
<h2>Should you remove it?</h2>
<p>That depends. Many people leave the prompt in on purpose, since sharing a recipe is part of the community. Remove it when the prompt is client work, contains a name or private detail, or when the <code>workflow</code> chunk reveals folder paths you'd rather not publish.</p>
<p>Note that stripping the text chunks does not make an image "undetectable". Some generators also add invisible watermarks in the pixels, and platforms may label content on other signals. This is only about what's written in the file.</p>
<h2>Doing it without a script</h2>
<p>If you'd rather not use a command line, <a href="https://removeaimeta.com/stable-diffusion-png-metadata">Remove AI Meta</a> has a page for this exact case. It's a browser tool that shows the chunks before and after cleaning, and runs locally. Its AI-provenance mode removes the usual keys (<code>parameters</code>, <code>prompt</code>), and its strip-all mode also removes the ComfyUI <code>workflow</code> chunk. One clean is free; more are paid.</p>
<p><em>Script tested on a sample PNG with <code>parameters</code> and <code>prompt</code> chunks.</em></p>
]]></content:encoded></item><item><title><![CDATA[Does a screenshot remove C2PA data from a ChatGPT image?]]></title><description><![CDATA[People ask this, so here is a plain answer. Usually yes for the C2PA part, but that isn't the whole story, and you shouldn't treat it as a way to hide…]]></description><link>https://removeaimeta.hashnode.dev/does-a-screenshot-remove-c2pa-data-from-a-chatgpt-image</link><guid isPermaLink="true">https://removeaimeta.hashnode.dev/does-a-screenshot-remove-c2pa-data-from-a-chatgpt-image</guid><dc:creator><![CDATA[Remove AI Meta]]></dc:creator><pubDate>Fri, 02 Oct 2026 14:30:38 GMT</pubDate><content:encoded><![CDATA[<p>People ask this, so here is a plain answer. Usually yes for the C2PA part, but that isn't the whole story, and you shouldn't treat it as a way to hide anything from tools that read the pixels.</p>
<h2>What's in a ChatGPT image download</h2>
<p>OpenAI's help describes two separate marks on supported images:</p>
<ol>
<li>C2PA Content Credentials: a signed manifest stored inside the file, saying the image was made with OpenAI tools.</li>
<li>A SynthID-style watermark: a signal embedded in the pixels that is meant to survive some edits.</li>
</ol>
<p>They live in different places. The first is metadata. The second is in the image content.</p>
<h2>What a screenshot does</h2>
<p>A screenshot is a brand new file made by your operating system. It contains pixels, not the original file's container, so the C2PA manifest isn't copied across. The same is true if you re-save the picture in an editor that doesn't preserve metadata, or if a platform re-encodes it on upload (many do).</p>
<p>What a screenshot does not do: remove anything in the pixels. A watermark that is built into the image content may or may not survive, and no one outside the vendor can guarantee either way. Nor does it control what a platform does with other signals; platforms can label content based on declarations in your post, on detectors, or on user reports.</p>
<h2>A screenshot isn't a good workflow anyway</h2>
<ul>
<li>You lose resolution and often colour accuracy.</li>
<li>You get UI chrome or scaling blur.</li>
<li>You can't verify afterwards what the new file contains.</li>
</ul>
<p>If your actual goal is "send this image without the provenance record attached", cleaning the original file is better: it keeps the full-resolution pixels and you can check the result.</p>
<h2>How to check any file in 30 seconds</h2>
<p>Content Credentials has a free verifier at contentcredentials.org/verify. For a quick local check you can also use a tool that reads the container and lists what it finds.</p>
<p>I work on <a href="https://removeaimeta.com/chatgpt-image-metadata">Remove AI Meta</a>, which has a page for ChatGPT downloads: it inspects the file, strips the C2PA manifest and other metadata in the browser, and re-scans the output. It is explicit that SynthID-type watermarks stay, and that it can't force a platform to remove a label. One clean is free; more are paid.</p>
<p>If you need to disclose AI use for school, work or a platform rule, do that regardless. Metadata presence or absence doesn't change your obligation.</p>
<p><em>Not affiliated with OpenAI. Based on OpenAI's published help on image provenance as of October 2026.</em></p>
]]></content:encoded></item><item><title><![CDATA[Inspecting and Removing C2PA and IPTC Metadata from Images]]></title><description><![CDATA[Inspecting and RInspecting and Removing C2PA and IPTC Metadata from Imagesemoving C2PA and IPTC Metadata from Images If you have downloaded an image from a…]]></description><link>https://removeaimeta.hashnode.dev/inspecting-and-removing-c2pa-and-iptc-metadata-from-images</link><guid isPermaLink="true">https://removeaimeta.hashnode.dev/inspecting-and-removing-c2pa-and-iptc-metadata-from-images</guid><dc:creator><![CDATA[Remove AI Meta]]></dc:creator><pubDate>Mon, 21 Sep 2026 10:47:53 GMT</pubDate><content:encoded><![CDATA[<p>Inspecting and RInspecting and Removing C2PA and IPTC Metadata from Imagesemoving C2PA and IPTC Metadata from Images</p>
<p>If you have downloaded an image from a news site, a stock library, or an AI generator lately, there is a decent chance it carries provenance data you never asked for. The Content Credentials system, built on the C2PA specification, attaches a signed manifest to the file describing who created it, what tools were used, and whether generative AI was involved. Adobe, Microsoft, Google, and most camera manufacturers now write these manifests by default. Separately, IPTC fields and EXIF blocks have been embedding author names, GPS coordinates, and software fingerprints for decades.</p>
<p>For developers, this matters in both directions. You might want to <em>read</em> that metadata to verify an image's origin, or you might need to <em>strip</em> it before shipping assets to production. This guide covers both, with commands you can run today.</p>
<h2>What C2PA actually stores</h2>
<p>A C2PA manifest is a CBOR-encoded structure embedded in a JUMBF box inside the file. It contains assertions (the claim), a signature from the signing certificate, and a chain of ingredients pointing to source assets. In a JPEG, it lives in an APP11 segment. In PNG, it's a <code>caBX</code> chunk. In MP4, a <code>uuid</code> box.</p>
<p>You can inspect a manifest with the official <code>c2patool</code> from the Content Authenticity Initiative:</p>
<pre><code class="language-bash">c2patool image.jpg
</code></pre>
<p>That prints the full claim, the signer, and any AI-generated assertions. If you want machine-readable output for a pipeline:</p>
<pre><code class="language-bash">c2patool image.jpg --output json | jq '.manifests[].assertions'
</code></pre>
<p>The <code>c2pa.ai_generative_training</code> and <code>c2pa.actions</code> assertions are the ones most people care about, since they flag whether an asset was used for or produced by generative models.</p>
<h2>Reading IPTC and EXIF without extra tooling</h2>
<p>For classic metadata, ImageMagick and ExifTool are still the fastest path. ExifTool is more thorough:</p>
<pre><code class="language-bash">exiftool -a -G1 -s image.jpg
</code></pre>
<p>The <code>-G1</code> flag groups output by metadata family (EXIF, IPTC, XMP, ICC_Profile, JUMBF), which makes it obvious where each field comes from. To see only IPTC:</p>
<pre><code class="language-bash">exiftool -iptc:all image.jpg
</code></pre>
<p>To see only C2PA-related JUMBF data that ExifTool can parse:</p>
<pre><code class="language-bash">exiftool -jumbf:all image.jpg
</code></pre>
<p>ExifTool's JUMBF support is partial, so treat <code>c2patool</code> as the source of truth for C2PA specifically.</p>
<h2>Removing the metadata</h2>
<p>This is where people get tripped up. Stripping EXIF does not strip C2PA, and stripping C2PA does not necessarily strip IPTC. They are different containers, and a naive <code>convert</code> call may drop some and preserve others.</p>
<h3>Strip everything with ImageMagick</h3>
<pre><code class="language-bash">magick input.jpg -strip output.jpg
</code></pre>
<p><code>-strip</code> removes EXIF, IPTC, XMP, and most ancillary chunks. It does <em>not</em> reliably remove C2PA manifests in every build, because the JUMBF box can survive depending on the coder. Verify afterward:</p>
<pre><code class="language-bash">c2patool output.jpg
</code></pre>
<p>If it still reports a manifest, you need a second pass.</p>
<h3>Strip C2PA specifically</h3>
<p>The <code>c2patool</code> CLI does not have a removal flag as of the current release. The reliable approach is to re-encode the pixel data through a library that does not preserve the manifest, then confirm the JUMBF box is gone. In Python:</p>
<pre><code class="language-python">from PIL import Image

img = Image.open("input.jpg")
img.save("output.jpg", quality=95)
</code></pre>
<p>Pillow writes a fresh file with no C2PA box and no inherited IPTC. It does preserve some EXIF by default, so pass <code>exif=b""</code> if you want a clean slate:</p>
<pre><code class="language-python">img.save("output.jpg", quality=95, exif=b"")
</code></pre>
<h3>Strip IPTC and EXIF with ExifTool</h3>
<pre><code class="language-bash">exiftool -all= -overwrite_original image.jpg
</code></pre>
<p>That removes every writable tag. Add <code>-icc_profile</code> preservation if color accuracy matters for your use case:</p>
<pre><code class="language-bash">exiftool -all= -tagsfromfile @ -icc_profile -overwrite_original image.jpg
</code></pre>
<h2>A verification loop worth automating</h2>
<p>Metadata removal is easy to get wrong silently. Build a check into your asset pipeline:</p>
<pre><code class="language-bash">#!/usr/bin/env bash
set -e
FILE="$1"

if c2patool "$FILE" 2&gt;/dev/null | grep -q "manifest"; then
  echo "C2PA manifest still present in $FILE"
  exit 1
fi

COUNT=$(exiftool -a -G1 -s "$FILE" | grep -cE "^(EXIF|IPTC|XMP)")
if [ "$COUNT" -gt 0 ]; then
  echo "$COUNT metadata fields remain in $FILE"
  exit 1
fi

echo "$FILE is clean"
</code></pre>
<p>Run this in CI on any user-uploaded image before it hits your CDN. It catches the common case where a library re-embeds metadata you thought you removed.</p>
<h2>When to keep metadata instead</h2>
<p>Not every workflow should strip everything. If you are building a verification feature, you want the manifest intact. If you are archiving photojournalism, destroying provenance is actively harmful. The rule of thumb: strip for outbound assets where metadata is noise or a privacy risk, preserve for inbound assets where provenance is the point.</p>
<p>For quick one-off jobs where you would rather not chain three CLI tools, <a href="https://removeaimeta.com">Remove AI Meta</a> handles C2PA cleanup, IPTC, and EXIF in a single pass and shows a before-and-after diff so you can confirm what was actually removed. It is useful when you need to check a file on a machine without your usual toolchain installed.</p>
<h2>Practical notes</h2>
<ul>
<li><p>PNG <code>caBX</code> chunks and JPEG APP11 segments are the two you will encounter most. WebP stores C2PA in a <code>C2PA</code> RIFF chunk.</p>
</li>
<li><p>Re-encoding at quality 95 is visually lossless for most photographic content but does change the file hash. If you need byte-identical pixels, you cannot remove embedded metadata without rewriting the container.</p>
</li>
<li><p>Signed manifests are cryptographically bound to the asset. Any pixel change invalidates the signature, which is why re-encoding is a valid removal strategy: the manifest becomes unverifiable even if the box lingers.</p>
</li>
</ul>
<p>Metadata is not decoration. It is data your users did not consent to ship, and it is worth knowing exactly how to read it and how to remove it.</p>
]]></content:encoded></item></channel></rss>