← Fix-it library

Make your content readable without JavaScript

Updated· by

Your page’s raw HTML contains little or no readable text. If your content appears only after JavaScript runs, whether that’s a React app shell, a page builder that hydrates client-side, or content loaded from an API, AI crawlers never see it. They download the HTML, strip the tags and scripts, and read whatever text is left. When that’s nothing, you are publishing a blank page to every AI system on earth.

Why don’t AI crawlers just run the JavaScript?

Cost and speed. Google spent two decades building rendering infrastructure, and even Googlebot renders JavaScript in a delayed second wave. AI retrieval systems fetch dozens of candidate pages per answer, at answer time, while a user waits. Executing every page’s app bundle would multiply their compute cost for marginal gain, so they don’t.

Pedro Dias, who spent six years on Google’s search quality team, puts it plainly in this interview: these systems throw away the scripts and keep the text, and content buried in a JavaScript block simply never surfaces. Ahrefs’ study of 1.4 million ChatGPT prompts shows the other half of the problem, since pages are judged by title, snippet, and URL before ever being opened. A page whose HTML is an empty shell loses at both stages.

How do you check what AI actually sees?

View your page’s source. Right-click and choose View Page Source, which shows the server’s raw response. The DevTools Elements panel shows the rendered result after JavaScript, which is exactly what crawlers do not see, so don’t trust it for this. Search the source for a sentence from your visible content. If it isn’t there, it doesn’t exist for AI crawlers.

Our scanner automates the same test: it reads your raw HTML with scripts stripped and measures the text that remains, which is why this check is worth 7 points.

How do you fix it in Next.js or Nuxt?

Turn on server rendering for content pages. Both frameworks make it a routing decision rather than a rewrite. In Next.js, pages in the App Router are server components by default, so the usual culprit is a stray "use client" at the top of a page that only needs it for one widget.

Move the interactive part into its own client component and keep the page itself server-rendered. Static generation works too and is faster still. In Nuxt, check that ssr: true is set (it is the default) and that your content isn’t fetched inside onMounted, which runs only in the browser. Use useAsyncData or useFetch so the data renders on the server.

How do you fix it in Webflow, Shopify, or WordPress?

These platforms render HTML server-side by nature, so a failing check usually points at a specific component rather than the whole site:

  • Webflow: native elements render as real HTML. The problem is usually an embed block that injects content with JavaScript, or a third-party widget (reviews, listings) that mounts client-side. Replace those with collection lists or static content where the text matters.
  • Shopify: theme sections render server-side, but apps that inject product descriptions, reviews, or FAQ accordions often do it with JavaScript. Test a product page’s source. If descriptions are missing, the app is the problem, and most review apps offer a theme-embed mode that outputs real HTML.
  • WordPress: classic themes are fine. Trouble comes from page builders in “client render” modes and from tab or accordion plugins that store content only in scripts. Swap those components, and keep critical facts like prices and hours in plain blocks.

How do you fix a plain React or Vue single-page app?

You have three honest options, in order of effort. First, pre-render the marketing and content routes to static HTML at build time with your bundler’s SSG plugin while leaving the app itself dynamic. Second, migrate content pages to a framework with server rendering and keep the SPA for the logged-in product.

Third, as a stopgap, put the essential facts (what you sell, prices, contact details, your key answers) directly into the HTML shell as real markup, even while the app hydrates around it. Whatever you choose, the test stays the same: the substance must be in the initial response.

Once the text shows up in view-source, rescan to confirm the check flips, and then make sure the newly visible content leads with its point. Our guide on putting the answer in your first 100 words covers why that matters nearly as much as being visible at all.

See where your site stands. The free scan takes about fifteen seconds and shows every fix.

Run a free AI visibility scan

Written by

Abdul Jaafar is the founder of AIOScan and runs Mason, a marketing agency focused on search and AI visibility for local businesses. He built AIOScan because most AI visibility scores are made up, and he wanted one that isn't. More on the about page.