{"kind":"crawlcheck-platform-fix","v":1,"platform":"nextjs","platform_name":"Next.js","code":null,"groups":[{"group":"robots","title":"Edit robots.txt","codes":["ROBOTS_RULES_SHADOWED","ROBOTS_NO_SITEMAP","ROBOTS_NOT_200","ROBOTS_IS_HTML","ROBOTS_IS_CATCHALL","ROBOTS_DISALLOW_ALL","ROBOTS_CTYPE","ROBOTS_BLOCKED","RENDER_RESOURCE_BLOCKED","INSTRUCTION_CONFLICT","DECLARED_SITEMAP_REFUSED","DECLARED_SITEMAP_BROKEN","SITEMAP_BLOCKED","AI_OPTOUT_SET","BOT_BLOCKED_NOT_CITED","BOT_RULES_SHADOWED_NOT_CITED"],"steps":["App Router: add app/robots.ts that returns a MetadataRoute.Robots object (rules per userAgent, sitemap URL). Pages Router or static export: put robots.txt in public/.","Ship one of the two, not both: the route handler and a public/robots.txt collide."],"page":"https://crawlcheck.io/fix/nextjs#robots"},{"group":"sitemap","title":"Publish a sitemap","codes":["NO_SITEMAP_FOUND","SITEMAP_NO_LASTMOD","SITEMAP_IS_HTML","SITEMAP_DECLARES_NOTHING","SITEMAP_UNREADABLE","SITEMAP_ORIGIN_ERROR","ROBOTS_NO_SITEMAP","DECLARED_SITEMAP_BROKEN","DECLARED_SITEMAP_REFUSED"],"steps":["App Router: app/sitemap.ts returning MetadataRoute.Sitemap, one entry per URL with lastModified set to the content's real change date.","Reference it from app/robots.ts (sitemap field) so crawlers find it."],"page":"https://crawlcheck.io/fix/nextjs#sitemap"},{"group":"llms","title":"Publish llms.txt","codes":["NO_LLMS_TXT","NO_LLMS_TXT_NOT_CITED"],"steps":["Put llms.txt in public/ for a static file, or add app/llms.txt/route.ts that returns it with content-type text/plain."],"page":"https://crawlcheck.io/fix/nextjs#llms"},{"group":"hsts","title":"Send HSTS","codes":["HSTS_MISSING","HSTS_PRELOAD_INELIGIBLE","HSTS_PRELOAD_REMOVED"],"steps":["next.config.js headers(): source '/(.*)' with Strict-Transport-Security: max-age=63072000; includeSubDomains. Some hosts send it already; check the live response before adding a second copy."],"page":"https://crawlcheck.io/fix/nextjs#hsts"},{"group":"bots","title":"Let crawlers through","codes":["CHALLENGE_SERVED_200","CHALLENGE_PINNED_AT_EDGE","ANSWER_ENGINE_REFUSED","UNIFORM_REFUSAL","HOMEPAGE_REFUSED","HOMEPAGE_IS_INTERSTITIAL","ORIGIN_REFUSED_SCANNER","CRAWLER_SERVED_LESS","CRAWLER_REDIRECTED_AWAY","BOT_BLOCKED_NOT_CITED"],"steps":["Check middleware.ts for user-agent checks, and your host's firewall: on Vercel, Firewall → Bot protection and Attack Challenge Mode challenge crawlers."],"page":"https://crawlcheck.io/fix/nextjs#bots"},{"group":"render","title":"Serve the text, not just code","codes":["PAGE_IS_MOSTLY_CODE","CONTENT_NEEDS_JAVASCRIPT"],"steps":["Render content on the server: keep it in Server Components (the App Router default) or use getStaticProps / getServerSideProps; avoid \"use client\" at the page root and content fetched only in useEffect.","Check View Source, not the browser inspector: the text must be in the HTML the server sends."],"page":"https://crawlcheck.io/fix/nextjs#render"},{"group":"schema","title":"Fix the structured data","codes":["ENTITY_COLLISION","ENTITY_NO_COORDINATES","GEO_COUNTRY_MISMATCH","NAP_NAME_DRIFT","NAP_UNDECLARED_LISTING"],"steps":["Render one <script type=\"application/ld+json\"> per entity in the layout or page (JSON.stringify of the object), with a stable @id."],"page":"https://crawlcheck.io/fix/nextjs#schema"},{"group":"cache","title":"Clear stale copies","codes":["STALE_CACHE_SERVED","MACHINE_FILE_CACHE_STALE","MACHINE_FILE_CACHE_SPLIT"],"steps":["Revalidate (revalidatePath / revalidateTag or a shorter revalidate time) and redeploy; on a CDN, purge the paths that changed."],"page":"https://crawlcheck.io/fix/nextjs#cache"}],"rules":"https://crawlcheck.io/rules","reading":"Where to make each fix on Next.js. The general fix for each finding is in its report and at /rules/<CODE>; these steps say where that change is made on this platform, and say so when the platform cannot do it."}