Last updated 2 November 2026
Take a fingerprint (SHA-256) of every file in your build folder, fetch the same file from your live domain, and compare the two. Matching fingerprints mean that exact file is live. We found no Cloudflare command that does this for you, so it's a short script, below.
"Deployment complete" means Cloudflare accepted the upload. It doesn't compare what your domain now serves with the folder on your machine. A file can still differ for reasons that have nothing to do with a broken deploy:
.html from addresses. /about.html answers with a 308 redirect to /about, which serves the same file._headers, _redirects and the functions/ folder never appear as files on your site._redirects can hide a file. A rule like /package.json / 302 means that file is never served as itself.So a fair check follows redirects, skips config files and redirected files, and knows Cloudflare's HTML changes. Anything left that differs is a real difference.
Run this from your build folder (bash, with your domain in place of yoursite.com). It fetches each file with a unique query, so no cache answers, and follows redirects:
find . -type f ! -name _headers ! -name _redirects ! -name _routes.json ! -path './functions/*' | while read -r f; do
p="${f#.}"
live=$(curl -sL "https://yoursite.com${p// /%20}?x=$RANDOM" | sha256sum | cut -c1-64)
mine=$(sha256sum "$f" | cut -c1-64)
[ "$live" = "$mine" ] || echo "DIFFERS: $p"
done
No output means every file matches.
dist, public, _site and so on, depending on your framework).name@1.0.0: that's Cloudflare's email handling, not your deploy._redirects rule is sending it away. Leave it out of the check, or change the rule.golproductions.com, 2 November 2026: 112 files checked. 5 HTML pages differed. In every one, the only difference was the <!--email_off--> markers, which Cloudflare had removed. With those markers removed on both sides, all 112 matched.
Jogga, which we make, does this check for you, and adds a deploy ID so you know which deploy is live. It stamps the build, then reads the live site and checks every file:
npx @golproductions/jogga deploy dist https://yoursite.com -- npx wrangler pages deploy dist --project-name yourproject
LIVE: https://golproductions.com is serving deploy a3325da45b31047e, stamped 2026-11-02T06:07:50.573Z. All 112 files match, byte for byte.
This checks static files. Server code (Pages Functions, Workers) can't be fetched as a file, so it can't be compared this way. Pages built fresh on every request will always differ.
Why does /page.html redirect on Cloudflare Pages?
Pages serves pages without the .html ending and redirects the .html address to it with a 308. The file served is the same, so follow the redirect before comparing.
Why do _headers and _redirects return 404 on my site?
Cloudflare Pages reads those files as settings and never serves them as files. Leave them out of the check.
Do I need to purge the cache first?
Usually not. A unique query on each request, like ?x=123, gets past caches that store each full address separately, which Cloudflare does by default.
Jogga is free.