๐Ÿ“… Historical page. This content reflects minia2a as of its publication date and is kept for the record. Current model: x402 pay-per-call in USDC on Base only, 5 free trial calls per signed wallet, no credits and no top-up rail. โ†’ See current

Your CDN rewrites your HTML before the agent reads it

2026-09-18 ยท measured against a live production site behind Cloudflare

We wanted a deploy check that was worth something. The one we had asked whether the site returned 200, which is a green light that does not illuminate the thing you changed: a deploy that never reached the edge and an edge serving a stale copy both answer 200 cheerfully. So we tried the obvious stronger test โ€” fetch the page through the public internet, compare it byte-for-byte to the file on disk.

Every page "diverged".

That is the interesting part, because it was not a bug and it was not noise. The edge is rewriting the bytes, and it is doing it in a small, closed, fully enumerable set of ways. If you serve anything to a machine reader โ€” docs, OpenAPI specs, llms.txt, agent instructions โ€” this is worth knowing precisely, because one of those rewrites makes your text unreadable to exactly the clients you are writing it for.

The full inventory: four rewrites, and nothing else

We diffed served body against on-disk file across a spread of pages โ€” HTML, plain text, XML, JSON. Four transformations, no others:

Non-HTML is untouched. robots.txt, sitemap.xml, an extensionless .well-known JSON document: byte-identical, zero injection. The rewriting is specific to HTML, which makes sense โ€” it is aimed at browsers.

The rewrite that breaks machine readers

A bare address in your HTML โ€” anywhere, in prose or inside a <code> block โ€” comes out the other side as this:

<a href="/cdn-cgi/l/email-protection" class="__cf_email__"
   data-cfemail="89f9fbe0ffe8eaf0c9e4e0e7e0e8bbe8a7fce2">[email&#160;protected]</a>

A browser runs the injected decode script and renders the real address. Everything else sees the literal string [email protected].

So if your documentation tells an agent to contact you at an address, the agent does not receive that address. It receives a placeholder that looks like a redaction. The page renders perfectly in every browser you will test it in, which is why this survives review โ€” the readers who are broken are the ones who do not run JavaScript.

There is a second shape, for a link rather than prose. A mailto: anchor is rewritten into a protection link wrapping a span:

<a href="/cdn-cgi/l/email-protection#f8888a918e999b81..."><span
   class="__cf_email__" data-cfemail="3d4d4f544b5c5e44...">[email&#160;protected]</span></a>

Two shapes, and if you only notice one you will misread a page. We know because we only noticed one at first, and the page carrying both shapes reported as a 241-byte unexplained divergence โ€” a false alarm we then spent time chasing. The mailto: form has to be matched first, since it is the more specific pattern; a rule written for the bare form stops at the inner </span> and leaves the outer tag mangled.

The payload is reversible, so decode it

The obfuscated payload is not a hash. It is XOR: the first byte of data-cfemail is a key, and every following byte is the plaintext XORed with it. Six lines will undo it:

def decode_cf_email(hexstr):
    raw = bytes.fromhex(hexstr)
    key = raw[0]
    return "".join(chr(b ^ key) for b in raw[1:])

# "89f9fbe0ffe8eaf0c9e4e0e7e0e8bbe8a7fce2" -> "[email protected]"

This matters more than it looks. The tempting move is to strip the obfuscated anchor and compare what is left. Do not. Stripping deletes content that still exists on disk โ€” the real address โ€” so the remainder can never match, and you have built a check that fails forever for a reason you have already decided to ignore. Decoding restores the text you actually wrote, which means the comparison stays exact and the decoder itself stays falsifiable: if the decoding is wrong, the address will not equal the one in the file, and the check goes red. A transform you merely tolerate is a blind spot. A transform you invert is still a test.

What this buys you

With the four rewrites undone, served and on-disk content match byte-for-byte โ€” 11 of 11 pages, including the email-bearing one. That gives a deploy check that can actually fail. It catches a deploy that never reached the edge, and it catches an edge holding a stale copy, neither of which a status code can see.

Two design notes, both learned the hard way:

If you serve machine-readable docs

  1. Fetch your own docs the way an agent does: curl, no JavaScript. Grep for __cf_email__ and /cdn-cgi/. If either appears, a machine reader is getting placeholders.
  2. Check your source files for the same strings. Those belong to the edge, not to you; if they are on disk, someone once saved an HTTP response and deployed it as source, and now it is baked in permanently.
  3. Do not verify deploys with a status code. Compare content โ€” and when the edge rewrites it, enumerate the rewrites and invert them rather than giving up on the comparison.

The general lesson is not about any one CDN. It is that the artifact you authored and the artifact your reader receives are two different things, and the gap between them is invisible to every check that stops at the transport layer. If your product is read by machines, that gap is your product.