remix
3.1.0 · 23 Oct 2026MIT58.2k / weekRepositoryHomepagenpmAtom feed
140 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.
- 3.x · latest line
3.1.0
23 Oct 2026Mixins created through
remix/componentcan usecreateMixin(setup, { ssr: false })to skip setup and render on the server while keeping browser behavior and hydration. Server rendering remains enabled by default. The option is intended for behavior that does not contribute to the server HTML.Server rendering with
remix/componentis about twice as fast as in 3.0 and uses less memory, with no code changes. Rendering a 48-product listing page withrenderToString()takes 244 µs instead of 513 µs (Node.js 24.18 on an Apple M5 Pro, median of 5 fresh-process runs, identical HTML output). Under sustained HTTP load on a 24-product store page, assembling each response with a single join lowers the server's resident memory after load from 793 MiB to 527 MiB (see #12006, #12016, #12018, and #12020).Apps that render client entries also benefit from
getScriptEntry()caching inremix/assets: a warm lookup takes about 3 µs instead of 210 µs (see #12005). See the@remix-run/componentand@remix-run/assetschangelogs for details.Use
frame.reload({ src, method, encType, body })fromremix/componentto reload another source or submit data and render the response without changing browser history.FormDatafollows GET query and POST encoding defaults, with multipart and plain-text encodings available.
Minor Changes
Mixins created through
remix/componentcan usecreateMixin(setup, { ssr: false })to skip setup and render on the server while keeping browser behavior and hydration. Server rendering remains enabled by default. The option is intended for behavior that does not contribute to the server HTML.Server rendering with
remix/componentis about twice as fast as in 3.0 and uses less memory, with no code changes. Rendering a 48-product listing page withrenderToString()takes 244 µs instead of 513 µs (Node.js 24.18 on an Apple M5 Pro, median of 5 fresh-process runs, identical HTML output). Under sustained HTTP load on a 24-product store page, assembling each response with a single join lowers the server's resident memory after load from 793 MiB to 527 MiB (see #12006, #12016, #12018, and #12020).Apps that render client entries also benefit from
getScriptEntry()caching inremix/assets: a warm lookup takes about 3 µs instead of 210 µs (see #12005). See the@remix-run/componentand@remix-run/assetschangelogs for details.Use
frame.reload({ src, method, encType, body })fromremix/componentto reload another source or submit data and render the response without changing browser history.FormDatafollows GET query and POST encoding defaults, with multipart and plain-text encodings available.Prefetch frame HTML and assets with
data-rmx-prefetch="intent",data-rmx-prefetch="viewport", or the imperativeprefetch()API fromremix/component. Both link modes support named frames and source overrides, respect Save-Data, and skipslow-2g/2gconnections. See the prefetching guide for usage, customization, and caching behavior.Opt out of automatic focus resets during intercepted navigation with
resetFocus: 'manual'innavigate()andlink(), ordata-rmx-reset-focus="manual"on links, forms, and submit buttons. Scroll and focus controls inremix/componentnow accept the Navigation API values"after-transition"(the default) and"manual"; existing boolean values remain supported.remix/file-storage/s3now streams files to S3 with multipart uploads instorage.set(), so large files no longer need to fit in memory. A newpartSizeoption controls the size of each part. See the@remix-run/file-storage-s3changelog for details.Add
remix/multipart-parser/future,remix/form-data-parser/future, andremix/middleware/form-data/future, which stream multipart parts and file uploads instead of buffering them in memory. Future APIs are not stable and may change in any release, but they are a good indication of where these packages will land in Remix's next major release.In our benchmarks, parsing a request with a 100 MiB file upload takes 37 ms instead of 68 ms, the upload handler is called after 0.2 ms instead of 45 ms, and peak memory grows by 29 MiB instead of 396 MiB. Small forms perform the same as before. See the
@remix-run/form-data-parserchangelog for the full comparison.To try it in an app, import
formData()from the/futureentrypoint. Its options are the same as the stable middleware:-import { formData } from 'remix/middleware/form-data' +import { formData } from 'remix/middleware/form-data/future' export const router = createRouter({ middleware: [ formData({ async uploadHandler(upload) { let key = crypto.randomUUID() await storage.set(key, upload) return key }, }), ], })Each upload streams from the request body, so read it inside
uploadHandler(for example by passing it tostorage.set()). It can be read only once,upload.sizeis not available until it has been read, andupload.slice()is not supported. Uploads the handler returns unread are read into a regularFile. Paired with the new streamingset()inremix/file-storage/s3, large uploads go straight to S3 without being held in memory.If your app handles file uploads, please give these entrypoints a try and tell us how it goes in GitHub Discussions. We'd especially like to hear about anything that breaks, behaves unexpectedly, or feels awkward, since that feedback will shape the next major release.
The
remix/*entrypoints now preserve default exports from their underlying packages, including the callable assertion helper fromremix/assertandSuperHeadersfromremix/headers.Added
package.jsonexports:remix/form-data-parser/futureto re-export APIs from@remix-run/form-data-parser/futureremix/middleware/form-data/futureto re-export APIs from@remix-run/form-data-middleware/futureremix/multipart-parser/futureto re-export APIs from@remix-run/multipart-parser/future
Patch Changes
Ensure client entries requested after an HMR update use current cache-busting URLs.
Include
unsafeHTML()guidance inremix/componentraw HTML prop errors (innerHTML,srcDoc, andsrcdoc) and clarify thatouterHTMLis not supported on host elements.Bumped
@remix-run/*dependencies:
3.0.0
1 Oct 2026- breaking
Most existing
remix/uiusage now moves toremix/component. The component runtime, JSX runtimes, server rendering, testing helpers, styles, and general-purpose mixins are available from the renamed entrypoints:-import { createRoot, css, on } from 'remix/ui' +import { createRoot, css, on } from 'remix/component'Apply the same rename to runtime subpaths such as
remix/ui/server,remix/ui/test, andremix/ui/dev/refresh.Applications that use the Remix JSX runtime must also update
jsxImportSource:{ "compilerOptions": { "jsx": "react-jsx", - "jsxImportSource": "remix/ui" + "jsxImportSource": "remix/component" } }Component HMR entrypoints similarly move from
remix/ui-hmrtoremix/component-hmr. Rename the asset loader tocomponentHmr():-import { uiHmr } from 'remix/ui-hmr/assets' +import { componentHmr } from 'remix/component-hmr/assets' let assetServer = createAssetServer({ scripts: { - loaders: [uiHmr()], + loaders: [componentHmr()], }, })If the development server uses the component HMR Node hook, rename that entrypoint too:
-node --import remix/ui-hmr/node server.ts +node --import remix/component-hmr/node server.ts
The
remixpackage no longer exports UI components, primitives, or animation utilities. Headless, accessible UI primitives and animation utilities remain in@remix-run/ui. This package is currently unstable, versioned independently in the v0.x range, and not part of the Remix 3.0 release candidate. Applications using these APIs must install the package separately:npm i @remix-run/ui
Move animation imports to the standalone package:
-import { animateEntrance, spring } from 'remix/ui/animation' +import { animateEntrance, spring } from '@remix-run/ui/animation'Move headless UI primitive imports to its flat subpaths:
-import * as accordion from 'remix/ui/accordion/primitives' +import * as accordion from '@remix-run/ui/accordion'
This applies to all remaining primitives:
accordion,anchor,combobox,listbox,menu,popover,select,tabs, andtoggle. The visually styled components and style mixins have been removed, including the previousbreadcrumbs,button,checkbox,input, andradiomodules.If the asset server restricts imports with
allowPackages, add@remix-run/uifor both the primitive and animation imports:{ "assets": { - "allowPackages": ["remix"] + "allowPackages": ["@remix-run/ui", "remix"] } } - breaking
First stable release of Remix 3.
Installation and new-app examples now use the stable Remix release.
Major Changes
- breaking
Most existing
remix/uiusage now moves toremix/component. The component runtime, JSX runtimes, server rendering, testing helpers, styles, and general-purpose mixins are available from the renamed entrypoints:-import { createRoot, css, on } from 'remix/ui' +import { createRoot, css, on } from 'remix/component'Apply the same rename to runtime subpaths such as
remix/ui/server,remix/ui/test, andremix/ui/dev/refresh.Applications that use the Remix JSX runtime must also update
jsxImportSource:{ "compilerOptions": { "jsx": "react-jsx", - "jsxImportSource": "remix/ui" + "jsxImportSource": "remix/component" } }Component HMR entrypoints similarly move from
remix/ui-hmrtoremix/component-hmr. Rename the asset loader tocomponentHmr():-import { uiHmr } from 'remix/ui-hmr/assets' +import { componentHmr } from 'remix/component-hmr/assets' let assetServer = createAssetServer({ scripts: { - loaders: [uiHmr()], + loaders: [componentHmr()], }, })If the development server uses the component HMR Node hook, rename that entrypoint too:
-node --import remix/ui-hmr/node server.ts +node --import remix/component-hmr/node server.ts
The
remixpackage no longer exports UI components, primitives, or animation utilities. Headless, accessible UI primitives and animation utilities remain in@remix-run/ui. This package is currently unstable, versioned independently in the v0.x range, and not part of the Remix 3.0 release candidate. Applications using these APIs must install the package separately:npm i @remix-run/ui
Move animation imports to the standalone package:
-import { animateEntrance, spring } from 'remix/ui/animation' +import { animateEntrance, spring } from '@remix-run/ui/animation'Move headless UI primitive imports to its flat subpaths:
-import * as accordion from 'remix/ui/accordion/primitives' +import * as accordion from '@remix-run/ui/accordion'
This applies to all remaining primitives:
accordion,anchor,combobox,listbox,menu,popover,select,tabs, andtoggle. The visually styled components and style mixins have been removed, including the previousbreadcrumbs,button,checkbox,input, andradiomodules.If the asset server restricts imports with
allowPackages, add@remix-run/uifor both the primitive and animation imports:{ "assets": { - "allowPackages": ["remix"] + "allowPackages": ["@remix-run/ui", "remix"] } } - breaking
First stable release of Remix 3.
Patch Changes
Installation and new-app examples now use the stable Remix release.
Bumped
@remix-run/*dependencies:
- 2.x
2.17.5
1 Jun 2026Reading the note…
2.17.4
12 Jan 2026Reading the note…
2.17.3
7 Jan 2026Reading the note…
2.17.2
29 Oct 2025Reading the note…
2.17.1
17 Sep 2025Reading the note…
2.17.0
25 Jul 2025Reading the note…
2.16.8
29 May 2025Reading the note…
2.16.7
19 May 2025Reading the note…
2.16.6
8 May 2025Reading the note…
2.16.5
9 Apr 2025Reading the note…
2.16.4
31 Mar 2025Reading the note…
2.16.3
28 Mar 2025Reading the note…
2.16.2
19 Mar 2025Reading the note…
2.16.1
17 Mar 2025Reading the note…
2.16.0
27 Feb 2025Reading the note…
2.15.3
30 Jan 2025Reading the note…
2.15.2
20 Dec 2024Reading the note…
2.15.1
9 Dec 2024Reading the note…
2.15.0
22 Nov 2024Reading the note…
2.14.0
8 Nov 2024Reading the note…
2.13.1
11 Oct 2024Reading the note…
2.13.0
11 Oct 2024Reading the note…
2.12.1
19 Sep 2024Reading the note…
2.12.0
9 Sep 2024Reading the note…
2.11.2
15 Aug 2024Reading the note…
2.11.1
5 Aug 2024Reading the note…
2.11.0
1 Aug 2024Reading the note…
2.10.3
16 Jul 2024Reading the note…
2.10.2
4 Jul 2024Reading the note…
2.10.1
3 Jul 2024Reading the note…
2.10.0
25 Jun 2024Reading the note…
2.9.2
10 May 2024Reading the note…
2.9.1
24 Apr 2024Reading the note…
2.9.0
23 Apr 2024Reading the note…
2.8.1
7 Mar 2024Reading the note…
2.8.0
28 Feb 2024Reading the note…
2.7.2
21 Feb 2024Reading the note…
2.7.1
21 Feb 2024Reading the note…
2.7.0
20 Feb 2024Reading the note…
2.6.0
1 Feb 2024Reading the note…
2.5.1
18 Jan 2024Reading the note…
2.5.0
11 Jan 2024Reading the note…
2.4.1
22 Dec 2023Reading the note…
2.4.0
13 Dec 2023Reading the note…
2.3.1
22 Nov 2023Reading the note…
2.3.0
16 Nov 2023Reading the note…
2.2.0
31 Oct 2023Reading the note…
2.1.0
16 Oct 2023Reading the note…