Some of the most polished websites on the internet are completely blank to AI systems. Not blocked, not penalized, simply empty. The reason is a technical detail that most site owners have never checked: how much of your content exists in the raw HTML, before any JavaScript runs. If the answer is nothing, then for a large part of the AI ecosystem, your website is a white page.

How Single Page Applications Actually Work

Frameworks like React, Vue and Angular changed how websites are built. In the classic client side rendering model, your server does not send finished pages. It sends a nearly empty HTML shell, often just a single element like a div with the id root, plus a large JavaScript bundle. The visitor browser then downloads the bundle, executes it, fetches data from an API, and only then paints the actual content onto the screen.

For human visitors with modern browsers, this works fine. The problem is that many automated systems never run that second step. They request the page, receive the empty shell, and move on. Everything your users see, headlines, product descriptions, prices, articles, exists only inside a JavaScript runtime that the bot never started.

Which Bots Render JavaScript and Which Do Not

Googlebot is the exception. Google invested heavily in a rendering pipeline, so JavaScript sites do eventually get indexed in Google Search. Even there, rendering happens in a second wave that can be delayed, consumes extra crawl budget, and occasionally fails on complex apps.

AI crawlers are a different story. The crawlers that matter for AI visibility, including GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot and the user triggered fetchers like ChatGPT-User and Claude-User, primarily work with the raw HTML response. Running a full headless browser for billions of pages is expensive, so most of these systems simply do not do it, or do it only for a tiny fraction of fetches. When such a bot requests a client rendered page, the content it receives is the empty shell: a few script tags and a hollow root element.

The consequence is brutal in its simplicity. An AI assistant cannot cite text it never received. Your competitors with server rendered pages become the sources for questions in your niche, and your beautifully animated application contributes nothing.

The Hidden Second Problem: Meta Tags

Client side rendering usually breaks more than the visible content. Many SPA setups inject title tags, meta descriptions, Open Graph tags and structured data with JavaScript after the page loads. Social platforms and AI systems that read only raw HTML will see either nothing or the same generic default tags on every single URL. That is why links from some modern web apps show a blank preview when shared in chat applications. The same failure applies to JSON-LD structured data injected on the client, which we cover in detail in our structured data guide.

Test Your Site in 60 Seconds

Test 1: View the page source. Right click your page and choose View Page Source, not Inspect Element. Inspect shows the live DOM after JavaScript ran. View Source shows what bots receive. Search for your main headline in the source. If it is not there, bots do not see it.

Test 2: Fetch it from a terminal.

curl -s https://yoursite.com/ | grep -i "your headline here"

No output means the text does not exist in the server response.

Test 3: Disable JavaScript. In browser developer tools, disable JavaScript and reload. Whatever remains on screen is roughly what a non rendering bot experiences.

Test 4: Run an automated scan. The CheckMy.site scanner includes two dedicated checks for this failure mode. The JavaScript-Free Content check measures how much readable text exists in the raw HTML and fails pages with almost none. The SPA Shell Detection check recognizes the classic pattern of an empty root or app container combined with a tiny HTML payload. Both run automatically as part of the AI content category.

Four Ways to Fix It

1. Server Side Rendering

Frameworks like Next.js for React, Nuxt for Vue and SvelteKit render each page on the server and send complete HTML, then hydrate it into an interactive app in the browser. Users get the same experience, while bots get real content in the initial response. This is the standard solution for large dynamic applications, and in 2026 every major frontend framework supports it natively.

2. Static Site Generation

If your content does not change on every request, you can render all pages once at build time and serve plain HTML files. Tools like Astro, Eleventy and the static export modes of the big frameworks produce sites that are extremely fast, cheap to host and perfectly readable by every crawler on earth. For blogs, documentation, marketing sites and most business websites, static generation is usually the best answer.

3. Prerendering for Bots

When rebuilding the application is not realistic, a prerendering layer can help. A service or middleware detects bot user agents, runs your page once in a headless browser, caches the resulting HTML, and serves that snapshot to crawlers while humans continue to get the normal app. It adds infrastructure and cache invalidation work, and it must be configured to recognize AI user agents, not just classic search bots. Treat it as a bridge solution rather than a destination.

4. The Hybrid Minimum

If nothing else, make sure the parts that matter most exist in raw HTML on every page: the title tag, the meta description, Open Graph tags, JSON-LD structured data, the main headline and at least a paragraph summarizing the page. Modern islands architecture makes this natural, static content is delivered as HTML while only interactive widgets load as JavaScript. Even this partial fix moves a page from invisible to citable.

How to Verify the Fix

After deploying any of the solutions, repeat the curl test and confirm your headline appears in the raw response. Then run a fresh scan. A healthy result shows the JavaScript-Free Content check passing with a solid amount of extractable text, the SPA shell warning gone, and your meta tags visible in the initial HTML. Combined with correct robots.txt rules and no edge level blocking, this puts your content back on the menu for every AI assistant that answers questions in your field.