---
title: "Send the content in the HTML · Agent Wranglers"
url: https://agentwranglers.se/playbook/seo/crawling-and-indexing/server-side-rendering
id: SEO-6
level: Recommended
updated: 2026-10-22
tokens: 792
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Send the content in the HTML

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Crawling and indexing](https://agentwranglers.se/playbook/seo/crawling-and-indexing.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers.md). Updated 2026-10-22.

- ID: SEO-6
- Level: Recommended
- Chapter: [Crawling and indexing](https://agentwranglers.se/playbook/seo/crawling-and-indexing.md)
- Rule: Put each page's content, metadata, links and structured data in the HTML the server sends. Don't leave them to JavaScript to build later.
- Check: For every page type, a test fetches the HTML without running scripts, for example with `curl -s URL`. It finds the `h1` text, the canonical, the JSON-LD and the main links. The page also works with JavaScript off.
- How: Render pages on the server or at build time (static generation). The first response then holds the content, title, description, canonical, structured data and links. Let JavaScript add behaviour only. Add behaviour on top as [Build on HTML that already works](https://agentwranglers.se/playbook/website/site-architecture/progressive-enhancement.md) says.
- Measured: On a reference site, we built the same content in the browser instead of the HTML. Mobile Performance dropped from 99 to 85, and layout shift rose from 0 to 0.295.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### HTML example

```html
<!-- Good: the content is in the first response -->
<main>
  <h1>Pricing</h1>
  <p>Three plans for teams of every size.</p>
</main>

<!-- Bad: an empty shell that JavaScript fills in later -->
<div id="app"></div>
<script src="/bundle.js"></script>
```

## Sources

- [Google Search Central – JavaScript SEO basics](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)

## Related rules

- WEB-6 [Give every page its own title](https://agentwranglers.se/playbook/website/html-basics/title.md) in Website
- STK-19 [Use Next.js when React pages need a server](https://agentwranglers.se/playbook/stack/web-frameworks/nextjs.md) in Software choices
- WEB-19 [Build on HTML that already works](https://agentwranglers.se/playbook/website/site-architecture/progressive-enhancement.md) in Website

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/seo/crawling-and-indexing/server-side-rendering">Agent Wranglers SEO playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Split sitemaps only when huge](https://agentwranglers.se/playbook/seo/crawling-and-indexing/sitemap-index.md)
- Next: [Serve phones the same content](https://agentwranglers.se/playbook/seo/crawling-and-indexing/mobile-first-indexing.md)
- [Crawling and indexing](https://agentwranglers.se/playbook/seo/crawling-and-indexing.md)
