# What changed in remix

> 33 changes in remix 2 to 3 from its official release notes, upgrade guides and advisories: 12 breaking, 12 new APIs and options. Each one cited. Sources checked 2026-11-01. HTML: https://unstale.sh/npm/remix/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## remix 3

### Breaking changes

- 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. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- Visually styled components and style mixins have been removed, including the breadcrumbs, button, checkbox, input, and radio modules. (3.0.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.0.0)
- Applications using the Remix JSX runtime must change jsxImportSource from remix/ui to remix/component. (3.0.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.0.0)
- Most component runtime, JSX runtime, server rendering, testing, styles, and mixin imports move from remix/ui to remix/component. (3.0.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.0.0)
- Headless primitive imports move to flat subpaths, such as @remix-run/ui/accordion. (3.0.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.0.0)
- Animation imports move to @remix-run/ui/animation. (3.0.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.0.0)
- Component HMR entrypoints move from remix/ui-hmr to remix/component-hmr. (3.0.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.0.0)
- The component HMR Node hook entrypoint moves to remix/component-hmr/node. (3.0.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.0.0)
- 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. (3.0.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.0.0)
- Rename the asset loader to componentHmr when using the component HMR asset entrypoint. (3.0.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.0.0)

### New APIs and options

- createMixin(setup, { ssr: false }) skips setup and rendering on the server while keeping browser behavior and hydration; server rendering remains enabled by default. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- 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. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- Set the attribute to manual on links, forms, and submit buttons to opt out of automatic focus resets during intercepted navigation. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- 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. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- Set resetFocus: 'manual' to opt out of automatic focus resets during intercepted navigation. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- Set resetFocus: 'manual' to opt out of automatic focus resets during intercepted navigation. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- A new option controls the size of each multipart upload part. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- An imperative API from remix/component can prefetch frame HTML and assets. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- Adds a future entrypoint that streams multipart parts and file uploads instead of buffering them in memory; future APIs are not stable. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- Adds a future entrypoint that streams multipart parts and file uploads instead of buffering them in memory; future APIs are not stable. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- Adds a future entrypoint that streams multipart parts and file uploads instead of buffering them in memory; future APIs are not stable. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- Controls now accept the Navigation API values "after-transition" and "manual"; existing boolean values remain supported. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)

### Performance

- Apps that render client entries benefit from caching; a warm lookup takes about 3 µs instead of 210 µs. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- Server rendering with remix/component is about twice as fast as in 3.0 and uses less memory, with no code changes. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- remix/file-storage/s3 streams files to S3 with multipart uploads, so large files no longer need to fit in memory. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)

### Behavior and default changes

- When asset imports are restricted with allowPackages, add @remix-run/ui for primitive and animation imports. (3.0.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.0.0)
- Remix 3 reaches its first stable release. (3.0.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.0.0)

### Fixes and other changes

- Client entries requested after an HMR update now use current cache-busting URLs. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- remix/component raw HTML prop errors now include unsafeHTML() guidance for innerHTML, srcDoc, and srcdoc, and clarify that outerHTML is unsupported on host elements. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)
- Entrypoints now preserve default exports from their underlying packages, including the callable assertion helper from remix/assert and SuperHeaders from remix/headers. (3.1.0) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%403.1.0)

## remix 2

### Breaking changes

- CSRF checks now include PUT, PATCH, and DELETE on document requests. (2.17.5) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%402.17.5)
- The manifest path is disabled when future.v3_lazyRouteConfig is not enabled. (2.17.5) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%402.17.5)

### Fixes and other changes

- The URL limit is synced with the browser limit. (2.17.5) — [release notes](https://github.com/remix-run/remix/releases/tag/remix%402.17.5)
