Every rule vetd checks.
TypeScript proves the types line up. These 92 rules catch what still breaks a Next.js app: server code leaking to the browser, Server Actions without an auth check, request waterfalls, pages with no metadata. They run on every check, in the same pass as the type check.
Open a rule for why it matters, the fix and who it builds on. Call explain with an id for the same text, or read rules.md for all of them. Rules that can't be certain report a warning, not an error.
Server and client boundaries9
next/server-hooksClient-only APIs in a Server Componenterrornext/non-serializable-propsNon-serializable props from a Server to a Client Componenterror / warningnext/server-only-in-clientServer-only module reachable from client codeerrornext/server-actionsServer Action shapeerror / warningnext/route-paramsparams / searchParams typeserrornext/unknown-routeLink/redirect to a route that does not existerror / warningnext/client-envNon-public env var in client codeerror / warningnext/async-client-componentAsync Client Componenterrornext/segment-configInvalid route segment configerror / warning
Next.js 16 upgrade6
next/parallel-route-defaultParallel route slot without default.tsxerrornext/middleware-to-proxymiddleware.ts in Next.js 16warningnext/no-ampAMP in Next.js 16errornext/revalidate-tag-profilerevalidateTag without a cacheLife profilewarningnext/sync-dynamic-apiSynchronous cookies()/headers()/draftMode()next/no-head-in-appnext/head in the App Routerwarning
Server code: security and speed4
React client code3
SEO, accessibility and security5
Interface craft: accessibility, motion and mobile17
ui/viewport-zoom-lockViewport blocks zoomerrorui/input-font-sizeInput text under 16px on mobilewarningui/video-autoplayAutoplay video missing muted/playsInlinewarningui/click-on-non-interactiveClick handler on a non-interactive elementwarningui/outline-noneFocus outline removed without replacementwarningui/transition-alltransition-allwarningui/press-scalePress scale below 0.95warningui/hover-font-weightFont weight changes on interactionwarningui/theme-switch-transitionsTheme switch animates every colorwarningui/validate-lateForm validates on every keystrokewarningui/input-typeText input for an email/phone/url/password fieldwarningui/animate-layoutAnimating layout propertieswarningui/will-changewill-change on a property it can't helpwarningui/user-select-pageText selection disabled for the pagewarningui/page-scrollbarPage scrollbar restyled or hiddenwarningui/reduced-motionKeyframes without a reduced-motion fallbackwarning
shadcn/ui and Radix composition4
Tailwind CSS5
tailwind/dynamic-classClass name built at runtimewarningtailwind/conflicting-classesConflicting utilities in one class listwarningtailwind/removed-in-v4Utility removed in Tailwind 4warningtailwind/hover-capabilityTailwind 3 hover styles stick on touchwarningtailwind/arbitrary-z-indexArbitrary z-indexwarning
Performance: fonts, images, scripts and bundle16
perf/font-linkWeb font loaded from a font CDNwarningperf/font-displayText invisible while the font loadswarningperf/font-format@font-face without woff2warningperf/font-subsetsnext/font/google without subsetserrorperf/font-module-scopenext/font loader not called at module scopeerrorperf/font-weightsToo many font weightswarningperf/font-duplicateSame font loaded in several moduleswarningperf/img-elementRaw <img> in a Next.js appwarningperf/image-sizeImage without dimensionserror / warningperf/image-sizesResponsive image without sizeswarningperf/image-prioritypriority / lazy loading conflictswarningperf/sync-scriptRender-blocking <script>warningperf/script-strategyScript loading strategywarningperf/client-page"use client" on a page or layoutwarningperf/heavy-importHeavy library in the first-load bundlewarningperf/dynamic-ssr-falsenext/dynamic ssr: false in a Server Componenterror
Data fetching7
data/await-in-loopAwait inside a loopwarningdata/self-fetchServer code fetching its own API routewarningdata/client-fetch-waterfallDependent client-side fetcheswarningdata/no-loading-boundaryDynamic page without a loading boundarywarningdata/force-dynamic-layoutLayout forces dynamic renderingwarningdata/uncached-fetchConstant fetch uncached on a dynamic routewarningdata/serial-route-fetchSame query in generateMetadata and the pagewarning