---
title: "Main content only appears after JavaScript runs (geo/js-dependency)"
description: "geo/js-dependency: OpenAI, Anthropic, Perplexity, Meta and ByteDance crawlers fetch HTML without executing JavaScript, so client-rendered text doesn't exist…"
canonical: https://void-design.vercel.app/rules/geo/js-dependency
lastModified: 2026-09-16
---

# Main content only appears after JavaScript runs

`geo/js-dependency` · severity **error** · category AI search · detected by `void geo` and `void audit`

## Why it matters

OpenAI, Anthropic, Perplexity, Meta and ByteDance crawlers fetch HTML without executing JavaScript, so client-rendered text doesn't exist for them. Measured as 1 − (5-word shingles of rendered main text found in raw HTML fetched as GPTBot); above 0.20 is a scoring gate.

## How to fix it

Render primary content in Server Components (or prerender it). Keep 'use client' for interactive leaves and fetch data on the server, not in useEffect.

## Example

```tsx
// ✗ app/pricing/page.tsx
'use client'
export default function Page() { const [plans, setPlans] = useState([]); useEffect(() => { fetch('/api/plans')... }, []) }

// ✓ Server Component: the HTML response contains the plans
export default async function Page() {
  const plans = await getPlans()
  return <PlanTable plans={plans} /> // PlanTable may be a Client Component for toggles
}
```

## References

- https://vercel.com/blog/the-rise-of-the-ai-crawler
- https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics

## More ai search rules

`void geo` reports 41 rules in this category. Generative-engine optimisation: whether AI crawlers that don't run JavaScript see the same content, valid and visible JSON-LD, an explicit AI robots policy, llms.txt, Markdown mirrors and answer-first writing.

- `hidden-streamed-content` Crawlers receive main content only inside hidden streaming containers — [geo/hidden-streamed-content](https://void-design.vercel.app/rules/geo/hidden-streamed-content)
- `ai-bot-blocked` AI crawler user agents get 401/403/429/503 or a challenge page — [geo/ai-bot-blocked](https://void-design.vercel.app/rules/geo/ai-bot-blocked)
- `ai-content-differs` AI crawlers get materially different HTML than browsers — [geo/ai-content-differs](https://void-design.vercel.app/rules/geo/ai-content-differs)
- `jsonld-parse-error` JSON-LD block is not valid JSON — [geo/jsonld-parse-error](https://void-design.vercel.app/rules/geo/jsonld-parse-error)
- `jsonld-unsafe` JSON-LD contains a literal </script or <!-- — [geo/jsonld-unsafe](https://void-design.vercel.app/rules/geo/jsonld-unsafe)
- `jsonld-missing` Page has no JSON-LD — [geo/jsonld-missing](https://void-design.vercel.app/rules/geo/jsonld-missing)
- `jsonld-not-in-raw` JSON-LD is injected by JavaScript — [geo/jsonld-not-in-raw](https://void-design.vercel.app/rules/geo/jsonld-not-in-raw)
- `home-entity-missing` Home page lacks Organization + a single WebSite node — [geo/home-entity-missing](https://void-design.vercel.app/rules/geo/home-entity-missing)

Detected by `void geo` and `void audit`. Explain it in a terminal: `void rules geo/js-dependency`
