Aki Ariga writes Democritizing Data. On 2 February 2024 he published Migrated From Netlify to Cloudflare Pages. This is his own post, not a Cloudflare page.
The blog is Hugo with Hugoblox, the theme that used to be Wowchemy. Content lives on GitHub. Netlify had hosted it for a long time. He moved because access from Japan felt slow.
If you are looking at the same route, start with the Netlify → Cloudflare Pages playbook. Aki followed Cloudflare’s Migrating from Netlify to Pages guide. His post is the Hugo build-variable field report, plus an honest note that fonts were the real slowness.
Why he left
He still calls Netlify a great service. The complaint is latency in Japan. He wanted the blog to load faster for readers there, including himself.
He does not publish a TTFB chart, a region, or a Netlify bill. Japan slowness is the reason he gives.
How he moved
The content repo already sat on GitHub. He added the Cloudflare Pages GitHub app. Pages detected the project and built it.
Cloudflare’s Hugo preset is hugo as the build command and public as the output directory. That matches a default Hugo site. Hugoblox is still Hugo underneath, so the same pair applies unless you changed publishDir.
Hugo’s version is not implied by the repo. On Netlify you set HUGO_VERSION. Cloudflare Pages uses the same variable. He wrote that he used Hugo 0.88.1, and then set HUGO_VERSION to 0.101.0. Those are both his numbers. He does not explain the gap. Pin a version. Confirm the binary the build uses.
The other change is the site URL Hugo bakes into canonical links. On Netlify the read-only variable is $URL, the production address of the site. On Cloudflare Pages the injected variable is $CF_PAGES_URL. Cloudflare’s Hugo guide tells you to pass it as the base URL:
hugo -b $CF_PAGES_URL
He had been passing $URL on Netlify. He switched the -b flag to $CF_PAGES_URL. Leave the old name in the build command and Hugo writes the wrong host into the HTML.
DNS was short because the zone already lived on Cloudflare. Custom domains say that if the zone is on Cloudflare, Pages can add the CNAME after you associate the domain in the Pages dashboard. A raw CNAME to *.pages.dev without that association can return a 522. He says Cloudflare set DNS up for him. Associate the domain first, then let the record appear.
He does not describe moving _redirects, _headers, Netlify Functions, or Netlify Forms. The official migrate guide is blunt about those: a _redirects file can come across with fewer conditions, netlify.toml rules need a rewrite, forms lose data-netlify, and Functions use a different handler. A Hugo blog often has none of that. If yours does, Aki’s path is incomplete on purpose.
What he gained
Builds felt fast. PageSpeed Insights went up. He could feel the site in the browser. He does not publish the old score, the new score, or a Lighthouse JSON. I am not inventing a number.
He also said hosting was not the main slowness. Downloading fonts was. Caching those fonts on Cloudflare is what fixed the feel.
A Hugo page can be small while the webfonts are not. Moving the HTML to another CDN, and still fetching fonts from a slow third party, leaves the wait in place.
chezo.uno is still up. Later posts on the same site cover CMS and embedding work. I have not found a post where he moves the host again.
What broke or got skipped
He does not describe a failed build, a broken canonical URL, or a rollback to Netlify. The two settings he flags are the ones that would have broken the build or the links: Hugo’s version, and the -b URL.
He also does not describe exporting Netlify form submissions, Identity users, deploy history, or analytics. Those stay on Netlify unless you copy them. A personal Hugo blog can ignore that. A site with a Netlify form cannot.
CF_PAGES_URL on a preview deploy is the preview host, not your custom domain. If you bake that into production assets by mistake, share links and canonical tags point at pages.dev. Production and preview need separate values, the same way Netlify separates $URL from $DEPLOY_PRIME_URL.
The 0.88.1 versus 0.101.0 line is unfinished. Build the same commit locally with the version you pin, then set that version on Pages. The number in a blog sentence may not match the dashboard.
What I would copy
Keep the GitHub app path. The repo is the portable part. Netlify plugins and dashboard snippets are not.
Write down every Netlify environment variable before you delete the site. HUGO_VERSION and the base URL are the two Hugo ones. Copy the rest only after you know whether they are build-time or runtime.
Change $URL to $CF_PAGES_URL in the build command, then view source on a preview and search for the host. If you still see netlify.app, the flag did not take.
Associate the custom domain in Pages before you edit DNS by hand.
Measure fonts on the old host and the new one. If the HTML got faster and the webfonts did not, cache or self-host the fonts. Aki says that was the fix.
Run the Netlify → Cloudflare Pages playbook. Use Aki’s post for the Hugo version, the -b URL swap, and the reminder that fonts can dwarf the host change.