Skip to contentSubmitium

9 min read

JavaScript SEO in 2026: what crawlers see on 2,000 new websites

We loaded 1,913 new websites with and without JavaScript: 10% show no text without it. GPTBot, ClaudeBot and PerplexityBot never downloaded it.

JavaScript SEO: what crawlers see on 2,000 new websites. The same home page twice: with JavaScript, a full page; without JavaScript, an empty root div and a script tag. 10% of new websites send no text without JavaScript.
On this page

Many new websites are single-page apps: the server sends an almost empty page, and JavaScript builds it in the browser. Google runs that JavaScript. Most AI crawlers don't. So what does a crawler actually get when it asks for your home page?

We checked 2,000 websites launched on Hacker News between August and October 2026, on November 4, 2026. 1,913 answered. We loaded each home page twice: as raw HTML, the way a crawler that doesn't run JavaScript gets it, and in Chrome after JavaScript. We requested each one again with the names of six crawlers, and read 30 days of logs of a website to see which crawlers download JavaScript at all. This is what we found:

  • 1 new website in 10 sends no text without JavaScript. For 10.2% of the 1,913, the raw HTML has no readable text: a median of 0 words, against 374 once JavaScript runs. Another 1% send only part of it.
  • Most of them are single-page apps built with Vite. 42% of the Vite apps in our sample have their text only in JavaScript. Next.js: 2%. Astro, TanStack Start and WordPress: none.
  • They keep a title and lose the rest. 193 of those 196 websites have a title in their HTML and 168 a description, but only 44 have a heading and 32 have five links or more.
  • Three AI crawlers never downloaded a JavaScript file. On findly.tools, in 30 days, GPTBot made 3,990 requests, ClaudeBot 14,900 and PerplexityBot 21,420, and none of them requested a JavaScript file. Googlebot requested 1,040.
  • 13.6% of new websites refuse GPTBot. 13.3% refuse ClaudeBot. Only about 1% refuse the crawlers of AI search, OAI-SearchBot and PerplexityBot. 247 of the 260 websites that refuse GPTBot are behind Cloudflare.
Stacked bar chart of the home pages without JavaScript, by stack. Vite single-page apps, 308 websites: 42% text only with JavaScript, 2% part of it, 9% little text either way, 46% text in the HTML. SvelteKit, 45: 9%, 0%, 13%, 78%. Stack not identified, 694: 6%, 0%, 8%, 85%. Next.js, 501: 2%, 2%, 3%, 93%. TanStack Start, 66: 0%, 0%, 5%, 95%. Astro, 188: 0%, 1%, 2%, 98%.
1,913 websites launched on Show HN, August to October 2026. Raw HTML against Chrome after JavaScript, November 4, 2026.

How we checked

  • The websites. Hacker News lists 5,648 websites on their own domain posted as Show HN from August 1 to October 31, 2026. We took 2,000 at random. 1,913 answered a browser with their home page.
  • The raw HTML. We requested each home page as a browser does, without running its scripts, and counted the words of readable text outside scripts and styles. We also noted its title, description, headings, links and the framework it was built with, from the traces each framework leaves in the HTML.
  • After JavaScript. We loaded in headless Chrome every home page with fewer than 150 words in its HTML, and 250 others taken at random, and counted the words on the page 3 seconds after it loaded.
  • The crawler names. We requested each home page again with the user agents of Googlebot, GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot and ChatGPT-User, and noted which ones were refused.
  • The logs. Cloudflare analytics of findly.tools, a tool directory built with Next.js and run by the team behind Submitium, from October 5 to November 4, 2026.

A home page "needs JavaScript" when its raw HTML holds less than a fifth of the words it shows after JavaScript, and it shows at least 50. Websites with little text either way (games, tools, sign-in pages) are counted apart. Of the 250 pages with 150 words or more checked in Chrome, one showed most of its text only with JavaScript: the raw count is a reliable first test.

What crawlers get on new websites

