---
title: "Crawlers receive main content only inside hidden streaming containers (geo/hidden-streamed-content)"
description: "geo/hidden-streamed-content: With Suspense on request-time routes, Next.js sends the shell first and the resolved content later in <div hidden id=\"S:n\"> plus…"
canonical: https://void-design.vercel.app/rules/geo/hidden-streamed-content
lastModified: 2026-09-16
---

# Crawlers receive main content only inside hidden streaming containers

`geo/hidden-streamed-content` · severity **warn** · category AI search · detected by `void geo` and `void audit`

## Why it matters

With Suspense on request-time routes, Next.js sends the shell first and the resolved content later in <div hidden id="S:n"> plus a script that moves it. Non-rendering crawlers get it out of reading order and inside a hidden element.

## How to fix it

Add AI crawlers to htmlLimitedBots (they then get fully rendered, in-order HTML), prerender the route, or move primary content above the Suspense boundary.

## Example

```ts
// next.config.ts — keep Next's default list; see seo/metadata-in-body for the full regex
const nextConfig: NextConfig = {
  htmlLimitedBots: new RegExp(NEXT_DEFAULT_HTML_BOTS + '|Googlebot|GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User', 'i'),
}
```

## References

- https://nextjs.org/docs/app/api-reference/config/next-config-js/htmlLimitedBots
- https://nextjs.org/docs/app/api-reference/functions/generate-metadata#streaming-metadata

## 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.

- `js-dependency` Main content only appears after JavaScript runs — [geo/js-dependency](https://void-design.vercel.app/rules/geo/js-dependency)
- `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/hidden-streamed-content`
