Major Changes
-
breaking: remove
experimental.handleRenderingErrorsflag -
breaking: make
getRequestandsetResponsesynchronous -
breaking: TypeScript 6 is now the minimum required version
-
breaking: refresh all load functions/queries when clicking a link to the current URL
-
breaking: upgrade to
cookiev2. Cookie names must now contain only ASCII characters -
breaking: require Node 22 or newer
-
breaking: remove the
preloadStrategyoption.modulepreloadwill always be used -
breaking: default the cookie
pathoption to'/' -
breaking: remove
@sveltejs/kit/node/polyfills -
breaking: add
config.kit.output.linkHeaderPreloadto preload using theLinkheader -
breaking: require
@sveltejs/vite-plugin-sveltev7 -
breaking: make
page.urlimmutable on a type level -
breaking: remove
base,assets, andresolveRoutefrom$app/paths -
breaking: remove
createEntriesfrom theBuilderobject passed to adapter functions -
breaking: return no content for 204 responses
-
breaking: rename
Pathnametype toPathandAssettoAssetPath
breaking: remove leading/fromPathandAssetPath -
breaking:
handle'sresolveis now typed to always return aPromise -
breaking: require Svelte config options to be passed through the Vite plugin
-
breaking: form action responses now use the HTTP status code returned from
fail -
breaking: write tsconfig to
node_modules/$app/tsconfig -
breaking: remove the deprecated CSRF
checkOriginoption in favor oftrustedOrigins -
breaking: the
deltaproperty now only exists forpopstatenavigation events -
breaking: change
form.errortype fromanytoApp.Error | undefined -
breaking: remove deprecated
pragmaheader in version polling for improved CORS support -
breaking:
gotonow rejects when called with a URL that does not resolve to a route within the app, matching the existing behaviour for external URLs -
breaking: require Svelte 5.56.4 or newer
-
breaking: error on
event.url,event.paramsandevent.routeaccess inside queries -
breaking: delete
$service-workermodule -
breaking: move
defineEnvVarsto@sveltejs/kit/env -
breaking: nested server-only directories
-
feat: allow adapters to provide additional Vite plugins
-
breaking: replace the
$libalias with#liband removefiles.libconfig. -
chore: change
error,isHttpError,redirect, andisRedirectto refer to public type instead of internal class -
breaking: add 'error' result type to
preloadData -
breaking: detect new deployments on data, remote, and form action responses, tab focus, and visibility change, and default
version.pollIntervalto 1 hour -
breaking: disallow cross-origin form submissions without a
Content-Typeheader -
breaking: Server-only directories (
/server/in the path) are now treated as server-only everywhere inside the project (exceptsrc/routesand the assets directory) -
breaking:
configexported from a universal route file takes precedence over a server one -
breaking: require Vite 8. Provides new functionality even for existing Vite 8 users such as faster builds with Vite hook filters and more powerful SvelteKit adapters with the Vite environment API
-
breaking: remove
data-sveltekit-*option'off'in favour offalse -
breaking: move tracing out of the experimental namespace and remove the instrumentation flag
-
breaking: add
kit.paths.originconfig option, removekit.prerender.originand theadapter-nodeORIGINenvironment variable -
breaking: remove
$app/stores -
breaking: add
refreshAlland deprecateinvalidateAll -
breaking: disallow
*.remote.ts/jsfiles unlessexperimental.remoteFunctionsis enabled -
breaking: replace the
noScrollandkeepFocusoptions ofgotowith a singleresetoption, and thedata-sveltekit-noscrollanddata-sveltekit-keepfocusattributes withdata-sveltekit-reset -
breaking: don't abort navigation when calling
invalidate(All)during navigation -
breaking: consistent special filename patterns
-
breaking: allow
handleErrorto influence status code -
breaking: delegate CORS handling to Vite for static directory requests during development
-
breaking: require
vite@^8.0.12, the first Vite 8 release bundling stablerolldown1.0.0 -
breaking: only include routes with a
+pageor+serverinRouteId -
breaking: require Node 22.17
-
breaking: deprecate
error(status, {...})in favour oferror(status, message, {...}) -
breaking: forbid external redirects by default
-
breaking: remove param files in folder in favor of
params.js/tsfile -
breaking:
preloadCodenow takes a route ID (e.g./blog/[slug]) instead of a pathname. Route IDs are not prefixed withpaths.base -
breaking: remove deprecated
.run()method from live queries
Minor Changes
-
feat: allow hyphens in param and matcher names
-
feat: add
$app/manifestmodule withimmutable,assets,prerendered, androutesexports -
feat: add
ErrorPropsto generated types -
feat: support sourcemaps in production
-
feat: return the list of compressed files from
builder.compress -
feat: warn when tsconfig doesn't exclude service worker (#16645)
-
feat: validate that all remote form fields were created with form.fields.foo.as(...)
-
feat: support function validators for environment variables
-
feat: use
type: 'module'for service worker registrations -
feat: add shallow routing to
gotoand deprecatepushStateandreplaceState -
feat: make
$app/pathsimportable in service workers -
feat: preserve page state set through
goto(..., { state, persistState: true })across reloads -
feat: reinstate
$env/static/private,$env/dynamic/private,$env/static/public,$env/dynamic/publicand$app/environmentas deprecated aliases for$app/env/private$app/env/publicand$app/env -
feat: add
pageandendpointbooleans to$app/manifest'sroutes, and export aManifestRoutetype -
feat:
$app/service-workermodule -
feat: resolve paths using the Vite config
rootoption instead ofprocess.cwd()to better support monorepo configurations such as Vitest workspaces -
feat: better error logging
-
feat: add
PageRouteIdandEndpointRouteIdto$app/types -
feat: better tsconfig validation
-
feat: add
dirty()property to form fields -
chore: deprecate
Responsehelpers in favor of platform-provided alternatives -
feat: add
cookies.parsemethod -
feat: support custom values in
page.stateviatransporthook (#16662) -
fix: default cookies to
securetofalseduring development -
feat: warn when naively proxying requests that result in responses with a
content-encodingheader (#16633)
Patch Changes
-
fix: persist global app state across module graph reloads (#16663)
-
fix: generate valid
Pathtypes for routes with optional or rest params, several params in one segment, or escape sequences -
fix: allow
undefinedvalues to be passed to form field.as(...)where applicable -
chore: deprecate
builder.rimrafandbuilder.mkdirpin favour ofnode:fsmethods (#16610) -
fix: don't treat callable standard schemas as function param matchers
-
fix: decode all numeric character references, including above
ffff, when crawling prerendered pages -
fix: include queries refreshed from within another query in the serialized response
-
fix: reject malformed streamed data encoding
-
perf: cache the default cookie header parse and avoid allocations in
cookies.get -
fix: exclude deleted cookies from
cookies.getAll()so it stays consistent withcookies.get() -
fix: hide stack traces for internal errors like 404s
-
chore: deduplicate repeated CSP directive handling
-
fix: defer
query.refresh()in server commands until after the command body completes -
fix: drain unconsumed request bodies so keep-alive connections don't hang
-
fix: resolve service worker and
tsconfig.jsonbased on Viterootsetting -
perf: match only unpaired surrogates when escaping HTML
-
fix: treat
data:protocol URLs as external for redirect -
chore: deduplicate request hashing for serialized fetch responses
-
fix: don't treat
Object.prototypemembers as param matchers during validation -
fix: don't report empty environment variables as missing
-
fix: exclude routes without a page or endpoint from
routesin$app/manifest, and remove directories with no route files fromLayoutParams -
fix: avoid Vite dev server reload on initial page request
-
fix: don't set a
nullaccept-languageheader on internalfetchsub-requests when the incoming request has none -
fix: correctly detect prerendered paths in server
fetchwhenpaths.baseis set -
fix: populate
$app/env/*dynamic variables in contexts that don't run the dev server, such asvite-node -
fix: properly handle Date objects in form.fields.set
-
fix: return 404 for form actions and remote functions whose name is an
Object.prototypemember -
fix: no longer throw "An impossible situation occurred" when a server-only module is imported by both server and client code
-
fix: don't duplicate remote modules in the generated manifest
-
chore: reuse base64 and text decoding helpers
-
fix: explain the removal of
$liband$service-workerwhen their imports fail to resolve (#16635) -
fix: correctly massage stack traces with async frames (#16633)
-
fix: mark
RequestEventproperties asreadonly(#16661) -
fix: update
matchparameter type (#16636) -
fix: generate sourcemaps for remote modules
-
fix: avoid empty getElementById() call on hash routing navigation
-
fix: serve
.icofiles withimage/x-iconContent-Type -
fix: exclude inlined files from the page's
$app/manifestimmutable list -
fix: avoid client-side code being bundled by Cloudflare Wrangler
-
fix: record the mime types of prerendered paths in the server manifest
-
chore: clarify which hooks run during server route resolution
-
fix: make
paths.origintype looser -
feat: send periodic
keep-aliveSSE comments fromquery.liveto prevent idle-timeout errors -
fix: warn if hook files are spelled as "hook" instead of "hooks"
-
chore: only generate each route's resolution module once when prerendering
-
fix: skip clean fields when programmatically validating forms
-
perf: skip import graph collection outside client environments
-
breaking: experimental remote form
validate({ includeUntouched })option is nowall -
fix: avoid client build warning about externalising
node:async_hooks -
fix: reinstate
$app/environmentas an alias for$app/env, in case dependencies import it -
fix: error when reading non-serialized
set-cookieheaders viagetSetCookieinload(#16614) -
perf: avoid quadratic remote form issue merging
-
chore: deprecate the
aliasoption -
fix: don't attempt to serialize fetch responses when the request body is not a string or TypedArray
-
fix: handle rejected streamed server data after delayed loads
-
fix: render pages over sibling endpoints without GET or HEAD handlers
-
fix: prevent infinite loops when server-side queries refresh each other in a cycle during the single-flight drain
-
fix: populate
versionin service workers -
feat: add field.touched() helper to remote form fields
-
fix: read the error status of
App.Errorin theprerenderandquery.liveremote functions -
fix: resolve remote modules as external during dev prebundling so packages can re-export remote functions
-
fix: propagate errors from prerendered remote responses instead of re-running the function
-
fix: allow reserved words (e.g.
delete,class) as remote function export names -
fix: reset failed
<svelte:boundary>on client navigation so a stale+error.svelteis torn down -
fix: expand
[x+nn]and[u+nnnn]escape sequences when resolving a route id to a pathname -
fix: respect the status returned from
handleErroron the fallback error page served to error-page sub-requests -
fix: warn if there are plugins using
transformIndexHtml -
fix: refetch route-tracking server data when navigating away from an error page
-
fix: allow routes to contain
[and]via the[x+5b]and[x+5d]escapes -
chore: remove dependency on kleur
-
fix: serialize
query(...).set(...)/query(...).refresh()values into the rendered HTML when called from within a query during SSR -
fix: detect
$app/serverand$app/env/privateclient imports when SvelteKit is installed inside the project root (#16648) -
fix: sort directory entries when building the route manifest so node indices are deterministic across runtimes (e.g. Bun and Node)
-
fix: skip unnecessary
version.jsonchecks ifupdated.currentis alreadytrue -
fix: allow generation of $app/tsconfig without TypeScript installed
-
chore: remove dependency on
set-cookie-parser -
fix: fall back to the page's form actions when a sibling endpoint has no POST handler
-
perf: use a
Setto check element ids when validating fragment links during prerendering -
fix: preserve shared client chunk hashes when the app version changes
-
fix: include hoisted packages in Vite's
server.fs.allowlist -
fix: only include
_app/immutablefiles in$app/manifest'simmutablein the service worker -
chore: remove the dead
SSRState.fallbackfield and name the server state fork semantics -
fix: import resolved peer dependencies as file URLs so project-relative resolution works on Windows
-
fix: log errors caught by the Vite dev server handler
-
fix: resolve
rootper instance of the SvelteKit Vite plugin -
fix: ignore path casing differences when warning about overridden Vite config on Windows
-
fix: return a lightweight 404 instead of rendering the error page for subresource requests
-
fix: preserve stripped path prefixes by making trailing-slash redirects relative
-
fix: preserve the current URL search parameters when submitting a remote form without JavaScript
-
fix: only treat files in node_modules as remote modules when the package has a peer dependency on @sveltejs/kit (#16492)
-
fix: treeshake prerendered remote functions in the right chunks
-
chore: deduplicate type-stripping logic in
tweak_types -
fix: error during development if the adapter does not support instrumentation and it exists
-
fix: use mouseover+mousemove for preloading to reduce events
-
fix: write generated tsconfig to
node_modules/$app/tsconfig.jsonso that tools with simplified tsconfig resolution can find it -
fix: more informative error message when running a command inside a query or prerender function
-
fix: prerender and crawl pages whose
content-typeheader carries acharsetparameter -
fix: stream promised
readresults lazily instead of eagerly buffering them -
fix: correctly decode
[u+nnnn]escape sequences aboveffff