npm / remix
remix
What changed in remix 2 to 3, from its official release notes, upgrade guides and advisories. Sources checked 2026-11-01.
12 breaking12 new APIs and options3 performance2 behavior and defaults4 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli initremix 330 changes
Breaking changes 10
With the future form-data APIs, each upload streams from the request body and must be read inside uploadHandler; it can be read only once, upload.size is unavailable until read, and upload.slice() is unsupported.
Visually styled components and style mixins have been removed, including the breadcrumbs, button, checkbox, input, and radio modules.
Applications using the Remix JSX runtime must change jsxImportSource from remix/ui to remix/component.
Most component runtime, JSX runtime, server rendering, testing, styles, and mixin imports move from remix/ui to remix/component.
Headless primitive imports move to flat subpaths, such as @remix-run/ui/accordion.
Animation imports move to @remix-run/ui/animation.
Component HMR entrypoints move from remix/ui-hmr to remix/component-hmr.
The component HMR Node hook entrypoint moves to remix/component-hmr/node.
The remix package no longer exports UI components, primitives, or animation utilities; headless primitives and animation utilities remain in @remix-run/ui, which applications must install separately.
Rename the asset loader to componentHmr when using the component HMR asset entrypoint.
New APIs and options 12
createMixin(setup, { ssr: false }) skips setup and rendering on the server while keeping browser behavior and hydration; server rendering remains enabled by default.
Prefetch frame HTML and assets with intent or viewport link modes; both support named frames and source overrides, respect Save-Data, and skip slow-2g/2g connections.
Set the attribute to manual on links, forms, and submit buttons to opt out of automatic focus resets during intercepted navigation.
Reload another source or submit data and render the response without changing browser history; FormData follows GET query and POST encoding defaults, with multipart and plain-text encodings available.
Set resetFocus: 'manual' to opt out of automatic focus resets during intercepted navigation.
Set resetFocus: 'manual' to opt out of automatic focus resets during intercepted navigation.
A new option controls the size of each multipart upload part.
An imperative API from remix/component can prefetch frame HTML and assets.
Adds a future entrypoint that streams multipart parts and file uploads instead of buffering them in memory; future APIs are not stable.
Adds a future entrypoint that streams multipart parts and file uploads instead of buffering them in memory; future APIs are not stable.
Adds a future entrypoint that streams multipart parts and file uploads instead of buffering them in memory; future APIs are not stable.
Controls now accept the Navigation API values "after-transition" and "manual"; existing boolean values remain supported.
Performance 3
Apps that render client entries benefit from caching; a warm lookup takes about 3 µs instead of 210 µs.
Server rendering with remix/component is about twice as fast as in 3.0 and uses less memory, with no code changes.
remix/file-storage/s3 streams files to S3 with multipart uploads, so large files no longer need to fit in memory.
Behavior and default changes 2
When asset imports are restricted with allowPackages, add @remix-run/ui for primitive and animation imports.
Remix 3 reaches its first stable release.
Fixes and other changes 3
Client entries requested after an HMR update now use current cache-busting URLs.
remix/component raw HTML prop errors now include unsafeHTML() guidance for innerHTML, srcDoc, and srcdoc, and clarify that outerHTML is unsupported on host elements.
Entrypoints now preserve default exports from their underlying packages, including the callable assertion helper from remix/assert and SuperHeaders from remix/headers.
remix 23 changes
Breaking changes 2
CSRF checks now include PUT, PATCH, and DELETE on document requests.
The manifest path is disabled when future.v3_lazyRouteConfig is not enabled.
Fixes and other changes 1
The URL limit is synced with the browser limit.