<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Noah Keller</title>
    <description>The latest articles on DEV Community by Noah Keller (@noahkeller).</description>
    <link>https://dev.to/noahkeller</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4224277%2F05c4a9f8-2986-479a-8f5c-c44bc67bfd2c.png</url>
      <title>DEV Community: Noah Keller</title>
      <link>https://dev.to/noahkeller</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/noahkeller"/>
    <language>en</language>
    <item>
      <title>SynthID remove vs. metadata: what's actually inside an AI image file (EXIF, XMP, C2PA)</title>
      <dc:creator>Noah Keller</dc:creator>
      <pubDate>Wed, 04 Nov 2026 02:15:47 +0000</pubDate>
      <link>https://dev.to/noahkeller/synthid-remove-vs-metadata-whats-actually-inside-an-ai-image-file-exif-xmp-c2pa-14i4</link>
      <guid>https://dev.to/noahkeller/synthid-remove-vs-metadata-whats-actually-inside-an-ai-image-file-exif-xmp-c2pa-14i4</guid>
      <description>&lt;p&gt;If you've ever downloaded an image from an AI generator and opened it in &lt;code&gt;exiftool&lt;/code&gt;, you've probably noticed the file carries a lot more than pixels. Generators, editors and even some phones now write provenance data into the file: software names, prompts, creation tools and, increasingly, signed C2PA manifests. A lot of the "synthid remove" searches I see from photographers and indie devs are really about this layer, so it's worth separating the two things clearly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two different things: embedded metadata vs. pixel watermarks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Embedded metadata&lt;/strong&gt; lives in containers alongside the image data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EXIF&lt;/strong&gt;: camera/software fields, timestamps, sometimes GPS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XMP&lt;/strong&gt;: an XML packet. Many AI tools write fields like &lt;code&gt;CreatorTool&lt;/code&gt; or IPTC's &lt;code&gt;DigitalSourceType&lt;/code&gt; (e.g. &lt;code&gt;trainedAlgorithmicMedia&lt;/code&gt;) here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IPTC&lt;/strong&gt;: older newsroom-style captions, credits and keywords.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C2PA / Content Credentials&lt;/strong&gt;: a signed manifest (stored in JUMBF boxes) describing how the asset was made and edited.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PNG text chunks&lt;/strong&gt; (&lt;code&gt;tEXt&lt;/code&gt;, &lt;code&gt;iTXt&lt;/code&gt;): some local Stable Diffusion UIs store the full prompt and settings here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pixel-level watermarks&lt;/strong&gt; such as Google's SynthID are different: they're woven into the image content itself, so stripping metadata does nothing to them. Keep that distinction in mind when someone promises a one-click fix for both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you might legitimately want a clean copy
&lt;/h2&gt;

&lt;p&gt;There are plenty of honest reasons to strip metadata from images &lt;strong&gt;you own or are authorized to edit&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removing GPS coordinates and device info before posting personal photos.&lt;/li&gt;
&lt;li&gt;Not leaking an entire prompt or internal file paths in a product screenshot.&lt;/li&gt;
&lt;li&gt;Shrinking file size by dropping large XMP packets.&lt;/li&gt;
&lt;li&gt;Normalizing assets for a website build.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it is &lt;strong&gt;not&lt;/strong&gt; for: passing off generated images as camera photos where a platform, client or publication requires disclosure. If the rules say "label AI images", label them, in the caption or alt text, regardless of what's in the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspecting a file first
&lt;/h2&gt;

&lt;p&gt;Before removing anything, look at what's there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-G1&lt;/span&gt; image.png        &lt;span class="c"&gt;# every tag, grouped by container&lt;/span&gt;
exiftool &lt;span class="nt"&gt;-XMP&lt;/span&gt;:all image.jpg      &lt;span class="c"&gt;# just the XMP packet&lt;/span&gt;
c2patool image.jpg               &lt;span class="c"&gt;# C2PA manifest, if any&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a PNG from a local SD install you'll often see a &lt;code&gt;parameters&lt;/code&gt; text chunk containing the whole prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing it in the browser, without uploading
&lt;/h2&gt;

&lt;p&gt;You can do the cleanup locally with the Canvas API: draw the decoded image to a canvas and export a fresh blob. The re-encoded file contains pixels only, none of the original EXIF/XMP/IPTC/C2PA/text chunks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;cleanCopy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bitmap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createImageBitmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OffscreenCanvas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bitmap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bitmap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;drawImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bitmap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convertToBlob&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.95&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caveats: JPEG re-encoding is lossy, color profiles may change, and orientation metadata is applied before drawing in modern browsers, so check the result.&lt;/p&gt;

&lt;p&gt;If you don't want to wire that up yourself, the free &lt;a href="https://synthclear.com/remove_ai_label" rel="noopener noreferrer"&gt;Remove AI Label tool on SynthClear&lt;/a&gt; does exactly this kind of local cleanup: you drop in JPG, PNG or WEBP files and it creates fresh copies without the original EXIF, XMP, C2PA and other embedded metadata, processed in your browser rather than uploaded.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8hboqy0jld7tqamg5nwo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8hboqy0jld7tqamg5nwo.png" alt="SynthClear Remove AI Label tool - free in-browser EXIF XMP C2PA metadata remover" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The free Remove AI Label page on SynthClear (screenshot).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What about SynthID?
&lt;/h2&gt;

&lt;p&gt;Since SynthID isn't metadata, the browser trick above won't touch it. &lt;a href="https://synthclear.com/" rel="noopener noreferrer"&gt;SynthClear&lt;/a&gt; also has a separate, paid tool on its homepage that &lt;em&gt;attempts&lt;/em&gt; to remove supported SynthID watermarks from images you own or are authorized to edit; the site itself says results vary by image and aren't guaranteed. I'd treat that as a niche tool for your own assets, not a way around disclosure rules.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0e7bxwaffpda89c5xqo4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0e7bxwaffpda89c5xqo4.png" alt="SynthClear homepage - SynthID remove tool for images you own" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;SynthClear's homepage, where the separate SynthID tool lives (screenshot).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Inspect with &lt;code&gt;exiftool -a -G1&lt;/code&gt; so you know what you're removing.&lt;/li&gt;
&lt;li&gt;Strip only from images you own or have rights to edit.&lt;/li&gt;
&lt;li&gt;Keep an original with its provenance intact for your records.&lt;/li&gt;
&lt;li&gt;Disclose AI involvement wherever the platform or client asks, in visible text.&lt;/li&gt;
&lt;li&gt;Re-check the output; confirm GPS and prompts are really gone.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For more background, see this guide on &lt;a href="https://owenharte.mataroa.blog/blog/synthid-remove-metadata-and-disclosure-a-practical-guide-for-photographers/" rel="noopener noreferrer"&gt;SynthID remove vs. metadata and disclosure for photographers&lt;/a&gt; and this short &lt;a href="https://marcusellery.neocities.org/synthid-remove-publishing-checklist" rel="noopener noreferrer"&gt;publishing checklist for AI images&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Metadata is useful, and sometimes it says more than you meant to share. Knowing which layer you're dealing with is most of the battle.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>images</category>
    </item>
  </channel>
</rss>
