{"record":{"id":"6cc9279b7ef92db4","repo":"vercel/next.js","slug":"experimental-ppr-has-been-merged-into-cachecomp","errorCode":null,"errorMessage":"`experimental.ppr` has been merged into `cacheComponents`. The Partial Prerendering feature is still available, but is now enabled via `cacheComponents`. Please update your ${configFileName} accordingly.","messagePattern":"`experimental\\.ppr` has been merged into `cacheComponents`\\. The Partial Prerendering feature is still available, but is now enabled via `cacheComponents`\\. Please update your (.+?) accordingly\\.","errorType":"validation","errorClass":"HardDeprecatedConfigError","httpStatus":null,"severity":"error","filePath":"packages/next/src/server/config.ts","lineNumber":575,"sourceCode":"          `Please add \\`reactCompiler: true\\` in ${configFileName}.`\n      )\n    }\n  }\n\n  if (result.experimental.cachedNavigations && !result.cacheComponents) {\n    throw new Error(\n      `\\`experimental.cachedNavigations\\` requires \\`cacheComponents\\` to be enabled. Please update your ${configFileName} accordingly.`\n    )\n  }\n\n  if (result.partialPrefetching && !result.cacheComponents) {\n    throw new Error(\n      `\\`partialPrefetching\\` requires \\`cacheComponents\\` to be enabled. Please update your ${configFileName} accordingly.`\n    )\n  }\n\n  if (result.experimental.ppr) {\n    throw new HardDeprecatedConfigError(\n      `\\`experimental.ppr\\` has been merged into \\`cacheComponents\\`. The Partial Prerendering feature is still available, but is now enabled via \\`cacheComponents\\`. Please update your ${configFileName} accordingly.`\n    )\n  }\n\n  if (result.output === 'export') {\n    if (result.i18n) {\n      throw new Error(\n        'Specified \"i18n\" cannot be used with \"output: export\". See more info here: https://nextjs.org/docs/messages/export-no-i18n'\n      )\n    }\n\n    if (!hasNextSupport) {\n      if (result.rewrites) {\n        Log.warn(\n          'Specified \"rewrites\" will not automatically work with \"output: export\". See more info here: https://nextjs.org/docs/messages/export-no-custom-routes'\n        )\n      }\n      if (result.redirects) {","sourceCodeStart":557,"sourceCodeEnd":593,"githubUrl":"https://github.com/vercel/next.js/blob/0ae8c72462952df163f1b1e0726641bc5b40dc93/packages/next/src/server/config.ts#L557-L593","documentation":"The `experimental.ppr` flag (Partial Prerendering) has been hard-deprecated and merged into `cacheComponents`. Normalization throws a `HardDeprecatedConfigError` (not a plain Error) if `experimental.ppr` is truthy, telling you to use `cacheComponents` instead. The PPR behavior itself is still available via cacheComponents.","triggerScenarios":"Setting `experimental: { ppr: true }` (or any truthy value) in next.config. Thrown during the cacheComponents/guard block in loadConfig.","commonSituations":"Upgrading from an older Next.js where experimental.ppr was the toggle. Following outdated tutorials or copy-pasting an old experimental block.","solutions":["Remove `experimental.ppr` and set `cacheComponents: true` at the top level to keep PPR behavior","If PPR is not wanted, simply remove the ppr key"],"exampleFix":"// before\nmodule.exports = { experimental: { ppr: true } }\n// after\nmodule.exports = { cacheComponents: true }","handlingStrategy":"validation","validationCode":"if (config.experimental?.ppr) {\n  delete config.experimental.ppr\n  config.cacheComponents = true\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["After upgrading Next.js, grep config for experimental.ppr and migrate to cacheComponents","Treat HardDeprecatedConfigError as a hard stop, not a warning"],"tags":["config","deprecation","ppr","cache-components"],"analyzedSha":"0ae8c72462952df163f1b1e0726641bc5b40dc93","analyzedAt":"2026-08-06T19:44:29.143Z","schemaVersion":2},"datasetVersion":"2026-08-07T02:17:10.218Z"}