BlogFindings

Next.js AI crawlers: 28 home pages sent 15 times more payload than prose

Lantad requested the home page of 392 hostnames on 12 September 2026, and the scanner's own platform detector found 28 of them built with Next.js. Across those 28 pages the React Server Component payload and the __NEXT_DATA__ blocks came to 3,897,015 characters. The visible prose came to 253,179, which is 2.2 percent of the characters that arrived.

18 min read Lantad

The camp that says the text is there is correct. Only four of the 28 pages held fewer than 50 words of visible prose, and the median page held 604 words, which is ordinary for a marketing home page and nothing like an empty shell. What neither camp mentions is the proportion. Those same 28 pages shipped 11,321,162 characters of HTML between them to deliver 253,179 characters of prose. After the markup itself, the largest single thing in those documents was the serialised React tree the browser uses to take over the page, at 3,897,015 characters, and an AI crawler that stops at the HTML parser has no use for it at all.

In short

  • Next.js AI crawlers receive far more framework payload than readable text: across 28 Next.js home pages measured on 12 September 2026, the React Server Component payload and __NEXT_DATA__ blocks held 3,897,015 characters against 253,179 characters of visible prose, a ratio of 15.4 to one.
  • Twenty five of the 28 were App Router pages, identified by a self.__next_f push call in the delivered HTML, and three were Pages Router pages carrying a __NEXT_DATA__ script. Twenty six of the 28 shipped more payload than prose, and 18 of the 28 shipped more than ten times as much.
  • The payload is substantially a second copy of text that is already in the markup. On the 25 pages that had both a payload and visible text blocks, 13 had at least half of their longest visible blocks also present inside the payload, and the median across those 25 was exactly half.
  • One of the 28 pages arrived at 2,827,930 bytes, past the 2MB cutoff that Google's Googlebot documentation, last updated 3 February 2026, states for a supported file type. The remaining 27 were under it, and the median page was 208,193 characters.
  • Lantad read HTML and robots.txt on one day from one network location. We observed no AI crawler requesting any of these sites, we read no access log, and no figure in this post reports what a crawler did.
  • Markup, attributes and inline styles 6426905 56.8 percent of the characters delivered
  • RSC payload and __NEXT_DATA__ bodies 3897015 34.4 percent. Not read as prose by an HTML parser
  • All other script bodies 744063 6.6 percent. Loaders, analytics, inline configuration
  • Visible prose 253179 2.2 percent. The part an answer engine can quote
Every character of HTML delivered by the 28 Next.js home pages on 12 September 2026, split into four exclusive groups that sum to 11,321,162. Prose is the text an HTML parser recovers with no JavaScript executed.

How many sites in a 392 host sample run Next.js?

The frame is the same one we have been working through platform by platform for the last week, and it is worth restating what it is and is not. It is a committed list of 392 hostnames grouped into ten strata by the kind of site they are, kept in the repository so that any figure published from it can be recomputed against the same list. It is not a random sample of the web. It over-represents hosted site builders and small software marketing sites, because that is what it was assembled to cover, so a proportion measured here describes this frame and not the internet.

We asked each hostname once for its home page over HTTPS, identifying ourselves as LantadBot, following redirects, with a twenty five second timeout. Three hundred and eighty three returned HTTP 200. Of the nine that did not, one returned 404, two returned 403, one returned 503, and five returned HTTP 202. Four of those five, rechecked the same day, answered with a 169 byte captcha challenge rather than a page, which is the same bot defence we looked at from another angle when five of 391 home pages sent an X-Robots-Tag and all five were a captcha.

Platform detection ran over the raw bytes of the 383 that answered, using the ordered signal list the product ships rather than anything written for this post. Next.js is tested first in that list, so a page carrying both a Next.js signal and, say, a WordPress one is counted as Next.js. Twenty eight matched: 7.3 percent of the pages that answered. That places it sixth by count, behind Webflow and WordPress at 65 each, Squarespace at 40, and Framer and Shopify at 35 each. Two of the 28 turned out to be the same site published on two domains, returning documents of 205,752 bytes that hash to the same MD5 digest, which is worth naming because it means the 28 pages cover 27 distinct sites.

