Content provenance with Netlify Edge Functions Sign every article at the edge.
A Netlify Edge Function adds a signed label to every article as your CDNCDN: Content delivery network: servers around the world that keep copies of a site close to readers so pages load fast. serves it. The label shows who published the text and whether it changed. Signing is free for publishers.

- A label in every article
- Each article gets content provenanceContent provenance: The record of where a piece of content came from and how it changed, carried with the content itself.: a C2PA manifestC2PA manifest: The signed label itself: a small package inside a file that records who signed it, what they declared and how to check it. and invisible provenance markersProvenance markers: Encypher's general name for invisible characters that carry a signed label inside text. in its text, sentence by sentence.
- Nothing changes at origin
- The edge functionEdge function: A small program that runs on a CDN's servers and can change a page as it passes through to the reader. sits between readers and your origin serverOrigin server: The server where your site's pages are built and stored before a CDN delivers them.. It finds the article on WordPress, Ghost, Substack, Webflow, Hugo and custom HTML.
- Never blocks a page
- It is fail-openFail open: If signing is down, the page is served unsigned instead of failing, so readers never see an error.: if signing fails for any reason, readers get your original page.
- Fast repeat visits
- Signed results are kept in memory while the function stays warm, so repeat visits skip the signing call.
Set it up
Claim your domain
Create a free account and claim your domain. You get a worker credentialWorker credential: A secret key, tied to one verified domain, that lets an Encypher edge worker ask for signatures., a secret key tied to that domain.
Create a free accountAdd the Edge Function
Copy the function into netlify/edge-functions and add its block to netlify.toml.
Set the credential and deploy
Add ENCYPHER_WORKER_TOKEN under site environment variables, then deploy.
Check the label
Open an article and look for the header X-Encypher-Provenance: active. Then paste a paragraph into the free checker.
Open the free checker
Copied text keeps the label

The markers sit between the letters, so they travel when a reader copies a paragraph into a document, a post or an AI prompt.
Some apps strip them. Any edit to the words shows up when the text is checked.
Check a paragraphFor engineers
Show the technical detail
[[edge_functions]]
function = "encypher-provenance"
path = "/*"# Copy the function into your site
cp -r src/ netlify/edge-functions/encypher-provenance/
# Set ENCYPHER_WORKER_TOKEN in Site settings > Environment variables
netlify deploy --prod# Signed pages carry this header
curl -sI https://yourdomain.com/your-article | grep -i x-encypher
# X-Encypher-Provenance: active
# Domain status: your domain token and org ID
curl -s https://yourdomain.com/.well-known/encypher-verify- Article detection
- Eight checks in order: your selector override, the <article> tag, common CMS classes, Schema.org articleBody, <main>, JSON-LD, the densest paragraph cluster, then <body>.
- What is sent
- Only the visible article text, up to 51,200 characters by default. The API returns an embedding plan, and the worker writes the markers into the HTML at those positions.
- Status header
- X-Encypher-Provenance is active on a signed page, or skipped:oversized, skipped:empty or skipped:error when the page passes through unchanged.
- Runtime
- Runs on Deno and calls context.next() to fetch the origin response before it signs.
- Cache
- An in-process map keeps domain records for 24 hours and embedding plans for one hour, per warm isolate.