This site ran on Netlify for years, and Netlify was good to me. But over time more of the site’s infrastructure lived on Cloudflare anyway: DNS, analytics, and eventually the CMS itself (see Serverless WordPress). Running builds and hosting on one platform and everything else on another stopped making sense, so in October 2026 I moved it all to Cloudflare Workers.

What moved where

On NetlifyOn Cloudflare
Netlify buildsWorkers Builds, with preview builds for every branch
Static hostingWorkers static assets
netlify.toml headers and redirects_headers and _redirects files
Netlify FormsA Worker that checks Cloudflare Turnstile and emails the submission
Image processingCloudflare Image Transformations

Doing the move without downtime

I didn’t want a big-bang switch. During the migration, a separate read-only Worker served the existing content and media, so the new site could build against real content before anything changed for visitors. Once the Cloudflare build was producing the same pages, switching over was just DNS.

Things that caught me out

  • Nitro presets. Nuxt tried to be clever about detecting Cloudflare and built for the wrong target. Forcing the static preset meant the build output what wrangler.jsonc expected.
  • Preview builds have their own secrets. Workers Builds keeps a separate set of variables for preview builds, so previews were failing on a missing syntax highlighting token. Previews now skip highlighting when the token isn’t there.
  • Cloudflare blocking my own builds. The build fetches content from the CMS, and Cloudflare’s bot protection occasionally answered with an interactive challenge. The build now spots that case and says so, rather than failing with a confusing error.
  • Algolia. I’d added Algolia search to the 404 page a while ago. It didn’t earn its place in the new setup, so I removed it.

The upgrade I did at the same time

Moving platforms was a good excuse to pay down some debt, so the site also moved to Nuxt 4 and Vue 3, and then to TypeScript. Doing it in the same project meant I only had to re-test everything once.

Was it worth it?

Yes, having the site in one place is easier for maintenance, updates, and visibility.