The 28 do not sit where a reader might guess. Eight came from the software marketing stratum and seven from the startup stratum, which is expected. Six came from the stratum assembled for Framer sites and four from the stratum assembled for no-code tools, which is not: those are sites that have moved off a builder, or never were on one, and still sit in a list that says otherwise. That is a limitation of a fixed frame rather than a finding about Next.js, and it is why the stratum labels do not appear in any figure below. Every count in this post is over the 28 pages that carried the signal, not over a stratum.

How the 28 measured pages were selected from the 392 host platform frame on 12 September 2026. Every step ran over bytes as delivered, with no JavaScript executed.

What do Next.js AI crawlers receive from an App Router page?

We took each of the 28 documents exactly as delivered and split every character into four groups that cannot overlap. Script element bodies came out first, since an HTML parser never reads them as text. Within those, we measured separately the characters sitting inside self.__next_f.push calls and inside a script with the id __NEXT_DATA__, which are the two shapes Next.js uses to hand the serialised tree to the browser. Visible prose came from the scanner's own extractor, the same one that produces the text a report is graded on, which drops script, style, noscript, template, svg and iframe content before counting. Everything left over is markup: tags, attribute values, inline style rules, inline SVG path data.

The four groups sum to 11,321,162, which is every character delivered. Markup is the largest at 6,426,905, and nobody should be surprised by that: attributes and inline styles are how a modern page is built. The payload is second at 3,897,015, made up of 3,805,887 characters of App Router flight data and 91,128 characters of __NEXT_DATA__. All other script bodies together came to 744,063, which is less than a fifth of the payload. Prose is last at 253,179 characters, or 2.2 percent.

Per site the picture is consistent rather than driven by outliers. Twenty six of the 28 shipped more payload than prose. Eighteen shipped more than ten times as much. The median page delivered 208,193 characters and 5,209 characters of prose, and the median payload was 77,164 characters. Among the pages carrying more than 500 words, the widest ratio was a direct to consumer site that sent 732,923 bytes: 506,015 characters of payload against 3,802 characters of prose, or 133 to one, for 534 words of copy.

Two pages went the other way, and both are instructive. One is an API reference that ships 14,642 words of tabular content and only 17,947 characters of payload, because there is very little interactivity to serialise. The other is a Pages Router site whose __NEXT_DATA__ block is 199 characters, because it passes almost no props through it. Neither is doing anything exotic. They are pages whose content is mostly text, and the ratio follows the content rather than the framework. That is the useful version of this finding: the framework sets a floor on the overhead, and what the page is made of decides everything above it. Our Next.js fix guide covers the levers, and prose parity is the measure the report grades this on.

HostnameBytes deliveredPayload charsProse charsPayload per prose char
cuure.com732,923506,0153,802133
fieldguide.io2,827,930787,4909,63482
sedai.io574,411435,4926,13171
cloudsmith.com268,52552,4267,7276.8
norebase.com121,9347,6066,2571.2
countrystatecity.in838,51817,94798,3630.2
Six of the 28 Next.js home pages, measured on 12 September 2026. Payload is characters inside self.__next_f.push calls plus any __NEXT_DATA__ body; prose is characters recovered by the scanner's extractor with no JavaScript executed.

Is the RSC payload a second copy of the text?

Next.js documents what the payload is, and the definition matters here because it decides whether the 3,897,015 characters are waste or work. The App Router documentation page on Server and Client Components, carrying a last updated date of 25 August 2026 and a version label of 16.3.5, defines it directly: the RSC Payload is a compact, serialised representation of the rendered React Server Components tree, used by React on the client to update the browser's DOM, and it contains the rendered result of Server Components, placeholders for where Client Components should be rendered with references to their JavaScript files, and any props passed from a Server Component to a Client Component. The same page says the HTML is used to immediately show a fast non-interactive preview of the route. The page is at nextjs.org/docs/app/getting-started/server-and-client-components.

