Live playground
Add a watermark to an image.
Use the sample or choose your own image, adjust the text and logo, then save the result. Everything runs in this browser tab.
- 1Choose content
- 2Adjust the look
- 3Save or copy code
Live preview
Result

The image URL will appear hereCore 2 · Variable Recipe and Web Blob
Choose several images. Add each filename automatically.
Your current text, logo, and output settings become one reusable Recipe, and each text mark includes its source filename. Web runs up to four jobs at once and keeps results in selection order.
Batch results
0 / 0Core 2 · Cross-runtime invisible traces
Keep the image clean. Recover a short ID later.
Write a short locator into the pixels, then authenticate it with the same key. Use it for distribution tracing—not as DRM or proof that an image was never edited.
This page exposes its demo key, so do not copy it into production. Use random locators and manage keys on a trusted server or controlled client.
Batch distribution code
const embedded = await Marker.embedInvisibleMany(
recipients.map((recipient) => ({
image: { src: source },
payload: recipient.locator,
key,
strength: 'robust',
})),
{ concurrency: 4, signal, onProgress }
);
const verified = await Marker.detectInvisibleMany(
embedded.flatMap((result) =>
result.status === 'fulfilled'
? [{ image: { src: result.value.uri }, key, search: 'robust' }]
: []
)
);Compose signed Content Credentials
This is a workflow example only. The playground never sends images to a signing service; use your own trusted server.
const signed = await Marker.embedInvisibleWithCredentials({
watermark: { image: { src: source }, payload: locator, key },
claim: { title: 'distribution-copy.png', format: 'image/png' },
adapter: yourServerAdapter,
});
const credentials = await Marker.verifyContentCredentials({
image: signed.signedImage,
adapter: yourServerAdapter,
});Open the C2PA service example- Text watermark
- Logo watermark
- Text + logo
- Single or tiled
- Opacity and outline
- Layer blend modes
- Position and rotation
- Variable and conditional Recipe
- Invisible trace watermark
- Interactive layer editor
- Content Credentials adapter
- PNG, JPEG, and Web Blob
Use this result in your project
The code below already includes your current settings.