DEV Community

dylan yu
dylan yu

Posted on

What's actually inside your image (and PDF) before you upload it

Disclosure: I build Remove AI Meta, a browser tool that appears in this post. Everything here can also be done with exiftool, and I show those commands too.

Most "why did my post get a label?" questions come down to bytes nobody looked at. Before reaching for any tool, it helps to know what is physically in the file. This is a developer's tour of that metadata and how to check it twice: once before cleaning, once after.

The layers a single image can carry

An image from a phone, an editor or an AI generator can hold several independent metadata blocks:

  • EXIF – camera make/model, timestamps, and often GPS coordinates. In JPEG it lives in the APP1 segment.
  • XMP – an XML packet. This is where IPTC fields like DigitalSourceType sit; a value such as trainedAlgorithmicMedia says the image was AI-generated.
  • C2PA Content Credentials – a signed manifest stored in JUMBF boxes (APP11 segments in JPEG, a caBX chunk in PNG). It records where the file came from and how it was edited.
  • PNG text chunks – tEXt/iTXt entries. Stable Diffusion UIs write the full prompt and settings into a parameters chunk.

These are independent. Removing EXIF leaves C2PA in place; stripping C2PA leaves your GPS. That's why "I already removed metadata" often isn't true.

One thing metadata tools cannot reach: invisible watermarks like SynthID or TrustMark are encoded in the pixels. No metadata cleaner, mine included, removes them.

Quick look with exiftool:

exiftool -a -G1 -s photo.jpg          # every tag, grouped by block
exiftool -JUMBF:all -XMP-iptcExt:DigitalSourceType photo.jpg
exiftool -PNG:all render.png          # shows the "parameters" text chunk
Enter fullscreen mode Exit fullscreen mode

Step 1: LinkedIn Content Credentials (the CR icon)

LinkedIn shows a CR icon on an uploaded image or video that still has a signed C2PA record. Clicking it shows the signer and edit details. It doesn't by itself mean "AI-generated"; camera and newsroom photos carry the same kind of record. There's also no setting to remove the icon from a post that's already live. The only lever is the file you upload next.

Here's what I do before attaching a still:

  1. Inspect first. Drop the JPEG, PNG or WebP you will actually post. Don't use a re-export of it.

Dropzone in Remove AI Meta

  1. Read the C2PA section. If a manifest is present you'll see it listed with the claim generator and actions.

C2PA manifest found during inspect

  1. Strip in "AI only" mode if you want to keep EXIF, or "All metadata" otherwise, then download the -cleaned file.

  2. Verify the output, not the promise. The tool re-parses the cleaned bytes, and the "After" column comes from that new scan. Confirm the C2PA row is gone.

Before/after re-scan of the cleaned file

The exiftool equivalent:

exiftool -JUMBF:all= -XMP-iptcExt:DigitalSourceType= -o clean.jpg photo.jpg
exiftool -a -G1 -s clean.jpg | grep -iE 'jumbf|c2pa|digitalsource'   # should print nothing
Enter fullscreen mode Exit fullscreen mode

More detail on what LinkedIn's panel shows and when it appears: LinkedIn Content Credentials explained.

While you're in there, check GPS. An EXIF-heavy camera file looks like this on inspect, and the coordinates are often the part you least want public:

Camera EXIF and GPS found on inspect

Step 2: PDF metadata (two copies, plus history)

PDFs are worse than images because the same facts are usually stored twice:

  • the document information dictionary: Title, Author, Subject, Keywords, Creator, Producer, CreationDate, ModDate, and custom keys like Company;
  • an XMP packet, which repeats the author and dates, and may include edit history (each save, which app, when) and document IDs.

On top of that, a PDF saved incrementally keeps earlier revisions inside the file. Blank the Author field in one viewer and the old value can still be sitting in a previous revision. Embedded JPEGs can carry their own EXIF, such as the scanner model, scan time or even GPS.

Inspect from the command line:

exiftool -a -G1 report.pdf
qpdf --show-npages report.pdf && strings report.pdf | grep -i '/Author'
Enter fullscreen mode Exit fullscreen mode

exiftool -all:all= report.pdf is a trap. For PDFs exiftool's edits are reversible because it appends an incremental update, so the original metadata is still in the file. You need to rewrite it, e.g. qpdf --linearize after the edit, or use a tool that rebuilds the file.

The Remove PDF metadata page does that rebuild in the browser. It removes the Info dictionary, XMP on document/page/image/font level, PieceInfo, C2PA embedded as an associated file, and EXIF/XMP/IPTC inside JPEG images (the compressed image data stays byte-identical). It also drops old revisions and gives the file a new ID. Then it reopens the result, searches the bytes for the removed names and dates, and compares every page with the original before you can download.

What it deliberately keeps: page content, links, bookmarks, form values, comments (with their author names), and attachments. It doesn't redact text, and names printed on the page stay there. Encrypted or damaged PDFs are refused. Cleaning a signed PDF breaks the signature (it asks first), so clean, then sign.

A two-minute pre-upload habit

  1. Inspect the exact file you'll publish.
  2. Decide which blocks should go: C2PA/XMP AI fields, EXIF/GPS, PNG prompt text, PDF author/history.
  3. Clean.
  4. Re-inspect the output. If you didn't scan the cleaned file, you don't know it's clean.
  5. Remember the limits: pixel watermarks stay, already-posted content keeps its label, and a platform can label a clean file anyway.

Pricing, since you'll ask: one file free per browser, Pro is $9.99 one-time for unlimited files and batch ZIP. exiftool is free and fine if you're comfortable in a terminal.

Top comments (0)