Read plainly, that means the rendered result of the server tree is serialised twice on first load: once as HTML for the preview, once as payload for the reconciliation. So we tested the overlap. For each page we took the twenty longest visible text blocks of six words or more, normalised whitespace, and asked whether the first sixty characters of each appeared anywhere inside the payload region. Twenty five of the 28 pages had both a payload and enough text blocks to sample.

Thirteen of those 25 had at least half their sampled blocks present in the payload, and the median across the 25 was exactly 50 percent. Five pages hit 85 percent and one hit 100 percent. Five returned zero, which is what a route with little interactive content looks like: almost nothing to serialise, so the payload carries structure rather than copy.

The method has real limits and they cut both ways. A sixty character prefix match misses text the payload holds in split chunks or with different escaping, so the true overlap is probably higher than 50 percent rather than lower. It also only samples the longest blocks, which are the ones most likely to be genuine content. What it establishes is narrower than a percentage: on the median Next.js page in this sample, a meaningful share of the payload is text the crawler has already read in the markup, delivered a second time in a form it cannot read. That is not a bug in Next.js. It is the cost of hydration, and it is the same shape as the case where text in hydration JSON scored the same as no text at all, with one important difference: there the text was only in the JSON, and here it is in both places. A site in the first situation has a problem. A site in the second is paying a tax, and the React prose parity guide is about the first.

What an HTML parser recovers

  • 253,179 characters of visible prose across 28 pages
  • 33,951 words in total, median 604 per page
  • Four pages under 50 words, two of them zero
  • 17 of 28 carried at least one JSON-LD block
  • 16 of 28 carried exactly one h1 element

What the payload holds

  • 3,897,015 characters across the same 28 pages
  • 3,805,887 of that is App Router flight data
  • 15.4 payload characters per character of prose
  • 13 of 25 sampled pages duplicate half their longest blocks
  • Median page carries 77,164 characters of it
The same 28 Next.js home pages of 12 September 2026, read two ways. Neither column executed any JavaScript.

Does a Next.js page hit a crawler's byte limit?

There is exactly one published number to check this against. Google's Googlebot documentation, last updated 3 February 2026, states that Googlebot crawls the first 2MB of a supported file type, and the first 64MB of a PDF. No AI crawler vendor publishes an equivalent figure, which we went through token by token when we found that Googlebot reads the first two megabytes and three AI crawler vendors name no limit at all. So the honest framing is that 2MB is the only cutoff anybody outside these companies can plan against, and it belongs to a crawler that is not an AI crawler.

Against that line, one of the 28 pages is over. It delivered 2,827,930 bytes, so a client applying Google's rule would stop at roughly 71 percent of the document. What sits in the last 29 percent of a Next.js page is not random: flight data is streamed in chunks appended through the body, so the tail of a large App Router document is disproportionately payload rather than prose. On this particular page the prose is 9,634 characters in a document of 2.8 million, so the content is almost certainly inside the first 2MB. Being truncated and losing the content are different events, and we did not measure which happened.

The next largest were 1,315,648 bytes, 838,518 and 732,923. Twenty four of the 28 were under 600,000 bytes and the smallest was 4,938. So this is not a widespread problem in this sample, and a post claiming Next.js pages routinely blow past crawler limits would be overstating one page into a trend. What the distribution does show is a long tail: the largest page in the sample is roughly 570 times the size of the smallest, and the four largest together account for 5,715,019 of the 11,333,470 bytes delivered by all 28.

The reason to watch it at all is that the number nobody publishes is the one that matters. Crawl budget is spent in bytes as well as requests, and across these 28 pages the payload raises the cost from 219 characters per readable word to 333, which is half as much again for nothing a parser can use. That is the same argument that applies to the archive crawlers: Common Crawl archived 2.14 billion pages in July without running JavaScript, and every byte of payload in those captures is a byte that carried nothing into the archive.

  • Largest page in the sample 2827930 bytes Above the 2MB line. 9,634 characters of prose
  • Google's stated cutoff for a supported file type 2000000 bytes Googlebot only. No AI crawler vendor publishes one
  • Second largest 1315648 bytes 21,182 characters of prose against 239,318 of payload
  • Third largest 838518 bytes The API reference. 98,363 characters of prose, the most in the sample
  • Fourth largest 732923 bytes 3,802 characters of prose against 506,015 of payload
