Content provenance on Cloudflare Workers Sign every article at the edge.
A Cloudflare Worker 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. Deploy it in a few clicks. 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 cached in Workers KV, 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 accountDeploy the Worker
Use Deploy to Cloudflare, set the route to *yourdomain.com/*, and save the credential as a secret.
Deploy to CloudflarePublish as usual
The next request for each article is signed on its way out. Repeat visits get the cached copy.
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
name = "encypher-provenance"
main = "src/worker.js"
compatibility_date = "2026-04-01"
# Route, set in the Cloudflare dashboard: *yourdomain.com/*
[[kv_namespaces]]
binding = "PROVENANCE_CACHE"
id = "<your KV namespace id>"
[vars]
# Optional: point detection at your article body
# ARTICLE_SELECTOR = ".story-body"# Paste the worker credential from your domain claim
wrangler secret put ENCYPHER_WORKER_TOKEN<!-- Page-level terms, embedded in the C2PA manifest -->
<meta name="encypher-rights" content="All rights reserved.">
<meta name="encypher-license" content="CC-BY-4.0">
<!-- Block-level terms, mapped to the sentences inside -->
<div data-encypher-rights="(c) 2026 Your Publication"
data-encypher-license="CC-BY-4.0">
<p>Your original reporting.</p>
</div># 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.
- Rights
- Block attributes win over page meta tags, and page tags win over the rights profile in your dashboard. Rights are embedded only on requests that carry the worker credential.
- Cache
- The PROVENANCE_CACHE KV namespace holds the domain record and each article's embedding plan. The Deploy button provisions it; replace the placeholder id when you deploy by hand.
- Source
- github.com/encypherai/edge-provenance-worker. The Deploy button clones it into your Cloudflare account.