Major Changes
-
#14306
141c4a2Thanks @ematipico! - Changes the API for creating a customentrypoint, replacing thecreateExports()function with a direct export pattern.What should I do?
If you're using a custom
entryPointin your Cloudflare adapter config, update your existing worker file that usescreateExports()to reflect the new, simplified pattern:my-entry.ts
import type { SSRManifest } from 'astro'; import { App } from 'astro/app'; import { handle } from '@astrojs/cloudflare/handler'; import { DurableObject } from 'cloudflare:workers'; class MyDurableObject extends DurableObject<Env> { constructor(ctx: DurableObjectState, env: Env) { super(ctx, env); } } export function createExports(manifest: SSRManifest) { const app = new App(manifest); return { default: { async fetch(request, env, ctx) { await env.MY_QUEUE.send('log'); return handle(manifest, app, request, env, ctx); }, async queue(batch, _env) { let messages = JSON.stringify(batch.messages); console.log(`consumed from our queue: ${messages}`); }, } satisfies ExportedHandler<Env>, MyDurableObject: MyDurableObject, }; }To create the same custom
entrypointusing the updated API, export the following function instead:my-entry.ts
import { handle } from '@astrojs/cloudflare/utils/handler'; export default { async fetch(request, env, ctx) { await env.MY_QUEUE.send("log"); return handle(manifest, app, request, env, ctx); }, async queue(batch, _env) { let messages = JSON.stringify(batch.messages); console.log(`consumed from our queue: ${messages}`); } } satisfies ExportedHandler<Env>,The manifest is now created internally by the adapter.
-
#15435
957b9feThanks @rururux! - Changes the default image service fromcompiletocloudflare-binding. Image services options that resulted in broken images in development due to Node JS incompatiblities have now been updated to use the noop passthrough image service in dev mode. - (Cloudflare v13 and Astro6 upgrade guidance) -
#15400
41eb284Thanks @florian-lefebvre! - Removes theworkerEntryPointoption, which wasn't used anymore. Set themainfield of your wrangler config insteadSee how to migrate
-
#14306
141c4a2Thanks @ematipico! - Development server now runs in workerdastro devnow runs your Cloudflare application using Cloudflare's workerd runtime instead of Node.js. This means your development environment is now a near-exact replica of your production environment—the same JavaScript engine, the same APIs, the same behavior. You'll catch issues during development that would have only appeared in production, and features like Durable Objects, Workers Analytics Engine, and R2 bindings work exactly as they do on Cloudflare's platform.New runtime
Previously,
Astro.locals.runtimeprovided access to Cloudflare-specific APIs. These APIs have now moved to align with Cloudflare's native patterns.What should I do?
Update occurrences of
Astro.locals.runtime:Astro.locals.runtime.env→ Importenvfromcloudflare:workersAstro.locals.runtime.cf→ Access viaAstro.request.cfAstro.locals.runtime.caches→ Use the globalcachesobjectAstro.locals.runtime(forExecutionContext) → UseAstro.locals.cfContext
Here's an example showing how to update your code:
Before:
--- const { env, cf, caches, ctx } = Astro.locals.runtime; const value = await env.MY_KV.get('key'); const country = cf.country; await caches.default.put(request, response); ctx.waitUntil(promise); --- <h1>Country: {country}</h1>After:
--- import { env } from 'cloudflare:workers'; const value = await env.MY_KV.get('key'); const country = Astro.request.cf.country; await caches.default.put(request, response); Astro.locals.cfContext.waitUntil(promise); --- <h1>Country: {country}</h1> -
#15345
840fbf9Thanks @matthewp! - Removes thecloudflareModulesadapter optionThe
cloudflareModulesoption has been removed because it is no longer necessary. Cloudflare natively supports importing.sql,.wasm, and other module types.What should I do?
Remove the
cloudflareModulesoption from your Cloudflare adapter configuration if you were using it:import cloudflare from '@astrojs/cloudflare'; export default defineConfig({ adapter: cloudflare({ - cloudflareModules: true }) }); -
#14445
ecb0b98Thanks @florian-lefebvre! - Astro v6.0 upgrades to Vite v7.0 as the development server and production bundler - (v6 upgrade guidance) -
#15037
8641805Thanks @matthewp! - Updates the Wrangler entrypointPreviously, the
mainfield inwrangler.jsoncpointed to the built output, since Wrangler only ran in production after the build completed:{ "main": "dist/_worker.js/index.js", }Now that Wrangler runs in both development (via workerd) and production, Astro provides a default entrypoint that works for both scenarios.
What should I do?
Update your
wrangler.jsoncto use the new entrypoint:{ "main": "@astrojs/cloudflare/entrypoints/server", }This single entrypoint handles both
astro devand production deployments. -
#15480
e118214Thanks @alexanderniebuhr! - Drops official support for Cloudflare Pages in favor of Cloudflare WorkersThe Astro Cloudflare adapter now only supports deployment to Cloudflare Workers by default in order to comply with Cloudflare's recommendations for new projects. If you are currently deploying to Cloudflare Pages, consider migrating to Workers by following the Cloudflare guide for an optimal experience and full feature support.
Minor Changes
-
#15435
957b9feThanks @rururux! - Adds support for configuring the image service as an object with separatebuildandruntimeoptionsIt is now possible to set both a build-time and runtime service independently. Currently,
'compile'is the only available build time option. The supported runtime options are'passthrough'(default) and'cloudflare-binding':import { defineConfig } from 'astro/config'; import cloudflare from '@astrojs/cloudflare'; export default defineConfig({ adapter: cloudflare({ imageService: { build: 'compile', runtime: 'cloudflare-binding' }, }), });See the Cloudflare adapter
imageServicedocs for more information about configuring your image service. -
#15077
a164c77Thanks @matthewp! - Adds support for prerendering pages using the workerd runtime.The Cloudflare adapter now uses the new
setPrerenderer()API to prerender pages via HTTP requests to a local preview server running workerd, instead of using Node.js. This ensures prerendered pages are built using the same runtime that serves them in production. -
#14306
141c4a2Thanks @ematipico! - Adds support forastro previewcommandDevelopers can now use
astro previewto test their Cloudflare Workers application locally before deploying. The preview runs using Cloudflare's workerd runtime, giving you a staging environment that matches production exactly—including support for KV namespaces, environment variables, and other Cloudflare-specific features. -
#15037
8641805Thanks @matthewp! - The Wrangler configuration file is now optional. If you don't have custom Cloudflare bindings (KV, D1, Durable Objects, etc.), Astro will automatically generate a default configuration for you.What should I do?
If your
wrangler.jsonconly contains basic configuration like this:{ "main": "@astrojs/cloudflare/entrypoints/server", "compatibility_date": "2026-01-28", "assets": { "directory": "./dist", "binding": "ASSETS", }, }You can safely delete the file. Astro will handle this configuration automatically.
You only need a wrangler config file if you're using:
- KV namespaces
- D1 databases
- Durable Objects
- R2 buckets
- Environment variables
- Custom compatibility flags
- Other Cloudflare-specific features
-
#15006
f361730Thanks @florian-lefebvre! - Adds new session driver object shapeFor greater flexibility and improved consistency with other Astro code, session drivers are now specified as an object:
-import { defineConfig } from 'astro/config' +import { defineConfig, sessionDrivers } from 'astro/config' export default defineConfig({ session: { - driver: 'redis', - options: { - url: process.env.REDIS_URL - }, + driver: sessionDrivers.redis({ + url: process.env.REDIS_URL + }), } })Specifying the session driver as a string has been deprecated, but will continue to work until this feature is removed completely in a future major version. The object shape is the current recommended and documented way to configure a session driver.
-
#15556
8fb329bThanks @florian-lefebvre! - Adds support for more@cloudflare/vite-pluginoptionsThe adapter now accepts the following options from Cloudflare's Vite plugin:
auxiliaryWorkersconfigPathinspectorPortpersistStateremoteBindingsexperimental.headersAndRedirectsDevModeSupport
For example, you can now set
inspectorPortto provide a custom port for debugging your Workers:// astro.config.mjs import { defineConfig } from 'astro/config'; import cloudflare from '@astrojs/cloudflare'; export default defineConfig({ adapter: cloudflare({ inspectorPort: 3456, }), });
Patch Changes
-
#15044
7cac71bThanks @florian-lefebvre! - Removes an exposed internal API of the preview server -
#15080
f67b738Thanks @gameroman! - Updateswranglerdependency to be apeerDependencyover adependency -
#15039
6cc96e7Thanks @matthewp! - Fixes static content deployment by moving it to another folder, so Wrangler can tell the static and worker content apart -
#15452
e1aa3f3Thanks @matthewp! - Fixes server-side dependencies not being discovered ahead of time during developmentPreviously, imports in
.astrofile frontmatter were not scanned by Vite's dependency optimizer, causing a "new dependencies optimized" message and page reload when the dependency was first encountered. Astro is now able to scan these dependencies ahead of time. -
#15391
5d996ccThanks @florian-lefebvre! - Fixes types of thehandle()function exported from/handler, that could be incompatible with types generated bywrangler types -
#15696
a9fd221Thanks @Princesseuh! - Fixes duplicate logging showing up in some cases when prerendering pages -
#15309
4b9c8b8Thanks @ematipico! - Update the underneath@cloudflare/workers-typeslibrary to address a warning emitted by the package manager during the installation. -
#15079
4463a55Thanks @ascorbic! - Fixes auto-provisioning of default bindings (SESSION KV, IMAGES, and ASSETS). Default bindings are now correctly applied whether or not you have awrangler.jsonfile.
Previously, these bindings were only added when no wrangler config file existed. Now they are added in both cases, unless you've already defined them yourself. -
#15694
66449c9Thanks @matthewp! - Fixes deployment of static sites with the Cloudflare adapterFixes an issue with detecting and building fully static sites that caused deployment errors when using
output: 'static'with the Cloudflare adapter -
#15565
30cd6dbThanks @ematipico! - Fixes an issue where the use of theCodecomponent would result in an unexpected error. -
#15121
06261e0Thanks @ematipico! - Fixes a bug where the Astro, with the Cloudflare integration, couldn't correctly serve certain routes in the development server. -
#15026
90c608cThanks @matthewp! - Improves prebundling of internal Astro modules -
#15778
4ebc1e3Thanks @ematipico! - Fixes an issue where the computedclientAddresswas incorrect in cases of a Request header with multiple values. TheclientAddressis now also validated to contain only characters valid in IP addresses, rejecting injection payloads. -
#15669
d5a888bThanks @florian-lefebvre! - Removes thecssescdependencyThis CommonJS dependency could sometimes cause errors because Astro is ESM-only. It is now replaced with a built-in ESM-friendly implementation.
-
#15075
ee2c260Thanks @matthewp! - Adds deprecation errors forAstro.locals.runtimeproperties to help migrate from Astro v5 to v6When accessing the removed
Astro.locals.runtimeproperties on Cloudflare, developers now receive clear error messages explaining the migration path:Astro.locals.runtime.env→ Useimport { env } from "cloudflare:workers"Astro.locals.runtime.cf→ UseAstro.request.cfAstro.locals.runtime.caches→ Use the globalcachesobjectAstro.locals.runtime.ctx→ UseAstro.locals.cfContext
-
#15336
9cce92eThanks @ascorbic! - Fixes a dev server issue where framework components from linked packages would fail to load with a 504 error.This could occur when using
client:onlyor other client directives with components from monorepo packages (linked viafile:or workspace protocol). The first request would trigger Vite's dependency optimizer mid-request, causing concurrent client module requests to fail. -
#15255
a66783aThanks @florian-lefebvre! - Fixes a case where the types ofhandle()could mismatch with the ones from the user's project. They now rely on globals, that can be obtained by runningwrangler types -
#15045
31074fcThanks @ematipico! - Fixes an issue where using the Vue integration with the Cloudflare adapter resulted in some runtime errors. -
#15386
a0234a3Thanks @OliverSpeir! - Updatesastro add cloudflareto use the latest validcompatibility_datein the wrangler config, if available -
#15432
e2ad69eThanks @OliverSpeir! - Removes unnecessary warning about sharp from being printed at start of dev server and build -
#15588
425ea16Thanks @rururux! - Fixes an issue whereesbuildwould throw a "Top-level return cannot be used inside an ECMAScript module" error during dependency scanning in certain environments. -
#15450
50c9129Thanks @florian-lefebvre! - Fixes a case wherebuild.serverEntrywould not be respected when using the new Adapter API -
#15030
b5aa52bThanks @ematipico! - Fixed an issue where the featureexperimental.chromeDevtoolsWorkspacewasn't supported by the new version of the adapter. -
#15648
802426bThanks @rururux! - Restore and fix<Code />component functionality on Cloudflare Workers. -
#15478
ee519e5Thanks @matthewp! - Fixes fully static sites to not output server-side worker code. When all routes are prerendered, the_worker.jsdirectory is now removed from the build output. -
#15636
5ecd04cThanks @florian-lefebvre! - Adds an error when running on Stackblitz, sinceworkerddoesn't support it -
#15269
6f82aaeThanks @ematipico! - Fixes a regression wherebuild.serverEntrystopped working as expected. -
#15798
05771cfThanks @rururux! - Fixes a regression where using the adapter would throw an error when using an integration that uses JSX. -
#15053
674b63fThanks @matthewp! - Excludesastro:*andvirtual:astro:*from client optimizeDeps in core. Needed for prefetch users since virtual modules are now in the dependency graph. -
#15495
5b99e90Thanks @leekeh! - Refactors to usemiddlewareModeadapter feature (set toclassic) -
Updated dependencies [
4ebc1e3,4e7f3e8,a164c77,cf6ea6b,a18d727,240c317,745e632]:- @astrojs/internal-helpers@0.8.0
- @astrojs/underscore-redirects@1.0.0