Summary
The action we were relying on is deleted, so now we have to do some manual dance because we're stuck on Direct Upload.
ChainSafe/forest-website#184
This works, but a cleaner solution would be to migrate to something that CF really supports and doesn't put traps on.
Completion Criteria
Additional Links & Resources
https://developers.cloudflare.com/workers/static-assets/migration-guides/migrate-from-pages/
https://developers.cloudflare.com/workers/ci-cd/builds/configuration/
https://developers.cloudflare.com/workers/ci-cd/builds/git-integration/
Claude's migration steps (unverified, treat with caution)
Prerequisites (verified)
- chainsafe.io runs on Cloudflare nameservers (gene/toby.ns.cloudflare.com). Required — Workers custom domains don't support external DNS with a CNAME, unlike Pages. This was the likeliest blocker; it's fine.
- No functions/, no _headers, no _redirects. Nothing Pages-specific to port.
- out/404.html exists, so 404 handling maps cleanly.
Steps
-
Add wrangler.jsonc at repo root. Assets-only Worker, so no main and no ASSETS binding:
{
"name": "forest-website",
"compatibility_date": "2026-09-22",
"assets": {
"directory": "./out",
"not_found_handling": "404-page"
}
}
-
Add wrangler to devDependencies. Verify locally before touching anything remote: yarn build && npx wrangler dev (port 8787, not Pages' 8788), then npx wrangler deploy --dry-run.
-
In the Cloudflare dashboard, create the Worker and connect the GitHub repo via Workers Builds. Settings:
- build command yarn build
- deploy command npx wrangler deploy
- preview deploy command npx wrangler versions upload (this is what non-production branches get)
- enable non-production branch builds, so Dependabot branches keep getting previews
- build variable NODE_VERSION=22 — same wrangler requirement that just failed your run
-
Confirm it works on *.workers.dev while Pages still serves production. No user impact yet.
-
Cut over the domain. forest.chainsafe.io can only attach to one of them, so: remove it as a custom domain from the Pages project, then add it as a Custom Domain on the Worker. This is the only step with a downtime window — keep it short and do it deliberately.
-
Delete .github/workflows/cf-deploy.yaml. Workers Builds does check runs and PR comments natively, so the whole Record GitHub deployment step disappears with it.
-
Clean up afterwards: delete the Pages project once you're satisfied, and drop CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID from the Actions and Dependabot secret stores if nothing else uses them.
Caveats worth knowing before you commit to this
- The Deployments sidebar probably still won't come back. Docs promise check runs and PR comments; they don't mention GitHub Deployment environment records. Unconfirmed either way — I'd treat the sidebar as gone.
- forest-landing.pages.dev dies. Preview URLs become version-scoped *.workers.dev URLs.
- Pages environment variables don't carry over to Workers Builds; reconfigure them there.
- Workers has no equivalent of Pages' branch deploy controls.
Summary
The action we were relying on is deleted, so now we have to do some manual dance because we're stuck on Direct Upload.
ChainSafe/forest-website#184
This works, but a cleaner solution would be to migrate to something that CF really supports and doesn't put traps on.
Completion Criteria
Additional Links & Resources
https://developers.cloudflare.com/workers/static-assets/migration-guides/migrate-from-pages/
https://developers.cloudflare.com/workers/ci-cd/builds/configuration/
https://developers.cloudflare.com/workers/ci-cd/builds/git-integration/
Claude's migration steps (unverified, treat with caution)
Prerequisites (verified)
Steps
Add wrangler.jsonc at repo root. Assets-only Worker, so no main and no ASSETS binding:
{
"name": "forest-website",
"compatibility_date": "2026-09-22",
"assets": {
"directory": "./out",
"not_found_handling": "404-page"
}
}
Add wrangler to devDependencies. Verify locally before touching anything remote: yarn build && npx wrangler dev (port 8787, not Pages' 8788), then npx wrangler deploy --dry-run.
In the Cloudflare dashboard, create the Worker and connect the GitHub repo via Workers Builds. Settings:
Confirm it works on *.workers.dev while Pages still serves production. No user impact yet.
Cut over the domain. forest.chainsafe.io can only attach to one of them, so: remove it as a custom domain from the Pages project, then add it as a Custom Domain on the Worker. This is the only step with a downtime window — keep it short and do it deliberately.
Delete .github/workflows/cf-deploy.yaml. Workers Builds does check runs and PR comments natively, so the whole Record GitHub deployment step disappears with it.
Clean up afterwards: delete the Pages project once you're satisfied, and drop CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID from the Actions and Dependabot secret stores if nothing else uses them.
Caveats worth knowing before you commit to this