Anonymous pages cached at the edge (setPageCache, e.g. / with public, s-maxage=300, stale-while-revalidate=3600, /automations and /sync) carry the per-request CSP nonce from lib/security-headers.ts in both the header and the inline <script nonce> tags, so Cloudflare hands the same nonce to every visitor until the entry expires. A nonce anyone can read off a public response no longer stops an injected inline script on that page, which is the protection script-src 'nonce-...' is there for.
How I know: on 2026-11-02 I fetched https://airglow.run/ three times with Node's fetch over ~20 s; every response had cf-cache-status: EXPIRED/HIT and the same script-src 'self' 'nonce-9XlfwwpW/oKlOLeOyTtIvQ==', and the body's inline scripts used that nonce. Uncached pages (404s, cf-cache-status: DYNAMIC) got a fresh nonce each time.
Where to start: setPageCache in lib/http.ts and the nonce in lib/security-headers.ts. Options: hashes ('sha256-...') for the fixed inline scripts (theme bootstrap, speculation rules) instead of a nonce on cacheable pages, moving those scripts to static files, or not caching pages that carry a nonce.
Found by the loop while working on #69, rkey 69, branch loop/69, merged onto main as 9564625f86f1.
Queued: the loop will work on this version of the issue.
loop:queued cid=bafyreignki3umgnhdkibwugs2nt7riz3ym6jpv4ewnjjchshbq7zrcqnee