Skip to content

Release v8.3.0 - #15294

Merged
brophdawg11 merged 1 commit into
mainfrom
release-v8-pr
Jul 22, 2026
Merged

Release v8.3.0#15294
brophdawg11 merged 1 commit into
mainfrom
release-v8-pr

Conversation

@ryanflorence

@ryanflorence ryanflorence commented Jul 9, 2026

Copy link
Copy Markdown
Member

This PR is managed by the release workflow. Do not edit it manually.

Releases

Package Version
react-router 8.2.08.3.0
@react-router/architect 8.2.08.3.0
@react-router/cloudflare 8.2.08.3.0
@react-router/dev 8.2.08.3.0
@react-router/express 8.2.08.3.0
@react-router/fs-routes 8.2.08.3.0
@react-router/node 8.2.08.3.0
@react-router/remix-routes-option-adapter 8.2.08.3.0
@react-router/serve 8.2.08.3.0
create-react-router 8.2.08.3.0

Changelogs

react-router v8.3.0

Patch Changes

  • Encode path params in href/generatePath per RFC 3986 path-segment rules instead of encodeURIComponent (#15310)
    • Characters that are valid literally in a path segment ($ & + , ; = : @ — RFC 3986 pchar) are no longer percent-encoded, so values like a semver build 1.0.0+1 interpolate unchanged instead of becoming 1.0.0%2B1
    • Structural/unsafe characters (/ ? # %, whitespace, non-ASCII) are still escaped exactly as before
  • Use crypto.randomUUID() for createMemorySessionStorage session ids (#15302)
    • createMemorySessionStorage is only intended for local development and testing - sessions are lost when the server restarts
  • Fix NavLink not applying its pending state when to has a trailing slash (#15300)
  • Preserve RSC route component metadata so routes with a clientLoader can skip unnecessary server requests once their components have rendered while still fetching missing server-rendered elements (#15323)
  • Harden RSC CSRF code paths (#15311)
  • Fix server crash (TypeError: Invalid state: Unable to enqueue) when a request is aborted while the RSC HTML stream has a pending flush (#15286)
    • Handle cancellation of the injectRSCPayload readable side, clear the pending flush, and cancel the underlying RSC payload stream

Unstable Changes

⚠️ Unstable features are not recommended for production use

  • Detect stale RSC clients during lazy route discovery and reload the destination document (#15318)

    Migration

    Apps using the default RSC Framework entry do not need to make any changes. Apps with a custom entry.rsc.tsx should import the generated client version and pass it to unstable_matchRSCServerRequest:

    import clientVersion from "virtual:react-router/unstable_rsc/client-version";
    
    return unstable_matchRSCServerRequest({
      // ...
      clientVersion,
    });
  • Add CSP nonce support to RSC document rendering (#15320)

    • Add nonce options to unstable_routeRSCServerRequest and unstable_RSCStaticRouter
    • Forward the nonce to the HTML renderer and apply it to injected RSC payload scripts and nonce-aware framework components

    To adopt nonce-based CSP, update your entry.ssr.tsx (run react-router reveal entry.ssr first in RSC Framework Mode) to generate a fresh nonce for each request. Pass it to routeRSCServerRequest, spread the renderHTML options into React's HTML renderer, pass options.nonce to RSCStaticRouter, and use the same nonce in the Content-Security-Policy response header:

    const nonce = crypto.randomUUID();
    const response = await routeRSCServerRequest({
      request,
      serverResponse,
      createFromReadableStream,
      nonce,
      async renderHTML(getPayload, options) {
        const payload = getPayload();
        return renderHTMLToReadableStream(
          <RSCStaticRouter getPayload={getPayload} nonce={options.nonce} />,
          {
            ...options,
            bootstrapScriptContent,
            formState: await payload.formState,
            signal: request.signal,
          },
        );
      },
    });
    response.headers.set(
      "Content-Security-Policy",
      `script-src 'self' 'nonce-${nonce}'`,
    );

@react-router/architect v8.3.0

Patch Changes

@react-router/cloudflare v8.3.0

Patch Changes

@react-router/dev v8.3.0

Minor Changes

  • Restart react-router dev with --conditions=development when not already configured (#15291)

Patch Changes

  • Allow typescript@7 to be used (#15317)

Unstable Changes

⚠️ Unstable features are not recommended for production use

  • Add unstable_rsc/client-version client build version virtual module (#15318)

  • Support the subResourceIntegrity config option in RSC Framework Mode (#15321)

    Migration guide

    No changes are required when using the default RSC SSR entry. If you maintain a custom app/entry.ssr.tsx, import the new virtual module and pass its hashes to React's importMap render option:

    +import subResourceIntegrity from "virtual:react-router/unstable_rsc/subresource-integrity";
    
    return renderToReadableStream(<RSCStaticRouter getPayload={getPayload} />, {
      ...options,
      bootstrapScriptContent,
      formState,
    + importMap: subResourceIntegrity
    +   ? { integrity: subResourceIntegrity }
    +   : undefined,
      signal: request.signal,
    });
  • Updated dependencies:

@react-router/express v8.3.0

Patch Changes

@react-router/fs-routes v8.3.0

Patch Changes

@react-router/node v8.3.0

Patch Changes

@react-router/remix-routes-option-adapter v8.3.0

Patch Changes

@react-router/serve v8.3.0

Patch Changes

create-react-router v8.3.0

Patch Changes

  • No changes

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Preview Build Available

Preview builds have been created for this PR. You can install react-router using:

pnpm install "remix-run/react-router#preview/pr-15294&path:packages/react-router"

And/or install other packages via:

pnpm install "remix-run/react-router#preview/pr-15294&path:packages/react-router-dev"
pnpm install "remix-run/react-router#preview/pr-15294&path:packages/react-router-express"
pnpm install "remix-run/react-router#preview/pr-15294&path:packages/react-router-node"
pnpm install "remix-run/react-router#preview/pr-15294&path:packages/react-router-serve"

These preview builds will be updated automatically as you push new commits.

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

✅ CLA Signed

Thanks for signing the Contributor License Agreement.

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

⚠️ No Change File Found

This PR doesn't include a change file which is used for automated release notes.
If your change affects users, please add one (or more) change files and commit the generated file(s).

pnpm run changes:add

This script requires Node 24+. If you are on a lower version, please add a file manually

Not every PR needs a change file — you can skip this step if the change is internal-only
(tests, tooling, docs)

@ryanflorence
ryanflorence force-pushed the release-v8-pr branch 6 times, most recently from e45f2d0 to 3b9110a Compare July 14, 2026 17:24
@ryanflorence ryanflorence changed the title Release v8.2.1 Release v8.3.0 Jul 16, 2026
@ryanflorence
ryanflorence force-pushed the release-v8-pr branch 4 times, most recently from e8a8403 to f8463e5 Compare July 22, 2026 14:10
@brophdawg11
brophdawg11 merged commit 2edaca7 into main Jul 22, 2026
12 checks passed
@brophdawg11
brophdawg11 deleted the release-v8-pr branch July 22, 2026 15:03
@github-actions

Copy link
Copy Markdown
Contributor

The preview branch preview/pr-15294 has been deleted now that this PR is merged/closed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants