ghostframe
no key Open studio
field note · 2026-10-24

C2PA: the manifest that outlives the edit

How a JUMBF block is structured, where it hides in JPEG, PNG, WebP and MP4, and why re-saving is not removal.

C2PA — the Coalition for Content Provenance and Authenticity — defines a signed record describing how a file was made and changed. Generators that support it write a manifest into the file at export. The manifest is not a comment; it is a structured, cryptographically signed object carried in a JUMBF box.

Where it lives per format

FormatCarrierTypical content
JPEGAPP11 segment, payload starts JPJUMBF superbox with manifest, assertions, signature
PNGcaBX chunk or iTXt with a JUMBF payloadSame manifest, base64 or binary
WebPEXIF / XMP chunk or a custom RIFF chunkXMP with c2pa fields, sometimes raw JUMBF
MP4 / MOVTop-level uuid box, user type d8fec3d61b0e483c92975828877ec481Manifest plus hash assertions over the media

Why export is not removal

Opening a file in an editor and exporting again often drops the manifest by accident — but not reliably, and not completely. Some editors preserve unknown segments; some write their own XMP that restates the AI origin; some carry DigitalSourceType = trainedAlgorithmicMedia in IPTC fields that survive every conversion.

Re-saving also changes the pixel data, which may weaken the separate SynthID signal, but that is a side effect, not a removal strategy. A proper pass works at the container level: parse the real structure, drop the carrier, rebuild the file, verify the rebuild decodes.

The MP4 detail that bites people

A C2PA box in MP4 sits at the top level, usually between ftyp and moov. Deleting it outright shifts every byte after it, which breaks every absolute chunk offset stored in stco or co64. The file will appear to exist, and the decoder will fail or play garbage.

The correct, lossless move is to overwrite the box in place with a free box of exactly the same length. Offsets stay valid, the media data is untouched, and the manifest is gone. ghostframe does this and then demuxes the result with ffprobe to confirm the file still opens.

What a verifier sees afterwards

Nothing to read. A C2PA verifier looks for the manifest carrier. No carrier, no assertion, no signature to check. That is a cleaner outcome than a broken manifest, which some readers report as a tampering signal rather than as absence.

Open the studio All notes