StackWebsitesText only with JavaScriptPart of it
Vite single-page app30842%2%
SvelteKit459%0%
Stack not identified6946%0%
Next.js5012%2%
TanStack Start660%0%
Astro1880%1%
WordPress220%0%
All websites1,91310.2%1.0%

The difference comes from where the page is built. Next.js, Astro, TanStack Start, SvelteKit and WordPress build it on the server or when the site is published, so the text is in the HTML. A Vite app built as a single page sends <div id="root"></div> and a script, and the browser does the rest.

On the Next.js websites that show no text without JavaScript, the content is loaded in the browser after the page arrives. The framework can render on the server; these pages don't use it.

What is left without JavaScript

The 196 home pages that need JavaScript are not entirely empty. Their HTML has a <head>:

  • 193 have a title.
  • 168 have a description.
  • 138 have social sharing tags (Open Graph).
  • 93 have a canonical address.
  • 44 have a heading (<h1>).
  • 32 have five links or more.

A crawler that doesn't run JavaScript learns the name of the product and one sentence about it. It finds no text, no headings, and no links to the other pages: it can't explore the site from the home page.

Which crawlers run JavaScript

Table of requests by crawler on findly.tools in 30 days, with the JavaScript files among them. Applebot: 18,240 requests, 2,090 JavaScript files. Googlebot: 25,170 and 1,040. OAI-SearchBot: 80,270 and 860. meta-webindexer: 78,050 and 560. bingbot: 89,920 and 400. GPTBot: 3,990 and 0. ClaudeBot: 14,900 and 0. PerplexityBot: 21,420 and 0. meta-externalagent: 131,400 and 0. Amazonbot: 20,670 and 0.
findly.tools, a Next.js site, October 5 to November 4, 2026. Cloudflare samples, rounded to 10.

A crawler that never downloads a page's JavaScript can't run it. On findly.tools, in 30 days:

  • Googlebot, Applebot, bingbot, OAI-SearchBot and Meta's indexer downloaded JavaScript files. Downloading a file doesn't prove a crawler runs it, but it is the first step.
  • GPTBot, ClaudeBot, PerplexityBot, Amazonbot and meta-externalagent made thousands of requests and downloaded no JavaScript file.

Google says how it works in its JavaScript SEO basics (opens in a new tab): "Once Google's resources allow, a headless Chromium renders the page and executes the JavaScript." The same page adds: "server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript." In its study of AI crawlers (opens in a new tab) of December 2024, Vercel found the same: "none of the major AI crawlers currently render JavaScript."

So a single-page app can be indexed by Google, after a delay for rendering, and be blank to the crawlers that feed ChatGPT's training, Claude and Perplexity.

The crawlers new websites refuse

Bar chart of the share of new websites that refuse each crawler: GPTBot 13.6%, ClaudeBot 13.3%, PerplexityBot 1.4%, Googlebot 1.3%, OAI-SearchBot 0.9%, ChatGPT-User 0.9%.
1,913 websites that answered a browser. Status 401, 403, 429 or 503. November 4, 2026.

When we requested the home pages with GPTBot's name, 260 websites that had just answered a browser refused, most with "Your request was blocked." 247 of them run behind Cloudflare, which lets each site block AI crawlers by behavior. Its documentation (opens in a new tab) says: "Each policy applies to Verified bots with that behavior and matching unverified bots." For new domains, nothing is blocked by default.

The pattern is clear: about 13.5% of new websites refuse the crawlers that collect pages to train models (GPTBot, ClaudeBot), and about 1% refuse the crawlers of AI search (OAI-SearchBot, PerplexityBot). Refusing GPTBot does not remove a site from ChatGPT's search, which uses OAI-SearchBot. Refusing both does. If you never chose to block either, check your Cloudflare settings.

How to check your website

Three checks, from the simplest:

  1. View the source. In your browser, open view-source: followed by your address. If you don't see your headline and your text, a crawler that doesn't run JavaScript doesn't either.
  2. Request it as a crawler. In a terminal:
bash
curl -s -o /dev/null -w "%{http_code}\n" -A "GPTBot" https://<your domain>/
curl -s https://<your domain>/ | grep -c "<h1"

