Laravel News reported the Inertia.js 3.9.0 release on October 13, 2026. The version adds visibility controls to usePoll() and router.poll(). The new background option accepts throttle, pause, or continue. throttle keeps the previous behavior and runs a hidden-tab poll on every tenth interval. pause suspends polling until the tab becomes visible. continue maintains the regular interval.

polling.js
import { usePoll } from '@inertiajs/vue3'

usePoll(5000, {}, { background: 'pause' })

A paused poll runs as soon as the tab becomes visible if its scheduled request was missed. When the next request is not due yet, Inertia waits for the remaining interval. This prevents rapid tab switching from triggering a request each time. The keepAlive option still works, but is deprecated in favor of background: 'continue'. Polls that begin while a tab is already hidden now follow the selected behavior.

The navigate event detail now includes type. It is initial on the first load, including a reload, visit for a normal Inertia visit, and history when the browser restores a page through back or forward navigation. A full-page restore from history also reports history when the previous page came from outside Inertia. Applications can use that value to reload specific props, such as messages, because restored props may be stale.

router.clearHistory() and Inertia::clearHistory() now remove the prefetch cache together with encrypted history entries. Previously, a user who logged out and pressed the back button could receive a protected page from that cache until its entry expired. A request still in flight during the flush is not cached when it finishes. router.flushAll() follows the same rule.

History restores now cancel page updates that are still resolving. This prevents a deferred prop, poll, or partial reload response from replacing the restored page after a back-button action. Mohammed Sohail fixed this case, following the v3.8 fix for back and forward navigation across a deployment. Gianpiero Puleo also fixed useRemember restoring state from an earlier page on a new visit. A remembered value from the first decrypted history entry could reappear in a missing field, such as a cleared tab selection.

InfiniteScroll now cancels its active request when the component unmounts. It also ignores callbacks from responses that arrived during the transition. This prevents errors on the new page and stops an old response from being merged into a list after navigation to the same URL with a different query string, such as a new sort order or filter.

The complete v3.9.0 notes include queue tasks added while the queue settles in #3276 by Gianpiero Puleo. Mohammed Sohail, published as @thecrazybob, supplied the history-restore fix in #3274. Pascal Baljet added the navigate type in #3291, flushed the prefetch cache in #3307, handled InfiniteScroll requests in #3308, fixed a Svelte <Form> error when a focused field unmounts in #3309, and updated dependencies in #3310. The background polling option is tracked in #3292.

Other changes handle QuotaExceededError in history.replaceState through #3280 by @danielperez9430 and preserve sourcemaps in Vite entry transforms through #3257 by @fouteox. Gianpiero Puleo fixed the useRemember regression in #3302. Pascal Baljet also fixed an InfiniteScroll error after immediate unmounting following an item change in #3312.