← Back to all briefs
Architecture56s read

SvelteKit 3.0 Lands With a Long Breaking-Change List and Node 22 as the Floor

The framework's first major in years moves remote function types, drops polyfills, and raises the runtime and TypeScript floors, so the upgrade is a migration rather than a bump.

SvelteKit 3.0.0 shipped on October 1, and the whole adapter family went major alongside it: adapter-node to 6, adapter-static to 4, adapter-netlify to 7, adapter-cloudflare to 8, adapter-vercel to 7. If you maintain a SvelteKit app, this is a migration, not a version bump.

The floors moved first. Node 22 is the minimum, TypeScript 6 is the minimum, and @sveltejs/vite-plugin-svelte v7 is required. Those three constraints decide whether you can start at all before you reach the API changes.

The API surface then moves in ways that surface as type errors rather than runtime surprises, which is the helpful kind. Remote function types move to $app/server. Pathname is renamed to Path, Asset to AssetPath, and both lose their leading slash. getRequest and setResponse become synchronous. page.url becomes immutable at the type level. The base, assets, and resolveRoute exports leave $app/paths.

Two behaviour changes are worth reading twice. Clicking a link to the current URL now refreshes all load functions and queries, where previously it did nothing. And form action responses now use the HTTP status returned from fail, so handlers relying on the old code will report differently.

Also removed: the preloadStrategy option, so modulepreload is always used, and @sveltejs/kit/node/polyfills.

Read the migration guide first. The type-level changes make most of the work mechanical; the runtime floors are what force sequencing.