The first line prints the status a crawler named GPTBot gets: 403 means it is refused. The second counts the headings in your raw HTML: 0 means none.

  1. Ask Google. In Search Console, the URL Inspection tool shows the HTML Google got after rendering, with a screenshot.

How to fix it

  • Render on the server or at build time. Google recommends it: "we recommend that you use server-side rendering, static rendering, or hydration as a solution." Next.js, Astro, Nuxt, SvelteKit, TanStack Start and React Router in framework mode all do it. In our sample, 98% of the Astro websites and 95% of the TanStack Start websites had their text in the HTML; the others had little text either way, or for one site, part of it in JavaScript.
  • Move a Vite app's public pages first. The home page, pricing, features and blog are the pages crawlers need. The app behind the sign-in can stay a single-page app.
  • In Next.js, keep the content of public pages out of client-only components. Text fetched in the browser after the page loads is not in the HTML.
  • Prerendering for bots is a workaround. Google calls dynamic rendering, serving bots a different version, "a workaround and not a recommended solution". None of the 196 websites that need JavaScript served more text to Googlebot's or GPTBot's name than to a browser.
  • Builders. Lovable says (opens in a new tab) its new apps are built on TanStack Start, "which supports full server-side rendering", and that older ones use pre-rendering. If you built your site with a tool, check what it sends with the view-source test above.

Our guide to SEO for a new website covers the rest of the first months: addresses, sitemap, titles and Search Console. Our study of llms.txt shows which crawlers read what.

Where Submitium fits

The directories that ask for a badge on your website check it the same way crawlers do: they read the raw HTML. A badge added by JavaScript is invisible to them, and the listing fails. Our badge wall is built to be in your page's HTML, and we check it as a directory would before we submit.

We submit your product by hand to directories and launch platforms that give a free dofollow link, keep their badges in one badge wall on your site, and check the link on each live listing six times over 90 days. A directory costs $0.99, less from the 51st, and a first order starts at 30 directories. See the pricing and the full list of directories.

Questions

Is JavaScript bad for SEO?

No. Text that only appears after JavaScript runs is. Google renders JavaScript, after a delay, but most AI crawlers don't: in our logs, GPTBot, ClaudeBot and PerplexityBot never downloaded a JavaScript file. Websites that render on the server or at build time have their text in the HTML for every crawler.

Does Google render JavaScript?

Yes. Google queues pages for rendering and a headless Chromium runs their JavaScript "once Google's resources allow". It still recommends server-side or static rendering, because "not all bots can run JavaScript".

Do AI crawlers run JavaScript?

The crawlers of ChatGPT's training (GPTBot), Claude (ClaudeBot) and Perplexity (PerplexityBot) didn't download a single JavaScript file from findly.tools in 30 days. OAI-SearchBot, for ChatGPT's search, downloaded some. Vercel found in 2024 that none of the major AI crawlers rendered JavaScript.

Is a single-page app bad for SEO?

For its public pages, often. In our sample, 42% of the home pages built as Vite single-page apps showed no text without JavaScript. Google can still index them after rendering; AI crawlers get the title and the description, and little else.

Is Lovable good for SEO?

Lovable says new apps are built on TanStack Start with server-side rendering, and that older apps get pre-rendered snapshots for crawlers. In our sample, all 66 websites built with TanStack Start had readable home pages without JavaScript or almost no text at all. Check yours with view-source.

How do I see what Google sees on my page?

Use the URL Inspection tool in Search Console: it shows the rendered HTML and a screenshot. For crawlers that don't run JavaScript, view the page source or request it with curl.

Should I block GPTBot?

It is your choice: GPTBot collects pages to train OpenAI's models. Blocking it does not remove your site from ChatGPT's search, which uses OAI-SearchBot. 13.6% of the new websites in our sample refused GPTBot, and fewer than 1% refused OAI-SearchBot.

More from the blog

9 min read

llms.txt in 2026: who has one, and who reads it

We checked /llms.txt on 3,202 websites and read 30 days of logs of a site that has one. 36% of new websites have one. GPTBot never asked for it.