remix-run/react-router · error

The `prerender.unstable_concurrency` config field has been s

Error message

The `prerender.unstable_concurrency` config field has been stabilized as `prerender.concurrency`

What it means

`prerender` is an object containing `unstable_concurrency`, which was stabilized and renamed to `prerender.concurrency`. The config layer detects the old key (this check runs before concurrency validation) and returns this migration error so you update the field name instead of the flag being silently ignored.

Source

Thrown at packages/react-router-dev/config/config.ts:566

  if (prerender) {
    let isValidPrerenderPathsConfig = (p: unknown) =>
      typeof p === "boolean" || typeof p === "function" || Array.isArray(p);

    let isValidPrerenderConfig =
      isValidPrerenderPathsConfig(prerender) ||
      (typeof prerender === "object" &&
        "paths" in prerender &&
        isValidPrerenderPathsConfig(prerender.paths));

    if (!isValidPrerenderConfig) {
      return err(
        "The `prerender`/`prerender.paths` config must be a boolean, an array " +
          "of string paths, or a function returning a boolean or array of string paths.",
      );
    }

    if (typeof prerender === "object" && "unstable_concurrency" in prerender) {
      return err(
        "The `prerender.unstable_concurrency` config field has been stabilized as `prerender.concurrency`",
      );
    }

    let isValidConcurrencyConfig =
      typeof prerender != "object" ||
      !("concurrency" in prerender) ||
      (typeof prerender.concurrency === "number" &&
        Number.isInteger(prerender.concurrency) &&
        prerender.concurrency > 0);

    if (!isValidConcurrencyConfig) {
      return err(
        "The `prerender.concurrency` config must be a positive integer if specified.",
      );
    }
  }

View on GitHub (pinned to 6beaca3952)

Solutions

  1. Rename `unstable_concurrency` to `concurrency` inside the `prerender` object.
  2. Check the current docs/changelog for other renamed prerender options while upgrading.
  3. Optionally omit the field entirely if the default concurrency is acceptable.

Example fix

// before
export default { prerender: { unstable_concurrency: 4 } };

// after
export default { prerender: { concurrency: 4 } };
Defensive patterns

Strategy: validation

Validate before calling

const RENAMED: Array<[string, string]> = [["unstable_concurrency", "concurrency"]];
for (const [from, to] of RENAMED) {
  if (from in (prerenderConfig ?? {})) {
    throw new Error(`Rename prerender.${from} -> prerender.${to}`);
  }
}

Prevention

When it happens

Trigger: A config that sets `prerender: { unstable_concurrency: 4 }` (or the older `prerender: { unstable_concurrency: ... }` from docs/examples of a previous release) after upgrading to a version where the field stabilized as `concurrency`.

Common situations: Upgrading @react-router/dev and hitting the renamed field; following outdated documentation or old GitHub discussions; config files copied from projects pinned to an earlier version.

Related errors


AI-assisted analysis of remix-run/react-router@6beaca3952 (2026-08-18). Data as JSON: /api/errors/50dda9c777de6be5. Report an issue: GitHub.