Pre-release Changes
-
BREAKING CHANGE: In
createAssetServer()fromremix/assets, replace thefileMapoption with optional directory-basedmounts. Mounts recursively preserve the path beneath each public and filesystem root, keeping module URLs aligned with the filesystem hierarchy used for package resolution.When
mountsis omitted, the asset server uses{ app: 'app', npm: 'node_modules' }.To migrate an app whose
fileMapis equivalent to the new defaults, remove thefileMapoption entirely:// before createAssetServer({ basePath: '/assets', fileMap: { '/app/*path': 'app/*path', '/npm/*path': 'node_modules/*path', }, // ... }) // after createAssetServer({ basePath: '/assets', // ... })
To migrate custom
fileMaprules that preserve directory hierarchy, remove the trailing wildcard from both sides and renamefileMaptomounts:// before createAssetServer({ basePath: '/assets', fileMap: { '/source/*path': 'app/*path', '/vendor/*path': 'node_modules/*path', }, // ... }) // after createAssetServer({ basePath: '/assets', mounts: { source: 'app', vendor: 'node_modules', }, // ... })
-
BREAKING CHANGE: Remove the built-in Atmosphere auth provider and its DPoP-specific types from
remix/auth. UseOAuthTokensin place ofOAuthStandardTokens. Custom provider packages can usecreateOAuthProvider()and extendOAuthTokenswith protocol-specific data. Applications using the Atmosphere provider must remove it or move their atproto authentication to a separate package. -
BREAKING CHANGE: Remove
addEventListeners()fromremix/ui. Use nativetarget.addEventListener(type, listener, { signal })instead. If a listener used the helper's second callback argument, create anAbortControllerand abort it when the listener runs again or its lifetime signal aborts. -
BREAKING CHANGE: Remix UI framework-owned DOM attributes now consistently use the
data-rmx-*namespace. Update navigation, DOM preservation, and reconciliation key attributes to their newdata-rmx-*names. -
BREAKING CHANGE: During server rendering through
remix/ui, script elements with non-string children previously serialized those children as escaped HTML text. They now render empty and report an error. Pass a single string child to preserve script content without HTML entity escaping; script-tag sequences that could terminate the element remain escaped. -
Add
remix db rollbackfor reverting applied migrations with step, target, and dry-run bounds (see #11723). -
Add shared asset configuration and inspection through
remix/cliandremix/assets, includingloadConfig(),remix assets,remix assets inspect <url-or-file>,assetServer.getAssets(), andassetServer.getAssetDetails()(see #11726). -
Add the
runRemixDb()rollback command throughremix/data-table/cli(see #11723). -
Add a
package.jsonexport:remix/spato expose SPA render middleware and the client runtime from@remix-run/spa
-
Add the conventional Remix UI
render()middleware toremix/middleware/render, including built-in frame and client-entry asset integration (see #11607). -
Ship the
remix.jsonJSON Schema atremix/schema/remix.jsonso projects can use version-matched editor validation without a network connection. -
Move Remix 3 from beta to its first release candidate,
3.0.0-rc.1. -
Bumped
@remix-run/*dependencies: