What changed
Inertia.js v3.9.0, released October 13, 2026, changes `router.clearHistory()` and server-directed `Inertia::clearHistory()` to flush the prefetch cache alongside encrypted browser history. Previously, a user who logged out and pressed Back could receive a prefetched copy of a protected page until that entry expired. The fix also prevents in-flight prefetch requests from repopulating the cache after a flush. Other changes add `background: 'pause' | 'throttle' | 'continue'` to `usePoll()`/`router.poll()`, expose `navigate` event `type` values to distinguish history restores, and cancel stale `<InfiniteScroll>` callbacks that could merge old results after navigation.
Why it matters
Client-side navigation caches create a separate boundary from server authentication. Even when the server denies protected requests after logout, cached UI content may remain visible on the same browser until explicitly invalidated. For shared devices or sensitive applications, a logout flow should clear local history and prefetch state together. The v3.9 fix addresses that display/cache problem; it does not establish a server-side authorization bypass. Polling and navigation fixes prevent unnecessary background requests and stale data appearing under a new route.
Logout history clearing now also clears prefetch state
Upstream PR #3307 confirms clearing encrypted history alone was insufficient. A back-button visit could be served from prefetch cache and show a previously protected page after logout. Version 3.9 flushes that cache and prevents requests already in flight from caching their results. `router.flushAll()` receives the same protection. This is a local display/privacy concern, not evidence of server authorization bypass.
Polling becomes explicit in hidden tabs
The new `background` option accepts `throttle` (default, prior one-in-ten hidden-tab polling), `pause` (no polling until visible), or `continue` (full interval). `keepAlive` remains supported but deprecated in favour of `background: 'continue'`. A paused poll resumes on visibility without indiscriminately firing on every tab switch.
Navigation restores and infinite scroll receive correctness fixes
The `navigate` event identifies `initial`, `visit` and `history` navigation, allowing apps to refresh stale props after Back/Forward restores. In-flight `<InfiniteScroll>` requests are cancelled on unmount and late callbacks ignored; previously, responses from a prior filter/sort URL could merge into a new list. Another fix prevents an in-flight page update from replacing a just-restored history page.