The five largest of the 28 Next.js home pages by bytes delivered on 12 September 2026, against the 2MB figure Google's Googlebot documentation states, last updated 3 February 2026.

Do Next.js sites name AI crawlers in robots.txt?

Rendering is only half of what decides whether a crawler reads a page, so we asked each of the 28 hostnames for its robots.txt on the same day. Twenty five answered HTTP 200 with something that was not an HTML document. Three returned 404, which under RFC 9309 means unrestricted access rather than no access. All 25 files carried at least one User-agent line, which already separates this group from the hosted builders, where we found 20 of 40 Webflow files holding no rule of any kind.

Seven of the 25 name at least one of the 15 AI crawler tokens the scanner evaluates. Eighteen name none. The split is visible in the file sizes: the seven that name tokens run from 487 to 6,603 bytes, and the eighteen that do not run from 66 to 722 bytes. That is the difference between a file somebody wrote and a file somebody accepted. Seven of 25 is a better rate than we found on Wix, where none of 69 files named a single token, and a worse one than Squarespace, where 64 of 66 carried a platform generated file naming 26 tokens that nobody at the site chose either way.

The token distribution inside those seven is tight. GPTBot, ClaudeBot, PerplexityBot and Google-Extended each appear in all seven. OAI-SearchBot and ChatGPT-User appear in six. Claude-SearchBot and Claude-User appear in two. That last gap is the one worth acting on, because it is the same asymmetry we found at scale when GPTBot turned out to be the most blocked AI crawler, disallowed by 82 of 718 robots.txt files against 24 for its search twin. A file that names ClaudeBot and stops has addressed the training crawler and said nothing to the two that fetch pages for answers.

One file in the 25 does something specific to this framework: it carries a Disallow for /_next, the path Next.js serves its build assets from. That is the only appearance of the string in any of the 25 files. It is a defensible rule for a crawler that would otherwise walk a directory of hashed JavaScript chunks, and it changes nothing about whether a page is readable, because the payload is inline in the HTML rather than fetched from that path. If you want to see how your own file resolves per token rather than as prose, the robots.txt tester evaluates each one separately.

TokenFiles naming it, of 25What it fetches for
GPTBot7OpenAI model training
ClaudeBot7Anthropic model training
PerplexityBot7Perplexity search index
Google-Extended7Google training and grounding, one token for both
OAI-SearchBot6The ChatGPT search index
ChatGPT-User6A live fetch made on a user's behalf
Claude-SearchBot2The Claude search index
Claude-User2A live fetch made on a user's behalf
AI crawler tokens named in the 25 robots.txt files that answered HTTP 200 as text, from the 28 Next.js hostnames asked on 12 September 2026. Naming a token means the string appears in the file, whether it is allowed or disallowed.

What to check on your own Next.js site

Four checks come out of this scan, in the order they change a result. Each one can be run from a terminal against your own domain in under a minute, and none of them needs a scanner.

First, count the prose. Fetch your home page without a browser and strip script, style and noscript before counting words. Four of the 28 pages in this sample came back under 50 words, and two returned none at all. A site in that state is not paying a hydration tax, it is failing to render, and the fix is the standard one: move the fetch out of a client effect and into a Server Component or a data loading function. Only two of nine crawler vendors state whether they execute JavaScript at all, which we established when we read all nine and found two of nine operators say either way, so a page that needs a renderer is gambling on an undocumented behaviour.

Second, check the structure the text sits in. Seventeen of the 28 carried at least one JSON-LD block and eleven carried none, which is 61 percent and is no better than the frame as a whole: the day before, across the same 392 hostnames, 141 of 382 home pages carried no structured data in the raw HTML, leaving 63 percent that did. Server rendering gets the text out. It does not get the schema out, because nothing emits schema unless somebody writes it. Sixteen of the 28 carried exactly one h1, four carried none, and eight carried more than one, the highest being ten on a single page. An extractor reading structure rather than styling can be stricter than you expect about that, as we found when an h1 inside a header element counted as none. The vocabulary itself is covered in our note on structured data.

