Loading lesson…
Two families of provenance technology. One attaches signed metadata. The other embeds invisible patterns in the pixels or waveform. Here's how to implement both. The manifest contains ASSERTIONS (who captured/generated it, which tools/models, editing history, bounding boxes of AI-generated regions).
The EU AI Act (Article 50, applicable August 2026) requires providers of AI systems that generate synthetic content to ensure outputs are marked as artificially generated. California's AB 2655/2839 and similar state laws in the US create adjacent obligations. The TAKE IT DOWN Act (US federal, 2025) criminalizes non-consensual intimate deepfakes. Provenance isn't optional for serious products anymore.
| Approach | How it works | Survives editing? | Cryptographically verifiable? |
|---|---|---|---|
| C2PA Content Credentials | Signed metadata manifest attached to file. | No — stripped by naive tools. Yes if CAI-aware tools preserve it. | Yes — PKI-based signatures. |
| SynthID (Google) | Imperceptible signal embedded in pixels / waveform / tokens. | Survives most editing (crop, compression, recolor). | Yes — Google's detector, not public. |
| Traditional watermark (Stability, others) | Invisible pattern in pixels. | Partial — resilient to compression, breaks on heavy edits. | Provider-specific. |
| Perceptual hash (PhotoDNA, PDQ) | Fingerprint of the image; used for matching against known-bad DB. | Robust — designed for hash-based matching. | Not about authorship; about matching. |
C2PA defines a signed 'manifest' that travels with a file (JPEG, PNG, MP4, WAV). The manifest contains ASSERTIONS (who captured/generated it, which tools/models, editing history, bounding boxes of AI-generated regions). The manifest is signed by the creator's certificate (issued by a C2PA-trusted authority). Verification is cryptographic.
# Using c2pa-python (Adobe's reference implementation)
from c2pa import Builder, create_signer, SigningAlg
# Create a signer from your cert + key (issued by a C2PA-trusted CA)
signer = create_signer(
certs_path="./my-certificate-chain.pem",
private_key_path="./my-private.key",
alg=SigningAlg.PS256,
)
# Build a manifest
manifest_json = {
"claim_generator": "tendril-creative-studio/1.0",
"format": "image/png",
"assertions": [
{
"label": "c2pa.actions",
"data": {"actions": [
{"action": "c2pa.created", "softwareAgent": "Flux 1.1 Pro"},
{"action": "c2pa.edited", "softwareAgent": "Photoshop 2026"},
]},
},
{
"label": "c2pa.training-mining",
"data": {"entries": {
"c2pa.ai_generative_training": {"use": "notAllowed"},
}},
},
],
}
builder = Builder(manifest_json)
builder.sign_file(
signer=signer,
source_path="./ai_generated.png",
dest_path="./ai_generated_signed.png",
)
# Anyone with the C2PA Reader can verify this file
# and see it was AI-generated, edited in Photoshop, and
# the creator opted out of training.Sign a C2PA manifest onto an AI-generated image.SynthID embeds detection signals directly in pixels (for images), spectrograms (for audio), and token distributions (for text). Unlike C2PA, it survives crops, color adjustments, and re-encoding. The tradeoff: SynthID only detects Google-generated content (Gemini, Imagen, Veo, Lyria). It's not an open standard.
// Browser-side: verify C2PA badge using @contentauth/sdk
import { createC2pa } from "@contentauth/sdk";
const c2pa = await createC2pa({
wasmSrc: "/c2pa-wasm.wasm",
workerSrc: "/c2pa.worker.js",
});
const { manifestStore } = await c2pa.read(imageBlob);
if (!manifestStore) {
// No Content Credentials — unknown provenance
return { verified: false, reason: "no_manifest" };
}
const active = manifestStore.activeManifest;
const aiActions = active.assertions.data.find((a) => a.label === "c2pa.actions");
const aiGenerated = aiActions?.data.actions.some(
(a) => a.action === "c2pa.created" && a.softwareAgent
);
return {
verified: true,
aiGenerated,
signer: active.signatureInfo?.issuer,
editHistory: aiActions?.data.actions,
};Read and display Content Credentials in a browser UI.15 questions · take it digitally for instant feedback at tendril.neural-forge.io/learn/quiz/end-creative-provenance-creators
What is the core idea behind "Provenance — C2PA, SynthID, Watermarking"?
Which term best describes a foundational idea in "Provenance — C2PA, SynthID, Watermarking"?
A learner studying Provenance — C2PA, SynthID, Watermarking would need to understand which concept?
Which of these is directly relevant to Provenance — C2PA, SynthID, Watermarking?
Which of the following is a key point about Provenance — C2PA, SynthID, Watermarking?
Which of these does NOT belong in a discussion of Provenance — C2PA, SynthID, Watermarking?
Which statement is accurate regarding Provenance — C2PA, SynthID, Watermarking?
Which of these does NOT belong in a discussion of Provenance — C2PA, SynthID, Watermarking?
What is the key insight about "Don't over-promise" in the context of Provenance — C2PA, SynthID, Watermarking?
What is the key insight about "Implementation priority" in the context of Provenance — C2PA, SynthID, Watermarking?
What is the recommended tip about "Use AI as a co-creator" in the context of Provenance — C2PA, SynthID, Watermarking?
Which statement accurately describes an aspect of Provenance — C2PA, SynthID, Watermarking?
What does working with Provenance — C2PA, SynthID, Watermarking typically involve?
Which of the following is true about Provenance — C2PA, SynthID, Watermarking?
Which best describes the scope of "Provenance — C2PA, SynthID, Watermarking"?