{"record":{"id":"fc8410281ce2b6c5","repo":"remix-run/react-router","slug":"you-cannot-use-navigator-go-on-the-server-becaus","errorCode":null,"errorMessage":"You cannot use navigator.go() on the server because it is a stateless environment. This error was probably triggered when you did a `navigate(${delta})` somewhere in your app.","messagePattern":"You cannot use navigator\\.go\\(\\) on the server because it is a stateless environment\\. This error was probably triggered when you did a `navigate\\((.+?)\\)` somewhere in your app\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/react-router/lib/dom/server.tsx","lineNumber":312,"sourceCode":"    createHref,\n    encodeLocation,\n    push(to: To) {\n      throw new Error(\n        `You cannot use navigator.push() on the server because it is a stateless ` +\n          `environment. This error was probably triggered when you did a ` +\n          `\\`navigate(${JSON.stringify(to)})\\` somewhere in your app.`,\n      );\n    },\n    replace(to: To) {\n      throw new Error(\n        `You cannot use navigator.replace() on the server because it is a stateless ` +\n          `environment. This error was probably triggered when you did a ` +\n          `\\`navigate(${JSON.stringify(to)}, { replace: true })\\` somewhere ` +\n          `in your app.`,\n      );\n    },\n    go(delta: number) {\n      throw new Error(\n        `You cannot use navigator.go() on the server because it is a stateless ` +\n          `environment. This error was probably triggered when you did a ` +\n          `\\`navigate(${delta})\\` somewhere in your app.`,\n      );\n    },\n    back() {\n      throw new Error(\n        `You cannot use navigator.back() on the server because it is a stateless ` +\n          `environment.`,\n      );\n    },\n    forward() {\n      throw new Error(\n        `You cannot use navigator.forward() on the server because it is a stateless ` +\n          `environment.`,\n      );\n    },\n  };","sourceCodeStart":294,"sourceCodeEnd":330,"githubUrl":"https://github.com/remix-run/react-router/blob/7aea711dd1ae2bc5a076d13ff17291829690fa74/packages/react-router/lib/dom/server.tsx#L294-L330","documentation":"History jumps like navigate(-1) or navigate(2) map to navigator.go(delta), which throws on the SSR stateless navigator (lib/dom/server.tsx:283). A server render has no browser history stack to traverse, so any relative jump executed server-side is a bug.","triggerScenarios":"A back button implemented as <button onClick={...}> whose handler also runs during SSR render; navigate(-1) invoked in a component body or layout effect that executes on the server; shared components calling history-relative navigation on mount.","commonSituations":"'Go back' UI rendered on the server that eagerly navigates; mobile-style flows using delta navigation on first render; effects ported from client-only apps into SSR components.","solutions":["Trigger delta navigation only from real user events (onClick), never during render or mount","For logical back navigation, track an explicit route (from a query param or referrer) and use loader redirect instead","Guard with an isBrowser check if the same code path can run on the server"],"exampleFix":"// before (runs on server render)\nconst navigate = useNavigate()\nif (!search) navigate(-1)\n// after (event-only)\n<button onClick={() => navigate(-1)}>Go back</button>","handlingStrategy":"validation","validationCode":"const isServer = typeof window === 'undefined';\nfunction goBack(navigate: NavigateFunction) {\n  if (isServer) return; // never jump history during SSR\n  navigate(-1);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Trigger delta navigation only from real user events","Track explicit return paths (query param/referrer) instead of history deltas for SSR-visible flows","Audit shared components for mount-time history jumps"],"tags":["ssr","navigation","history","stateless-navigator"],"backgroundTag":"navigation-during-ssr","analyzedSha":"7aea711dd1ae2bc5a076d13ff17291829690fa74","analyzedAt":"2026-08-18T18:04:14.938Z","contentChangedAt":"2026-08-18T18:04:14.938Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}