Skip to main content

Thumbnails

External inspectors such as Adobe Content Credentials and Verify render a small preview image for the manifest and for each ingredient in its provenance chain. The signing service only ever receives a hash, never the asset bytes, so it cannot render these previews server-side: you supply them, rendered client-side.

A thumbnail is a { data, format } pair: the encoded image bytes and its MIME type. Use image/jpeg or image/png; some inspectors don't render SVG previews. Thumbnails are optional everywhere. Omit one and the manifest is still valid — the inspector shows no preview tile for that node, except an ingredient built from an already-signed asset, which falls back to that asset's own claim thumbnail (see Ingredient thumbnails).

Asset thumbnail

The manifest's thumbnail is the preview for the asset being signed. It is attached as the c2pa.thumbnail.claim resource.

const { sidecar } = await sdk.sign(edited, "photo.jpg", {
thumbnail: { data: await readFile("photo.thumb.jpg"), format: "image/jpeg" },
origin: { sourceType: "digitalCapture" },
actions: [{ kind: "published" }],
}, { storage: { mode: "embedded" } });

Ingredient thumbnails

Each ingredient carries its own optional thumbnail, attached as that ingredient's c2pa.thumbnail.ingredient resource. In a provenance chain this gives every prior stage (the capture, the edit, the publish) its own preview tile, so an inspector can show the asset's visual history rather than only the final frame.

You can usually omit it when the ingredient's data is an already-signed asset: the signer reuses that asset's own claim thumbnail for the ingredient tile. This covers the common chain case (origin.parent) and any signed component. Set thumbnail explicitly only to override that, or when the source was signed without one. Provenance-less ingredients (raw data with no embedded manifest) have nothing to inherit, so supply theirs to get a tile.

const { sidecar } = await sdk.sign(edited, "edited.jpg", {
thumbnail: { data: editedThumb, format: "image/jpeg" },
origin: {
parent: {
data: captureSigned,
thumbnail: { data: captureThumb, format: "image/jpeg" },
},
},
actions: [{ kind: "edited" }],
}, { storage: { mode: "embedded" } });

See also