Metadata: what survives a render
The renderer decodes the original, runs the edit log on its pixels and encodes a new file from the rendered pixels and the output options. The encoder never sees the original's bytes, so nothing from its container reaches the output by accident. One thing is carried across on purpose: the ICC profile.
| In the original | In the output | Why |
|---|---|---|
| ICC profile | Kept, unchanged, in every format change: JPEG ICC_PROFILE segments, PNG iCCP, WebP ICCP. Only a profile that describes RGB data, up to 4 MiB; a Gray or CMYK profile is dropped | The pixels are not colour managed. They keep their meaning only with the profile they were decoded with. A Gray or CMYK profile describes channels the decoder has already converted to RGBA and would make the output invalid. |
PNG sRGB, gAMA, cHRM, cICP | Dropped | The core does not read them. A PNG that describes its colours only this way renders as if it were sRGB. |
| EXIF orientation | Applied to the pixels. No orientation tag is written | The output is upright. log.source.width and height are the size after orientation. |
| EXIF, everything else | Dropped | Camera, lens, GPS, time and the thumbnail would describe pixels that no longer exist. |
| IPTC, XMP | Dropped | Credit, caption and copyright belong to your system. Write them after the render. |
| C2PA manifest | Removed | A manifest signs the pixels it was made for. Over rendered pixels it would be a broken binding. Sign the output in your pipeline; the original stays available as its parent. |
| The edit log | Written when embedEditLog is set: PNG iTXt, JPEG XMP, WebP XMP | Resume editing |
The same table holds in the browser, on Node, Deno, Bun and Lambda and in the native CLI, because the codecs live in the core. A test per row runs on every commit.
The ICC profile is the one piece of source metadata that enters the output, so it is bounded: at most 4 MiB, a valid header, RGB. A larger or foreign profile is dropped, never an error.
What this means for the hash
hash is the sha256 of the output bytes, and the ICC profile is part of them. Two renders of the same source and log still have the same hash. A render of a source with a profile and a render of the same pixels without one do not, although their pixels are identical.
The preview
The stage draws the working copy's pixel values as sRGB. An original in Adobe RGB or Display P3 therefore looks a little different on the stage than in a colour-managed viewer. The export keeps the profile, so the file shows the right colours there.