Third, weigh the page. Divide the characters your home page delivers by the words of prose it carries. Across the 26 pages here that held at least one word, the median was 383 characters delivered per word. If your figure is several times that, the payload is the first place to look, and the lever is the client boundary: every component marked with the client directive pulls its props into the serialised tree. Moving a boundary deeper is the change that shrinks it.

Fourth, read your robots.txt per token rather than as a document. Eighteen of the 25 files here name no AI crawler at all, which is a decision by default rather than a decision. Whether you want the crawlers is your call, and AI visibility is worth wanting only if you also want the crawl. What is not a call is not knowing. What GPTBot sees renders the crawler side of a single URL, and the methodology page sets out what a grade counts and what it refuses to guess.

What this post did not measure should be stated plainly. We read HTML and robots.txt on one day, 12 September 2026, from one network location, using the user agent documented on our bot page. We did not observe any AI crawler requesting any of these sites, we read no access log, and no figure here reports what a crawler did with any of these bytes. We rendered nothing in a browser, so every count describes what arrived rather than what a person eventually sees. Twenty eight pages is a small sample and one unusual site moves a percentage by nearly four points. And the framework attribution is a signal match on delivered bytes, not a statement about anybody's build configuration.

  • Prose readable without JavaScript Median 604 words per page, 33,951 words across the 28
  • Meta description in the head Present on all 28
  • Payload smaller than the prose it wraps True on 2 of 28. Eighteen shipped more than ten times the prose
  • JSON-LD structured data Present on 17 of 28, absent on 11
  • Exactly one h1 element 16 of 28. Four had none and eight had more, the highest ten
  • Any AI crawler token in robots.txt Named in 7 of the 25 files that answered 200 as text
Measured across the 28 Next.js home pages that answered HTTP 200 on 12 September 2026. Present means the signal was found in the bytes as delivered, with no JavaScript executed.

Written by

Lantad

Published .

Search for Next.js AI crawlers and the answers divide neatly into two camps: one says the App Router renders on the server so crawlers are fine, the other says React is a single page app so crawlers see nothing. Both are describing something real, and both miss what actually lands on the wire. On 12 September 2026 we requested the home page of the 392 hostnames in Lantad's committed platform corpus frame, once each, with redirects followed and no JavaScript executed. Three hundred and eighty three answered HTTP 200. Running those bytes through the scanner's own platform detector, the one that decides which stack-specific fix a report shows, returned a Next.js signal on 28 of them.

Common questions

Can AI crawlers read a Next.js site without running JavaScript?

On this evidence, usually yes. Across 28 Next.js home pages measured on 12 September 2026 with no JavaScript executed, the raw HTML held a median of 604 words of visible prose and 33,951 words in total. Four of the 28 held fewer than 50 words and two held none, so server rendering is the common case rather than a guarantee.

What is the RSC payload and why does it make a page larger?

Next.js documentation for the App Router, last updated 25 August 2026, defines the React Server Component Payload as a compact serialised representation of the rendered Server Component tree, used by React on the client to update the DOM, containing the rendered result of Server Components, placeholders and references for Client Components, and any props passed between them. It is delivered inline alongside the HTML, so the rendered output is serialised twice on a first load. Across the 28 pages measured it came to 3,897,015 characters against 253,179 characters of prose.

Does the RSC payload hurt AI visibility?

Not directly, and we did not measure any effect on citations. The text is present in the HTML as well, so a crawler that parses HTML reads it. The measurable cost is bytes: across the 26 of 28 pages holding at least one word, the median was 383 characters delivered per word of prose, and one page exceeded the 2MB limit that Google's Googlebot documentation, last updated 3 February 2026, states for a supported file type.

Should I add Disallow: /_next to my robots.txt?

One of the 25 Next.js robots.txt files we read on 12 September 2026 does. It stops a crawler walking the directory of hashed build assets, and it does not affect page readability, because the RSC payload is inline in the HTML rather than fetched from that path. It also does not reduce the bytes a crawler downloads for the page itself.

See what AI can read on your site

Run a free scan and get a graded report of exactly what AI crawlers can and cannot read, with ranked fixes.