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
- Rename `unstable_concurrency` to `concurrency` inside the `prerender` object.
- Check the current docs/changelog for other renamed prerender options while upgrading.
- 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
- After upgrading @react-router/dev, grep the config for `unstable_` keys — stabilized fields get renamed.
- Read the release notes / changesets for config renames before pinning a new version.
- Prefer omitting tuning flags unless you need them; defaults usually suffice.
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
- The `future.v8_splitRouteModules` flag has been moved to a t
- The `prerender`/`prerender.paths` config must be a boolean,
- The `prerender.concurrency` config must be a positive intege
- React Router presets must have a `name` property defined.
- onChange is not supported when watch mode is disabled
AI-assisted analysis of remix-run/react-router@6beaca3952 (2026-08-18).
Data as JSON: /api/errors/50dda9c777de6be5.
Report an issue: GitHub.