<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: gonghuiling</title>
    <description>The latest articles on DEV Community by gonghuiling (@duoni).</description>
    <link>https://dev.to/duoni</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4210394%2F56231057-5f1e-4139-8b30-1418163afec9.png</url>
      <title>DEV Community: gonghuiling</title>
      <link>https://dev.to/duoni</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/duoni"/>
    <language>en</language>
    <item>
      <title>I fetched 30 AI-built sites without JavaScript. 8 of 9 Bolt sites were empty pages.</title>
      <dc:creator>gonghuiling</dc:creator>
      <pubDate>Tue, 27 Oct 2026 09:11:59 +0000</pubDate>
      <link>https://dev.to/duoni/i-fetched-30-ai-built-sites-without-javascript-8-of-9-bolt-sites-were-empty-pages-2je2</link>
      <guid>https://dev.to/duoni/i-fetched-30-ai-built-sites-without-javascript-8-of-9-bolt-sites-were-empty-pages-2je2</guid>
      <description>&lt;p&gt;I build my own sites with AI tools, and after launching a couple of them I wanted a simple answer: can ChatGPT actually read them?&lt;/p&gt;

&lt;p&gt;So I took 30 live sites built with tools like Bolt and Lovable, fetched each homepage the way most AI crawlers do (one plain HTTP request, no JavaScript), and looked at what came back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the raw HTML matters
&lt;/h2&gt;

&lt;p&gt;Most AI-built sites are single-page React apps. The server sends a nearly empty HTML file, and the browser builds the page after JavaScript runs.&lt;/p&gt;

&lt;p&gt;That's fine for people. It's fine-ish for Google, which renders JavaScript, just later and less reliably than plain HTML. But a December 2024 study by Vercel and MERJ found that none of the major AI crawlers they observed render JavaScript, including OpenAI's, Anthropic's and Perplexity's. Link previews in Slack, X and WhatsApp mostly read raw HTML too.&lt;/p&gt;

&lt;p&gt;So if your content only exists after JavaScript runs, those tools get this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="root"&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  What I found
&lt;/h2&gt;

&lt;p&gt;I ran the check on 14 October 2026 and re-ran it on 23 October with better platform detection. These are the 23 October numbers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Sites&lt;/th&gt;
&lt;th&gt;Still reachable&lt;/th&gt;
&lt;th&gt;Blank without JS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bolt&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lovable&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js, Astro, WordPress&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not identified&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"Blank" means fewer than 200 visible characters in the raw HTML plus an empty app mount point or scripts that build the page. The split was not subtle: on the first run, blank sites had at most 163 visible characters, and every other site had at least 1,692.&lt;/p&gt;

&lt;p&gt;A few other things showed up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soft 404s:&lt;/strong&gt; 13 of 30 sites answered &lt;code&gt;200 OK&lt;/code&gt; for a page that doesn't exist. To a crawler, every junk URL looks like a real page with the same content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No sitemap:&lt;/strong&gt; on the first run, 16 of 30 had no sitemap I could find, including 9 of the 10 Bolt sites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A canonical pointing at &lt;code&gt;http://localhost:3000/&lt;/code&gt;:&lt;/strong&gt; one site was telling search engines its real address was the developer's laptop.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The Lovable caveat
&lt;/h2&gt;

&lt;p&gt;Lovable is more complicated than the table suggests. Lovable says projects created since May 2026 are server-rendered, and older projects get a prerendered copy that is served only to verified crawlers, including ChatGPT's, Perplexity's, Claude's and Gemini's. Base44 reportedly does the same on custom domains.&lt;/p&gt;

&lt;p&gt;My check identifies itself as its own bot, so it can't see that crawler-only copy. An empty page from the outside doesn't prove ChatGPT sees nothing on a Lovable site. Bolt and plain Vite + React sites only get that fallback if you set one up yourself.&lt;/p&gt;
&lt;h2&gt;
  
  
  Check your own site in 10 seconds
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://yoursite.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;title&amp;gt;.*&amp;lt;/title&amp;gt;"&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://yoursite.com | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; https://yoursite.com/this-page-does-not-exist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If the title is still &lt;code&gt;Vite + React + TS&lt;/code&gt;, fix that first. It's what Google and AI tools will show as your site's name.&lt;/li&gt;
&lt;li&gt;If the HTML is a few hundred bytes and your headline isn't in it, crawlers that don't run JavaScript see a blank page.&lt;/li&gt;
&lt;li&gt;If the last command prints &lt;code&gt;200&lt;/code&gt;, you have soft 404s.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also open &lt;code&gt;view-source:yoursite.com&lt;/code&gt; in Chrome and search for your headline.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ship HTML with content.&lt;/strong&gt; Add build-time prerendering for every public page, or use server rendering. Next.js and Astro do this by default. For a Vite + React app, ask your builder (Bolt, Replit Agent, Cursor or Claude Code) to add build-time prerendering for every public route, so each page's title, description and text are in the HTML.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return a real 404.&lt;/strong&gt; Many hosts are set up to send every path to &lt;code&gt;index.html&lt;/code&gt;. Limit that rewrite to routes that exist and serve a not-found page with a 404 status for the rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a sitemap.&lt;/strong&gt; Generate &lt;code&gt;sitemap.xml&lt;/code&gt; listing your real pages on your live domain, reference it in &lt;code&gt;robots.txt&lt;/code&gt;, and submit it in Google Search Console.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your canonical.&lt;/strong&gt; It should point at your production domain, not a &lt;code&gt;*.bolt.host&lt;/code&gt;, &lt;code&gt;*.vercel.app&lt;/code&gt; or &lt;code&gt;localhost&lt;/code&gt; address.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then run the curl commands again. If your headline shows up in the raw HTML, you're done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Thirty sites is a small sample, and it isn't random: I copied them by hand from Google results, so every one was already indexed by Google, blank or not. Platform detection can mislabel sites, and each site was checked at one point in time. Treat the percentages as a signal, not a census.&lt;/p&gt;

&lt;p&gt;The full method and the anonymised data (CSV) are here: &lt;a href="https://indexready.dev/research/ai-built-sites-blank-without-javascript" rel="noopener noreferrer"&gt;Most of the Lovable and Bolt sites we checked are blank without JavaScript&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I turned this check into a free tool, &lt;a href="https://indexready.dev" rel="noopener noreferrer"&gt;IndexReady&lt;/a&gt;. It runs these tests on your homepage in about 15 seconds and gives step-by-step fixes for the tool you built with. No sign-up. If you run it and something looks wrong, I'd like to hear about it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
