diff --git a/.changeset/breezy-planes-roll.md b/.changeset/breezy-planes-roll.md
deleted file mode 100644
index 6d1bb70e6a..0000000000
--- a/.changeset/breezy-planes-roll.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"react-router": patch
----
-
-handle external redirects in from server actions
diff --git a/.changeset/green-pens-push.md b/.changeset/green-pens-push.md
deleted file mode 100644
index c0a3998ba5..0000000000
--- a/.changeset/green-pens-push.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@react-router/dev": patch
----
-
-Update `valibot` dependency to `^1.1.0`
diff --git a/.changeset/pre.json b/.changeset/pre.json
deleted file mode 100644
index f913c41df4..0000000000
--- a/.changeset/pre.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-  "mode": "exit",
-  "tag": "pre",
-  "initialVersions": {
-    "integration": "0.0.0",
-    "integration-cloudflare-dev-proxy-template": "0.0.0",
-    "integration-rsc-parcel": "0.0.0",
-    "integration-rsc-vite": "0.0.0",
-    "integration-rsc-vite-framework": "0.0.0",
-    "integration-vite-5-template": "0.0.0",
-    "integration-vite-6-template": "0.0.0",
-    "integration-vite-7-beta-template": "0.0.0",
-    "integration-vite-plugin-cloudflare-template": "0.0.0",
-    "integration-vite-rolldown-template": "0.0.0",
-    "create-react-router": "7.9.3",
-    "react-router": "7.9.3",
-    "@react-router/architect": "7.9.3",
-    "@react-router/cloudflare": "7.9.3",
-    "@react-router/dev": "7.9.3",
-    "react-router-dom": "7.9.3",
-    "@react-router/express": "7.9.3",
-    "@react-router/fs-routes": "7.9.3",
-    "@react-router/node": "7.9.3",
-    "@react-router/remix-routes-option-adapter": "7.9.3",
-    "@react-router/serve": "7.9.3",
-    "@playground/framework": "0.0.0",
-    "@playground/framework-express": "0.0.0",
-    "@playground/framework-rolldown-vite": "0.0.0",
-    "@playground/framework-spa": "0.0.0",
-    "@playground/framework-vite-5": "0.0.0",
-    "@playground/framework-vite-7-beta": "0.0.0",
-    "@playground/rsc-parcel": "0.0.0",
-    "@playground/rsc-vite": "0.0.0",
-    "@playground/rsc-vite-framework": "0.0.0",
-    "@playground/split-route-modules": "0.0.0",
-    "@playground/split-route-modules-spa": "0.0.0",
-    "@playground/vite-plugin-cloudflare": "0.0.0"
-  },
-  "changesets": [
-    "breezy-planes-roll",
-    "green-pens-push",
-    "quick-eels-join",
-    "six-lobsters-think"
-  ]
-}
diff --git a/.changeset/quick-eels-join.md b/.changeset/quick-eels-join.md
deleted file mode 100644
index c9116d9304..0000000000
--- a/.changeset/quick-eels-join.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@react-router/node": patch
----
-
-Validate format of incoming session ids
diff --git a/.changeset/six-lobsters-think.md b/.changeset/six-lobsters-think.md
deleted file mode 100644
index 3db89c1017..0000000000
--- a/.changeset/six-lobsters-think.md
+++ /dev/null
@@ -1,104 +0,0 @@
----
-"@react-router/dev": patch
-"react-router": patch
----
-
-New (unstable) `useRoute` hook for accessing data from specific routes
-
-For example, let's say you have an `admin` route somewhere in your app and you want any child routes of `admin` to all have access to the `loaderData` and `actionData` from `admin.`
-
-```tsx
-// app/routes/admin.tsx
-import { Outlet } from "react-router";
-
-export const loader = () => ({ message: "Hello, loader!" });
-
-export const action = () => ({ count: 1 });
-
-export default function Component() {
-  return (
-    
-      {/* ... */}
-      
-      {/* ... */}
-    
-  );
-}
-```
-
-You might even want to create a reusable widget that all of the routes nested under `admin` could use:
-
-```tsx
-import { unstable_useRoute as useRoute } from "react-router";
-
-export function AdminWidget() {
-  // How to get `message` and `count` from `admin` route?
-}
-```
-
-In framework mode, `useRoute` knows all your app's routes and gives you TS errors when invalid route IDs are passed in:
-
-```tsx
-export function AdminWidget() {
-  const admin = useRoute("routes/dmin");
-  //                      ^^^^^^^^^^^
-}
-```
-
-`useRoute` returns `undefined` if the route is not part of the current page:
-
-```tsx
-export function AdminWidget() {
-  const admin = useRoute("routes/admin");
-  if (!admin) {
-    throw new Error(`AdminWidget used outside of "routes/admin"`);
-  }
-}
-```
-
-Note: the `root` route is the exception since it is guaranteed to be part of the current page.
-As a result, `useRoute` never returns `undefined` for `root`.
-
-`loaderData` and `actionData` are marked as optional since they could be accessed before the `action` is triggered or after the `loader` threw an error:
-
-```tsx
-export function AdminWidget() {
-  const admin = useRoute("routes/admin");
-  if (!admin) {
-    throw new Error(`AdminWidget used outside of "routes/admin"`);
-  }
-  const { loaderData, actionData } = admin;
-  console.log(loaderData);
-  //          ^? { message: string } | undefined
-  console.log(actionData);
-  //          ^? { count: number } | undefined
-}
-```
-
-If instead of a specific route, you wanted access to the _current_ route's `loaderData` and `actionData`, you can call `useRoute` without arguments:
-
-```tsx
-export function AdminWidget() {
-  const currentRoute = useRoute();
-  currentRoute.loaderData;
-  currentRoute.actionData;
-}
-```
-
-This usage is equivalent to calling `useLoaderData` and `useActionData`, but consolidates all route data access into one hook: `useRoute`.
-
-Note: when calling `useRoute()` (without a route ID), TS has no way to know which route is the current route.
-As a result, `loaderData` and `actionData` are typed as `unknown`.
-If you want more type-safety, you can either narrow the type yourself with something like `zod` or you can refactor your app to pass down typed props to your `AdminWidget`:
-
-```tsx
-export function AdminWidget({
-  message,
-  count,
-}: {
-  message: string;
-  count: number;
-}) {
-  /* ... */
-}
-```
diff --git a/integration/CHANGELOG.md b/integration/CHANGELOG.md
index 2cf67d87b7..6fccf850d7 100644
--- a/integration/CHANGELOG.md
+++ b/integration/CHANGELOG.md
@@ -5,6 +5,7 @@
 ### Minor Changes
 
 - Unstable Vite support for Node-based Remix apps ([#7590](https://github.com/remix-run/remix/pull/7590))
+
   - `remix build` 👉 `vite build && vite build --ssr`
   - `remix dev` 👉 `vite dev`
 
diff --git a/packages/create-react-router/CHANGELOG.md b/packages/create-react-router/CHANGELOG.md
index b568ce6a01..49f7ad6ac1 100644
--- a/packages/create-react-router/CHANGELOG.md
+++ b/packages/create-react-router/CHANGELOG.md
@@ -1,9 +1,13 @@
 # `create-react-router`
 
-## 7.9.4-pre.0
+## 7.9.4
+
+_No changes_
 
 ## 7.9.3
 
+_No changes_
+
 ## 7.9.2
 
 _No changes_
diff --git a/packages/create-react-router/package.json b/packages/create-react-router/package.json
index 12b2b43891..c51639a244 100644
--- a/packages/create-react-router/package.json
+++ b/packages/create-react-router/package.json
@@ -1,6 +1,6 @@
 {
   "name": "create-react-router",
-  "version": "7.9.4-pre.0",
+  "version": "7.9.4",
   "description": "Create a new React Router app",
   "homepage": "https://reactrouter.com",
   "bugs": {
diff --git a/packages/react-router-architect/CHANGELOG.md b/packages/react-router-architect/CHANGELOG.md
index 6b490f824c..8dd3f96677 100644
--- a/packages/react-router-architect/CHANGELOG.md
+++ b/packages/react-router-architect/CHANGELOG.md
@@ -1,12 +1,12 @@
 # `@react-router/architect`
 
-## 7.9.4-pre.0
+## 7.9.4
 
 ### Patch Changes
 
 - Updated dependencies:
-  - `react-router@7.9.4-pre.0`
-  - `@react-router/node@7.9.4-pre.0`
+  - `react-router@7.9.4`
+  - `@react-router/node@7.9.4`
 
 ## 7.9.3
 
@@ -39,6 +39,7 @@
 - Stabilize middleware and context APIs. ([#14215](https://github.com/remix-run/react-router/pull/14215))
 
   We have removed the `unstable_` prefix from the following APIs and they are now considered stable and ready for production use:
+
   - [`RouterContextProvider`](https://reactrouter.com/api/utils/RouterContextProvider)
   - [`createContext`](https://reactrouter.com/api/utils/createContext)
   - `createBrowserRouter` [`getContext`](https://reactrouter.com/api/data-routers/createBrowserRouter#optsgetcontext) option
@@ -262,6 +263,7 @@
 ### Major Changes
 
 - For Remix consumers migrating to React Router, the `crypto` global from the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) is now required when using cookie and session APIs. This means that the following APIs are provided from `react-router` rather than platform-specific packages: ([#11837](https://github.com/remix-run/react-router/pull/11837))
+
   - `createCookie`
   - `createCookieSessionStorage`
   - `createMemorySessionStorage`
@@ -270,6 +272,7 @@
   For consumers running older versions of Node, the `installGlobals` function from `@remix-run/node` has been updated to define `globalThis.crypto`, using [Node's `require('node:crypto').webcrypto` implementation.](https://nodejs.org/api/webcrypto.html)
 
   Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
+
   - `createCookieFactory`
   - `createSessionStorageFactory`
   - `createCookieSessionStorageFactory`
diff --git a/packages/react-router-architect/package.json b/packages/react-router-architect/package.json
index 9338237309..2e4c1ac8bf 100644
--- a/packages/react-router-architect/package.json
+++ b/packages/react-router-architect/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@react-router/architect",
-  "version": "7.9.4-pre.0",
+  "version": "7.9.4",
   "description": "Architect server request handler for React Router",
   "bugs": {
     "url": "https://github.com/remix-run/react-router/issues"
diff --git a/packages/react-router-cloudflare/CHANGELOG.md b/packages/react-router-cloudflare/CHANGELOG.md
index 514ce4ed59..46daa9383e 100644
--- a/packages/react-router-cloudflare/CHANGELOG.md
+++ b/packages/react-router-cloudflare/CHANGELOG.md
@@ -1,11 +1,11 @@
 # `@react-router/cloudflare`
 
-## 7.9.4-pre.0
+## 7.9.4
 
 ### Patch Changes
 
 - Updated dependencies:
-  - `react-router@7.9.4-pre.0`
+  - `react-router@7.9.4`
 
 ## 7.9.3
 
@@ -35,6 +35,7 @@
 - Stabilize middleware and context APIs. ([#14215](https://github.com/remix-run/react-router/pull/14215))
 
   We have removed the `unstable_` prefix from the following APIs and they are now considered stable and ready for production use:
+
   - [`RouterContextProvider`](https://reactrouter.com/api/utils/RouterContextProvider)
   - [`createContext`](https://reactrouter.com/api/utils/createContext)
   - `createBrowserRouter` [`getContext`](https://reactrouter.com/api/data-routers/createBrowserRouter#optsgetcontext) option
@@ -233,6 +234,7 @@
 
 - For Remix consumers migrating to React Router, all exports from `@remix-run/cloudflare-pages` are now provided for React Router consumers in the `@react-router/cloudflare` package. There is no longer a separate package for Cloudflare Pages. ([#11801](https://github.com/remix-run/react-router/pull/11801))
 - For Remix consumers migrating to React Router, the `crypto` global from the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) is now required when using cookie and session APIs. This means that the following APIs are provided from `react-router` rather than platform-specific packages: ([#11837](https://github.com/remix-run/react-router/pull/11837))
+
   - `createCookie`
   - `createCookieSessionStorage`
   - `createMemorySessionStorage`
@@ -241,6 +243,7 @@
   For consumers running older versions of Node, the `installGlobals` function from `@remix-run/node` has been updated to define `globalThis.crypto`, using [Node's `require('node:crypto').webcrypto` implementation.](https://nodejs.org/api/webcrypto.html)
 
   Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
+
   - `createCookieFactory`
   - `createSessionStorageFactory`
   - `createCookieSessionStorageFactory`
diff --git a/packages/react-router-cloudflare/package.json b/packages/react-router-cloudflare/package.json
index af600ec3fe..44275aa75e 100644
--- a/packages/react-router-cloudflare/package.json
+++ b/packages/react-router-cloudflare/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@react-router/cloudflare",
-  "version": "7.9.4-pre.0",
+  "version": "7.9.4",
   "description": "Cloudflare platform abstractions for React Router",
   "bugs": {
     "url": "https://github.com/remix-run/react-router/issues"
diff --git a/packages/react-router-dev/CHANGELOG.md b/packages/react-router-dev/CHANGELOG.md
index 9639e668e0..980bd3bab0 100644
--- a/packages/react-router-dev/CHANGELOG.md
+++ b/packages/react-router-dev/CHANGELOG.md
@@ -1,10 +1,11 @@
 # `@react-router/dev`
 
-## 7.9.4-pre.0
+## 7.9.4
 
 ### Patch Changes
 
 - Update `valibot` dependency to `^1.1.0` ([#14379](https://github.com/remix-run/react-router/pull/14379))
+
 - New (unstable) `useRoute` hook for accessing data from specific routes ([#14407](https://github.com/remix-run/react-router/pull/14407))
 
   For example, let's say you have an `admin` route somewhere in your app and you want any child routes of `admin` to all have access to the `loaderData` and `actionData` from `admin.`
@@ -106,9 +107,9 @@
   ```
 
 - Updated dependencies:
-  - `react-router@7.9.4-pre.0`
-  - `@react-router/node@7.9.4-pre.0`
-  - `@react-router/serve@7.9.4-pre.0`
+  - `react-router@7.9.4`
+  - `@react-router/node@7.9.4`
+  - `@react-router/serve@7.9.4`
 
 ## 7.9.3
 
@@ -155,6 +156,7 @@
 - Stabilize middleware and context APIs. ([#14215](https://github.com/remix-run/react-router/pull/14215))
 
   We have removed the `unstable_` prefix from the following APIs and they are now considered stable and ready for production use:
+
   - [`RouterContextProvider`](https://reactrouter.com/api/utils/RouterContextProvider)
   - [`createContext`](https://reactrouter.com/api/utils/createContext)
   - `createBrowserRouter` [`getContext`](https://reactrouter.com/api/data-routers/createBrowserRouter#optsgetcontext) option
@@ -897,6 +899,7 @@
   ```
 
   This initial implementation targets type inference for:
+
   - `Params` : Path parameters from your routing config in `routes.ts` including file-based routing
   - `LoaderData` : Loader data from `loader` and/or `clientLoader` within your route module
   - `ActionData` : Action data from `action` and/or `clientAction` within your route module
@@ -911,6 +914,7 @@
   ```
 
   Check out our docs for more:
+
   - [_Explanations > Type Safety_](https://reactrouter.com/dev/guides/explanation/type-safety)
   - [_How-To > Setting up type safety_](https://reactrouter.com/dev/guides/how-to/setting-up-type-safety)
 
@@ -1110,6 +1114,7 @@
 - Vite: Provide `Unstable_ServerBundlesFunction` and `Unstable_VitePluginConfig` types ([#8654](https://github.com/remix-run/remix/pull/8654))
 
 - Vite: add `--sourcemapClient` and `--sourcemapServer` flags to `remix vite:build` ([#8613](https://github.com/remix-run/remix/pull/8613))
+
   - `--sourcemapClient`
 
   - `--sourcemapClient=inline`
@@ -1446,6 +1451,7 @@
 - Add support for `clientLoader`/`clientAction`/`HydrateFallback` route exports ([RFC](https://github.com/remix-run/remix/discussions/7634)) ([#8173](https://github.com/remix-run/remix/pull/8173))
 
   Remix now supports loaders/actions that run on the client (in addition to, or instead of the loader/action that runs on the server). While we still recommend server loaders/actions for the majority of your data needs in a Remix app - these provide some levers you can pull for more advanced use-cases such as:
+
   - Leveraging a data source local to the browser (i.e., `localStorage`)
   - Managing a client-side cache of server data (like `IndexedDB`)
   - Bypassing the Remix server in a BFF setup and hitting your API directly from the browser
@@ -1849,6 +1855,7 @@
 - Output esbuild metafiles for bundle analysis ([#6772](https://github.com/remix-run/remix/pull/6772))
 
   Written to server build directory (`build/` by default):
+
   - `metafile.css.json`
   - `metafile.js.json` (browser JS)
   - `metafile.server.json` (server JS)
@@ -1946,6 +1953,7 @@
 - built-in tls support ([#6483](https://github.com/remix-run/remix/pull/6483))
 
   New options:
+
   - `--tls-key` / `tlsKey`: TLS key
   - `--tls-cert` / `tlsCert`: TLS Certificate
 
@@ -2216,6 +2224,7 @@
   ```
 
   The dev server will:
+
   - force `NODE_ENV=development` and warn you if it was previously set to something else
   - rebuild your app whenever your Remix app code changes
   - restart your app server whenever rebuilds succeed
diff --git a/packages/react-router-dev/package.json b/packages/react-router-dev/package.json
index 9d558e4d0c..2722b58c1a 100644
--- a/packages/react-router-dev/package.json
+++ b/packages/react-router-dev/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@react-router/dev",
-  "version": "7.9.4-pre.0",
+  "version": "7.9.4",
   "description": "Dev tools and CLI for React Router",
   "homepage": "https://reactrouter.com",
   "bugs": {
diff --git a/packages/react-router-dom/CHANGELOG.md b/packages/react-router-dom/CHANGELOG.md
index fb278e5db9..3eef443c6c 100644
--- a/packages/react-router-dom/CHANGELOG.md
+++ b/packages/react-router-dom/CHANGELOG.md
@@ -1,11 +1,11 @@
 # react-router-dom
 
-## 7.9.4-pre.0
+## 7.9.4
 
 ### Patch Changes
 
 - Updated dependencies:
-  - `react-router@7.9.4-pre.0`
+  - `react-router@7.9.4`
 
 ## 7.9.3
 
diff --git a/packages/react-router-dom/package.json b/packages/react-router-dom/package.json
index 07882a79b7..348dc4fb66 100644
--- a/packages/react-router-dom/package.json
+++ b/packages/react-router-dom/package.json
@@ -1,6 +1,6 @@
 {
   "name": "react-router-dom",
-  "version": "7.9.4-pre.0",
+  "version": "7.9.4",
   "description": "Declarative routing for React web applications",
   "keywords": [
     "react",
diff --git a/packages/react-router-express/CHANGELOG.md b/packages/react-router-express/CHANGELOG.md
index 2abc575995..069d309d11 100644
--- a/packages/react-router-express/CHANGELOG.md
+++ b/packages/react-router-express/CHANGELOG.md
@@ -1,12 +1,12 @@
 # `@react-router/express`
 
-## 7.9.4-pre.0
+## 7.9.4
 
 ### Patch Changes
 
 - Updated dependencies:
-  - `react-router@7.9.4-pre.0`
-  - `@react-router/node@7.9.4-pre.0`
+  - `react-router@7.9.4`
+  - `@react-router/node@7.9.4`
 
 ## 7.9.3
 
@@ -39,6 +39,7 @@
 - Stabilize middleware and context APIs. ([#14215](https://github.com/remix-run/react-router/pull/14215))
 
   We have removed the `unstable_` prefix from the following APIs and they are now considered stable and ready for production use:
+
   - [`RouterContextProvider`](https://reactrouter.com/api/utils/RouterContextProvider)
   - [`createContext`](https://reactrouter.com/api/utils/createContext)
   - `createBrowserRouter` [`getContext`](https://reactrouter.com/api/data-routers/createBrowserRouter#optsgetcontext) option
diff --git a/packages/react-router-express/package.json b/packages/react-router-express/package.json
index 69ccc57335..fd349d39ea 100644
--- a/packages/react-router-express/package.json
+++ b/packages/react-router-express/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@react-router/express",
-  "version": "7.9.4-pre.0",
+  "version": "7.9.4",
   "description": "Express server request handler for React Router",
   "bugs": {
     "url": "https://github.com/remix-run/react-router/issues"
diff --git a/packages/react-router-fs-routes/CHANGELOG.md b/packages/react-router-fs-routes/CHANGELOG.md
index 3bb3c8ae43..0b8d38e5bb 100644
--- a/packages/react-router-fs-routes/CHANGELOG.md
+++ b/packages/react-router-fs-routes/CHANGELOG.md
@@ -1,11 +1,11 @@
 # `@react-router/fs-routes`
 
-## 7.9.4-pre.0
+## 7.9.4
 
 ### Patch Changes
 
 - Updated dependencies:
-  - `@react-router/dev@7.9.4-pre.0`
+  - `@react-router/dev@7.9.4`
 
 ## 7.9.3
 
diff --git a/packages/react-router-fs-routes/package.json b/packages/react-router-fs-routes/package.json
index 1b8d3d223e..606c050dfe 100644
--- a/packages/react-router-fs-routes/package.json
+++ b/packages/react-router-fs-routes/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@react-router/fs-routes",
-  "version": "7.9.4-pre.0",
+  "version": "7.9.4",
   "description": "File system routing conventions for React Router, for use within routes.ts",
   "bugs": {
     "url": "https://github.com/remix-run/react-router/issues"
diff --git a/packages/react-router-node/CHANGELOG.md b/packages/react-router-node/CHANGELOG.md
index 5fe4f76bfa..60f8387a04 100644
--- a/packages/react-router-node/CHANGELOG.md
+++ b/packages/react-router-node/CHANGELOG.md
@@ -1,12 +1,12 @@
 # `@react-router/node`
 
-## 7.9.4-pre.0
+## 7.9.4
 
 ### Patch Changes
 
 - Validate format of incoming session ids ([#14426](https://github.com/remix-run/react-router/pull/14426))
 - Updated dependencies:
-  - `react-router@7.9.4-pre.0`
+  - `react-router@7.9.4`
 
 ## 7.9.3
 
@@ -36,6 +36,7 @@
 - Stabilize middleware and context APIs. ([#14215](https://github.com/remix-run/react-router/pull/14215))
 
   We have removed the `unstable_` prefix from the following APIs and they are now considered stable and ready for production use:
+
   - [`RouterContextProvider`](https://reactrouter.com/api/utils/RouterContextProvider)
   - [`createContext`](https://reactrouter.com/api/utils/createContext)
   - `createBrowserRouter` [`getContext`](https://reactrouter.com/api/data-routers/createBrowserRouter#optsgetcontext) option
@@ -235,6 +236,7 @@
 - Remove single fetch future flag. ([#11522](https://github.com/remix-run/react-router/pull/11522))
 
 - For Remix consumers migrating to React Router, the `crypto` global from the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) is now required when using cookie and session APIs. This means that the following APIs are provided from `react-router` rather than platform-specific packages: ([#11837](https://github.com/remix-run/react-router/pull/11837))
+
   - `createCookie`
   - `createCookieSessionStorage`
   - `createMemorySessionStorage`
@@ -243,6 +245,7 @@
   For consumers running older versions of Node, the `installGlobals` function from `@remix-run/node` has been updated to define `globalThis.crypto`, using [Node's `require('node:crypto').webcrypto` implementation.](https://nodejs.org/api/webcrypto.html)
 
   Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
+
   - `createCookieFactory`
   - `createSessionStorageFactory`
   - `createCookieSessionStorageFactory`
@@ -650,10 +653,12 @@
 - Introduces the `defer()` API from `@remix-run/router` with support for server-rendering and HTTP streaming. This utility allows you to defer values returned from `loader` functions by returning promises instead of resolved values. This has been refered to as _"sending a promise over the wire"_. ([#4920](https://github.com/remix-run/remix/pull/4920))
 
   Informational Resources:
+
   - 
   - 
 
   Documentation Resources (better docs specific to Remix are in the works):
+
   - 
   - 
   - 
diff --git a/packages/react-router-node/package.json b/packages/react-router-node/package.json
index 91ea0eeaef..d995c0702d 100644
--- a/packages/react-router-node/package.json
+++ b/packages/react-router-node/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@react-router/node",
-  "version": "7.9.4-pre.0",
+  "version": "7.9.4",
   "description": "Node.js platform abstractions for React Router",
   "bugs": {
     "url": "https://github.com/remix-run/react-router/issues"
diff --git a/packages/react-router-remix-routes-option-adapter/CHANGELOG.md b/packages/react-router-remix-routes-option-adapter/CHANGELOG.md
index 63d3bfa64a..73ffdbf88e 100644
--- a/packages/react-router-remix-routes-option-adapter/CHANGELOG.md
+++ b/packages/react-router-remix-routes-option-adapter/CHANGELOG.md
@@ -1,11 +1,11 @@
 # `@react-router/remix-config-routes-adapter`
 
-## 7.9.4-pre.0
+## 7.9.4
 
 ### Patch Changes
 
 - Updated dependencies:
-  - `@react-router/dev@7.9.4-pre.0`
+  - `@react-router/dev@7.9.4`
 
 ## 7.9.3
 
diff --git a/packages/react-router-remix-routes-option-adapter/package.json b/packages/react-router-remix-routes-option-adapter/package.json
index 17994e4ec1..8ed145ee96 100644
--- a/packages/react-router-remix-routes-option-adapter/package.json
+++ b/packages/react-router-remix-routes-option-adapter/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@react-router/remix-routes-option-adapter",
-  "version": "7.9.4-pre.0",
+  "version": "7.9.4",
   "description": "Adapter for Remix's \"routes\" config option, for use within routes.ts",
   "bugs": {
     "url": "https://github.com/remix-run/react-router/issues"
diff --git a/packages/react-router-serve/CHANGELOG.md b/packages/react-router-serve/CHANGELOG.md
index 0ef42b1322..48015455bd 100644
--- a/packages/react-router-serve/CHANGELOG.md
+++ b/packages/react-router-serve/CHANGELOG.md
@@ -1,13 +1,13 @@
 # `@react-router/serve`
 
-## 7.9.4-pre.0
+## 7.9.4
 
 ### Patch Changes
 
 - Updated dependencies:
-  - `react-router@7.9.4-pre.0`
-  - `@react-router/node@7.9.4-pre.0`
-  - `@react-router/express@7.9.4-pre.0`
+  - `react-router@7.9.4`
+  - `@react-router/node@7.9.4`
+  - `@react-router/express@7.9.4`
 
 ## 7.9.3
 
@@ -654,10 +654,12 @@
 - Introduces the `defer()` API from `@remix-run/router` with support for server-rendering and HTTP streaming. This utility allows you to defer values returned from `loader` functions by returning promises instead of resolved values. This has been refered to as _"sending a promise over the wire"_. ([#4920](https://github.com/remix-run/remix/pull/4920))
 
   Informational Resources:
+
   - 
   - 
 
   Documentation Resources (better docs specific to Remix are in the works):
+
   - 
   - 
   - 
diff --git a/packages/react-router-serve/package.json b/packages/react-router-serve/package.json
index 121fea9074..4b0ba29102 100644
--- a/packages/react-router-serve/package.json
+++ b/packages/react-router-serve/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@react-router/serve",
-  "version": "7.9.4-pre.0",
+  "version": "7.9.4",
   "description": "Production application server for React Router",
   "bugs": {
     "url": "https://github.com/remix-run/react-router/issues"
diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md
index 5d713cc6fe..6ef3ba52ad 100644
--- a/packages/react-router/CHANGELOG.md
+++ b/packages/react-router/CHANGELOG.md
@@ -1,6 +1,6 @@
 # `react-router`
 
-## 7.9.4-pre.0
+## 7.9.4
 
 ### Patch Changes
 
@@ -153,6 +153,7 @@
 - Stabilize middleware and context APIs. ([#14215](https://github.com/remix-run/react-router/pull/14215))
 
   We have removed the `unstable_` prefix from the following APIs and they are now considered stable and ready for production use:
+
   - [`RouterContextProvider`](https://reactrouter.com/api/utils/RouterContextProvider)
   - [`createContext`](https://reactrouter.com/api/utils/createContext)
   - `createBrowserRouter` [`getContext`](https://reactrouter.com/api/data-routers/createBrowserRouter#optsgetcontext) option
@@ -179,7 +180,7 @@
 
 - \[UNSTABLE] Add ``/`` prop for client side error reporting ([#14162](https://github.com/remix-run/react-router/pull/14162))
 
-- server action revalidation opt out via $SKIP_REVALIDATION field ([#14154](https://github.com/remix-run/react-router/pull/14154))
+- server action revalidation opt out via $SKIP\_REVALIDATION field ([#14154](https://github.com/remix-run/react-router/pull/14154))
 
 - Properly escape interpolated param values in `generatePath()` ([#13530](https://github.com/remix-run/react-router/pull/13530))
 
@@ -228,6 +229,7 @@
 - Remove dependency on `@types/node` in TypeScript declaration files ([#14059](https://github.com/remix-run/react-router/pull/14059))
 
 - Fix types for `UIMatch` to reflect that the `loaderData`/`data` properties may be `undefined` ([#12206](https://github.com/remix-run/react-router/pull/12206))
+
   - When an `ErrorBoundary` is being rendered, not all active matches will have loader data available, since it may have been their `loader` that threw to trigger the boundary
   - The `UIMatch.data` type was not correctly handing this and would always reflect the presence of data, leading to the unexpected runtime errors when an `ErrorBoundary` was rendered
   - ⚠️ This may cause some type errors to show up in your code for unguarded `match.data` accesses - you should properly guard for `undefined` values in those scenarios.
@@ -261,6 +263,7 @@
 - \[UNSTABLE] When middleware is enabled, make the `context` parameter read-only (via `Readonly`) so that TypeScript will not allow you to write arbitrary fields to it in loaders, actions, or middleware. ([#14097](https://github.com/remix-run/react-router/pull/14097))
 
 - \[UNSTABLE] Rename and alter the signature/functionality of the `unstable_respond` API in `staticHandler.query`/`staticHandler.queryRoute` ([#14103](https://github.com/remix-run/react-router/pull/14103))
+
   - The API has been renamed to `unstable_generateMiddlewareResponse` for clarity
   - The main functional change is that instead of running the loaders/actions before calling `unstable_respond` and handing you the result, we now pass a `query`/`queryRoute` function as a parameter and you execute the loaders/actions inside your callback, giving you full access to pre-processing and error handling
   - The `query` version of the API now has a signature of `(query: (r: Request) => Promise) => Promise`
@@ -906,6 +909,7 @@
   ```
 
   Similar to server-side requests, a fresh `context` will be created per navigation (or `fetcher` call). If you have initial data you'd like to populate in the context for every request, you can provide an `unstable_getContext` function at the root of your app:
+
   - Library mode - `createBrowserRouter(routes, { unstable_getContext })`
   - Framework mode - ``
 
@@ -1093,6 +1097,7 @@ _No changes_
 - Remove `future.v7_normalizeFormMethod` future flag ([#11697](https://github.com/remix-run/react-router/pull/11697))
 
 - For Remix consumers migrating to React Router, the `crypto` global from the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) is now required when using cookie and session APIs. This means that the following APIs are provided from `react-router` rather than platform-specific packages: ([#11837](https://github.com/remix-run/react-router/pull/11837))
+
   - `createCookie`
   - `createCookieSessionStorage`
   - `createMemorySessionStorage`
@@ -1101,6 +1106,7 @@ _No changes_
   For consumers running older versions of Node, the `installGlobals` function from `@remix-run/node` has been updated to define `globalThis.crypto`, using [Node's `require('node:crypto').webcrypto` implementation.](https://nodejs.org/api/webcrypto.html)
 
   Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
+
   - `createCookieFactory`
   - `createSessionStorageFactory`
   - `createCookieSessionStorageFactory`
@@ -1256,6 +1262,7 @@ _No changes_
   ```
 
   This initial implementation targets type inference for:
+
   - `Params` : Path parameters from your routing config in `routes.ts` including file-based routing
   - `LoaderData` : Loader data from `loader` and/or `clientLoader` within your route module
   - `ActionData` : Action data from `action` and/or `clientAction` within your route module
@@ -1270,6 +1277,7 @@ _No changes_
   ```
 
   Check out our docs for more:
+
   - [_Explanations > Type Safety_](https://reactrouter.com/dev/guides/explanation/type-safety)
   - [_How-To > Setting up type safety_](https://reactrouter.com/dev/guides/how-to/setting-up-type-safety)
 
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index 1f1ef9ac12..f89b50e9ba 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
 {
   "name": "react-router",
-  "version": "7.9.4-pre.0",
+  "version": "7.9.4",
   "description": "Declarative routing for React",
   "keywords": [
     "react",