Skip to main content
Soundcheck web is on Next.js 16.3.0 with React 19.2.x. The core version bump landed on this branch; this page tracks what is done and what remains.

Current status

Completed on this branch

  • Bump next@16.3.0, React 19, and matching @types/react*
  • Remove invalid eslint key from web/next.config.mjs (next lint is gone; oxlint stays)
  • Remove unused peer blockers: next-cloudinary, react-accessible-accordion
  • Production build uses Turbopack (next build; Next 16 default)
  • Top-level turbopack config in web/next.config.mjs (was experimental.turbopack)
  • Removed leftover webpack() after Turbopack SVG/@ alias rules covered all imports

Residual checklist

  • Async Request APIs — no sync cookies() / headers() / draftMode() / server params / searchParams usages found in web/src at upgrade time
  • middleware.ts → proxy.ts — do not rename while Clerk still needs Edge; validate Node/proxy runtime before migrating (build warns that middleware is deprecated)
  • revalidateTag — no usages found in web/src
  • cacheComponents / Instant Navigations — enabled in web/next.config.mjs (ENG-577). Production next build is clean. Blockers were small: wrap service-console auth() in <Suspense fallback={null}> so the protected shell is not shown before platform-admin authorization, drop export const runtime (Cache Components rejects any runtime segment config), and Suspense-bound layouts that call usePathname / useSearchParams. The AuthenticatedProviders pathname gate uses fallback={children} so a postponed usePathname() keeps route content (or the route layout loading UI) in the PPR shell. The root layout uses a static background fallback so public /[slug] useParams() is not prerendered as that boundary’s fallback. Staff app paths share protectedAppRoutes.ts so /hotels, /assets, and the other single-segment staff pages do not look like public org slugs. /dev/components is a client page so Cache Components does not SSR useRef there. No instant = false opt-outs. Prefetch is production-only (next start / deployed).
  • SVG / webpack() in next.config.mjs — Turbopack resolveAlias + *.svg SVGR rules cover all imports; leftover webpack() removed
  • TypeScript — typescript is now real TS 7 for Next build + tsc; AST guard test imports @typescript/typescript6 for the compiler API
  • Verify — next build green on Turbopack with Cache Components + Partial Prefetch. Web CI Playwright e2e (Clerk-backed) remains the auth/nav gate. Optional human smoke: sign-in + org switch.

Version-by-version reference

You can jump straight to 16.3; intermediate minors are not required. Almost all breaking work is in 16.0.

16.0 — major (Oct 2025)

Official: blog, upgrade guide. Breaking / removals
  • React 19 required; Node ≥20.9; TypeScript ≥5.1
  • Sync Request APIs removed — must await cookies(), headers(), draftMode(), params, searchParams
  • Metadata image / sitemap generators: params / id are Promises
  • Turbopack is default for next dev and next build; custom webpack() fails the build unless you migrate config, pass --webpack, or keep Turbopack with next build --turbopack (ignores leftover webpack())
  • experimental.turbopack → top-level turbopack
  • experimental.ppr / experimental_ppr / dynamicIO removed → cacheComponents
  • next lint removed; AMP removed; runtime config APIs removed
  • Parallel route slots require explicit default.js
  • next/image default changes (minimumCacheTTL, qualities, imageSizes, local IP, max redirects, local query strings)
  • Scroll no longer overrides global scroll-behavior: smooth
Deprecations
  • middleware.ts → proxy.ts / export proxy (proxy is Node.js only; Edge needs deprecated middleware for now)
  • next/legacy/image, images.domains
  • Single-arg revalidateTag(tag) → revalidateTag(tag, profile) or updateTag() in Actions
Non-breaking
  • Cache Components, React Compiler (reactCompiler), updateTag() / refresh(), routing/prefetch rewrite

16.1 — minor (Dec 2025)

Blog. Additive: Turbopack FS cache for next dev (default on), bundle analyzer, next dev --inspect, transitive serverExternalPackages, next upgrade.

16.2 — minor (Mar 2026)

Blog. Additive: faster next dev / rendering, adapters stable, debugging UX, unstable_catchError / unstable_retry, prefetch experimentals. Security patches through 16.2.6 are included in 16.3.

16.3 — minor (Aug 2026)

Blog. Largest release since 16.0; no major breakages for apps already on 16. Default wins: lower Turbopack memory, build FS cache, native Node streams SSR, agent docs / AGENTS.md, catchError, import.meta.glob, next/root-params, TS7 for typecheck in build. Opt-in Instant Navigations: cacheComponents: true + partialPrefetching: true (future major default). Watch: HMR path /_next/webpack-hmr → /_next/hmr if reverse proxies pin the old path.

Remaining hot spots

Sources