Instant navigation
export const instant asks Next.js to verify that navigating into a segment paints immediately. It changes no rendering behaviour. It only reports the code that would make a navigation wait.
Validation runs in development and reports to the error overlay. The only level currently available is 'warning', so a violation never fails a build.
What to check
In dev. Run pnpm dev and open the blocking tab. The error overlay raises an insight naming the component that is not in the App Shell. The clean and deferred tabs raise nothing.
In a build. Run pnpm build && pnpm start and click between the tabs. Watch the dot next to the nav links. useLinkStatus drives it, so any dot at all means that navigation had to wait.
Navigation Inspector. In dev, open the Navigation Inspector in Next.js DevTools and enable Pause on navigations. Clicking a link then freezes the page at the prefetched UI, which is what instant validates. Turn it off when you are done. It sets a cookie scoped to the domain, not the port, so it affects other projects on localhost.
Prefetching is build-only. Next.js does not prefetch in dev, so navigations never feel as instant there as they will under next start. Validation still reflects the production behaviour.
The four tabs
/instant/clean
validates cleanuse cache scope on the probe-shell profile (stale 10m). A stale time of 5 minutes or more makes the content App-Shell eligible, so a prefetch already contains it and the navigation has nothing to wait for./instant/deferred
validates clean<Suspense> boundary. The fallback is in the shell, so the navigation paints immediately and the content streams in after. This is the fix the insight on the blocking tab suggests./instant/blocking
raises an insight in devuse cache scope on the probe-no-shell profile (stale 60s) with no boundary above it. A stale time under 5 minutes is prerendered but excluded from the App Shell. It is not in the prefetch, so the navigation waits on the server. The code is valid and prerenders, and the navigation is still not instant. That gap is what this config finds./instant/opted-out
not validatedexport const instant = false. Declares that this segment may block and opts it out of validation, including the static shell check. Useful during a migration. Place it as low in the tree as possible, because for the static shell check a false higher up overrides any deeper true.Why stale time decides this
The blocking and clean tabs differ in one number. probe-shell has a 10 minute stale time; probe-no-shell has 60 seconds. Anything under 5 minutes is kept out of the App Shell, because the client prefetches the shell and reuses it for longer than that content stays fresh.
So a navigation is instant when its content is either in the App Shell or behind a Suspense boundary. See /cache-life for the full set of thresholds.