Changelog

Next.js 16.3 and Cache Components

  • Improved
  • Fixed
A perfect Lighthouse performance score of 100 after the Cache Components migration

Every navigation in SyntaxKit now paints chrome instantly. The kit moved to Next.js 16.3, adopted Cache Components across the entire app, and dropped the full server round-trip that every dashboard navigation used to pay before anything appeared on screen.

One app, one root

The dashboard tree moved under the same [locale] root as marketing and auth, so the whole product shares a single root layout. That restored soft navigation between marketing, auth, and dashboard, which separate root layouts had been silently breaking.

Your URLs do not change. Canonical dashboard URLs stay unprefixed (/dashboard/*); the proxy rewrites them to the right locale from the cookie and redirects locale-prefixed dashboard URLs back to canonical. Locale resolution now uses next/root-params, with a cookie fallback for Server Actions and Route Handlers, and all the per-page setRequestLocale plumbing is gone.

Static shells, streamed data

With cacheComponents enabled, the dashboard and admin layouts became synchronous static shells. Request-time work, like the session gate, data prefetches, and the paywall check, streams in behind Suspense with the same semantics as before. Dashboard routes went from fully dynamic to partial prerender, and the overview, billing, organization settings, and admin pages were each split into a shell header plus a streamed body.

Prefetching got cheaper too: with partial prefetching, the sidebar's six destinations share one reusable App Shell fetch per destination instead of a full prefetch per link. Blog posts stream instead of blocking on the slug, and article cards regained hover prefetch. Crawlers are handled explicitly, so dead blog URLs still return real blocking 404s to Googlebot while browsers get the streamed not-found page.

Forms that survive navigation

Cache Components keeps navigated-away pages alive under React Activity instead of unmounting them, and that surfaced a class of real bugs: buttons stuck on "Saving…", billing portal redirects that never fired, and organization names that synced stale state. The fix is a new usePendingMutation hook that reads pending state from the live mutation cache instead of a detached observer, applied across settings, billing, admin dialogs, chat, and the contact form. Mirrored form drafts now preserve what you typed across navigation and only refresh from confirmed server state. An ESLint rule guards the pattern so regressions cannot creep back in.

For buyers extending the kit

If you add dashboard pages, they now live under the [locale] tree; the add-a-dashboard-page skill and the docs were updated to match. Standalone output is now conditional so Vercel and Docker builds both work, and next dev no longer scaffolds per-app agent rule files that shadow the repo root ones.