{"record":{"id":"4d1cf9681c7321a4","repo":"remix-run/react-router","slug":"the-future-v8-middleware-flag-has-been-removed-b","errorCode":null,"errorMessage":"The `future.v8_middleware` flag has been removed because middleware is now always enabled","messagePattern":"The `future\\.v8_middleware` flag has been removed because middleware is now always enabled","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/react-router-dev/config/config.ts","lineNumber":727,"sourceCode":"      \"v8_viteEnvironmentApi\" in futureConfig\n    ) {\n      return err(\n        \"The `future.v8_viteEnvironmentApi` flag has been removed because Vite Environment API usage is now always enabled\",\n      );\n    }\n    if (\n      \"unstable_passThroughRequests\" in futureConfig ||\n      \"v8_passThroughRequests\" in futureConfig\n    ) {\n      return err(\n        \"The `future.v8_passThroughRequests` flag has been removed because pass-through requests are now the default behavior\",\n      );\n    }\n    if (\n      \"unstable_middleware\" in futureConfig ||\n      \"v8_middleware\" in futureConfig\n    ) {\n      return err(\n        \"The `future.v8_middleware` flag has been removed because middleware is now always enabled\",\n      );\n    }\n    if (\n      \"unstable_trailingSlashAwareDataRequests\" in futureConfig ||\n      \"v8_trailingSlashAwareDataRequests\" in futureConfig\n    ) {\n      return err(\n        \"The `future.v8_trailingSlashAwareDataRequests` flag has been removed because trailing slash-aware data requests are now the default behavior\",\n      );\n    }\n    if (\"unstable_subResourceIntegrity\" in futureConfig) {\n      return err(\n        \"The `future.unstable_subResourceIntegrity` flag has been stabilized and moved to a top-level `config.subResourceIntegrity` field\",\n      );\n    }\n  }\n","sourceCodeStart":709,"sourceCodeEnd":745,"githubUrl":"https://github.com/remix-run/react-router/blob/6beaca39526d5716c3c112ebb0782765baa5a9ce/packages/react-router-dev/config/config.ts#L709-L745","documentation":"Fatal config-validation error: readConfig aborts when `future` contains `unstable_middleware` or `v8_middleware`. Middleware (`context`, `next` route middlewares) is always enabled in this version, so the opt-in flag was removed. Any occurrence of the key — even `v8_middleware: false` — is treated as a stale v7 config and fails fast, which also protects you from assuming middleware could be turned off.","triggerScenarios":"Running any command that loads the config (`react-router dev`/`build`/`typegen`) with `future.unstable_middleware` or `future.v8_middleware` present in react-router.config.ts or in merged preset/extends configs.","commonSituations":"v7 apps that enabled middleware early and are upgrading; teams that kept the flag at false to delay middleware and now must verify no code depends on it being off; copied configs from middleware tutorials.","solutions":["Delete the `v8_middleware` / `unstable_middleware` key from `future` — middleware is always on","If your app relied on `v8_middleware: false`, audit route modules: middleware-style exports now always run; remove or guard middleware files you don't want","Re-run typegen and tests to confirm nothing assumed middleware was disabled","Clean up the other removed v8_* flags in the same edit to avoid the sibling config errors"],"exampleFix":"// before - react-router.config.ts\nexport default {\n  future: { v8_middleware: true },\n} satisfies Config;\n\n// after\nexport default {} satisfies Config; // middleware is always enabled","handlingStrategy":"validation","validationCode":"import fs from \"node:fs\";\nlet cfg = fs.readFileSync(\"react-router.config.ts\", \"utf8\");\nif (/unstable_middleware|v8_middleware/.test(cfg)) {\n  throw new Error(\"Remove `future.v8_middleware` — middleware is always enabled now\");\n}","typeGuard":"function isCurrentFutureConfig(f: unknown): boolean {\n  return typeof f === \"object\" && f !== null &&\n    !(\"v8_middleware\" in f) && !(\"unstable_middleware\" in f);\n}","tryCatchPattern":"try {\n  let result = await readConfig(root);\n} catch (e) {\n  if (e instanceof Error && e.message.includes(\"v8_middleware\")) {\n    // remove the key; then verify no code depended on middleware being off\n  } else throw e;\n}","preventionTips":["When upgrading, assume every `future.*` opt-in flag from the previous major is gone or stabilized — check each one","Add a repo lint/grep step in CI for known-removed flag names","Write middleware tests before upgrading so always-on middleware behavior is verified immediately"],"tags":["config","future-flags","middleware","upgrade","build-error"],"backgroundTag":"removed-feature-flag","analyzedSha":"6beaca39526d5716c3c112ebb0782765baa5a9ce","analyzedAt":"2026-08-18T18:04:14.938Z","contentChangedAt":"2026-08-18T18:04:14.938Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}