Mission Growth

Unrendered

A Chrome extension and an MCP server that compare a page's raw HTML with its rendered HTML, so you can see what AI crawlers that don't run JavaScript can read.

  • Free
  • Open source · AGPL-3.0
  • No data collected
The evidence

Do AI crawlers run JavaScript?

Vercel and MERJ measured AI crawler traffic in December 2024. The crawlers fetch pages at scale, and text that JavaScript adds is invisible to them.

0 of 5
AI crawler vendors tested that run JavaScript
OpenAI, Anthropic, Meta, ByteDance, Perplexity
569M
GPTBot fetches in one month
Vercel network, Dec 2024
23.84%
Claude fetches of JavaScript it never runs
Vercel and MERJ

What does a JavaScript-only page look like to them?

In this capture of the Duolingo homepage, 0% of the main content is in the raw HTML.

Every text block appears only after JavaScript runs, so a crawler that reads the raw HTML gets none of it.

Unrendered on the Duolingo homepage: 0% of the main content is in the raw HTML, and every text block is outlined as only in rendered HTML.
What it shows

What does the side panel show?

Click the icon on any page. Four tabs show the result.

Content

The share of the main content that is in the raw HTML, and every text block with its state. "Show on page" outlines each block in its state's colour.

In raw HTML
In the raw HTML.
Partly
Part is in the raw HTML, JavaScript adds or changes the rest.
Repeated or moved
In the raw HTML, at another position.
Varies per request
Only one of two raw responses had it.
Only in JSON-LD
Only inside JSON-LD structured data.
Only in hydration data
Only inside framework data, such as __NEXT_DATA__.
Only in rendered HTML
Appears only after JavaScript runs.
Unrendered side panel open next to an MDN article page: 76% of the main content is in the raw HTML, and the text blocks are outlined on the page by state.

Fields

Title, meta description, canonical, hreflang, html lang, robots meta tags and JSON-LD, in the raw HTML and in the rendered HTML.

It warns when the raw HTML says noindex and JavaScript removes it. It also lists links that exist only in the rendered HTML.

The Fields tab on the Duolingo homepage: the title is Duolingo in the raw HTML and longer after JavaScript runs, with both values side by side.

Bots

For 22 AI bot tokens: what robots.txt allows, and how the site answers a request with each bot's user-agent (same page, different page, challenge page, blocked, rate-limited or redirected).

17 are tested. Googlebot and Applebot run JavaScript and are not imitated. Google-Extended and Applebot-Extended never fetch pages. Claude-SearchBot has no verified user-agent string yet.

The Bots tab on The Guardian's Food page: ClaudeBot is blocked by robots.txt line 102 and the site answers it with HTTP 403.

Share

A 1200 × 630 image, a one-line summary and a Markdown report.

Download or copy the image, and copy the summary or the Markdown report.

The Share tab: a 1200 × 630 image preview, a one-line summary and buttons to copy the summary or the Markdown report.

How do you run it from Claude or Cursor?

The same analysis runs as an MCP server, so an assistant such as Claude or Cursor can check a page, or a list of URLs, for you.

It has two tools: analyze_page for the Content and Fields results, and check_ai_bots for the Bots result. Chrome runs on your machine, and the assistant gets the result, not the raw HTML. It needs Node 20 or later and Google Chrome.

Claude Code:

claude mcp add unrendered -- npx -y unrendered-mcp

Claude Desktop, Cursor and other MCP clients:

{
  "mcpServers": {
    "unrendered": {
      "command": "npx",
      "args": ["-y", "unrendered-mcp"]
    }
  }
}
How it works

How does Unrendered measure a page?

  1. After the click, the extension waits until the page has made no DOM changes for 1 s, for at most 8 s. Then it splits the rendered page into text blocks.
  2. The same tab fetches the URL again: twice without cookies, as a crawler would, and once with your cookies.
  3. Each rendered block is matched, in order, against the blocks of the first raw response. The second raw response separates text that changes on every request. The response with cookies is used only to tell you when the raw HTML has more text with your cookies.
  4. Main content is the page's <main> element. Without one, it is all text outside the header, navigation, sidebars, footer and dialogs. Hidden text is counted on its own and is not part of the percentages.

Text is compared as words, so symbols such as ⌘ are not counted.

What can Unrendered not tell you?

Not a crawler
Requests come from your browser and your IP. Sites that verify bots by IP may answer the real bot differently.
No percentage when the raw HTML is not the page
An error status, a challenge page from Cloudflare, AWS WAF or DataDome, or a redirect leaves nothing to compare.
No iframes
Text inside iframes is not included.
5 MB cap
Raw HTML over 5 MB is cut at 5 MB.
One width
The page is measured at one width. The side panel narrows it, which can change what is hidden.
Pages Chrome keeps closed
Chrome does not let extensions read its own pages, the Chrome Web Store or PDFs.

Privacy

Nothing is sent to Mission Growth or anyone else. No analytics, no accounts, no storage. Read the privacy policy.

Frequently asked questions about Unrendered

Do AI crawlers run JavaScript?

Vercel and MERJ measured AI crawler traffic in December 2024 and found that "none of the major AI crawlers currently render JavaScript". Text that JavaScript adds is invisible to them.

Is Unrendered free?

Yes. Unrendered is free and open source under the AGPL-3.0.

Does it send my data anywhere?

No. Nothing is sent to Mission Growth or anyone else. There are no analytics, no accounts and no storage. It requests pages only from the site you are analysing, and only when you ask.

Why do some pages get no percentage?

When the raw HTML is not the page, Unrendered shows no percentage, because there is nothing to compare. That happens with an error status, a challenge page from Cloudflare, AWS WAF or DataDome, or a redirect.

Which browsers does it support?

Unrendered is a Chrome extension and needs Chrome 124 or later.
Next step

Want similar results in your business?

Start with a free audit. See where the lift is before you commit.

How it works

  1. 01

    30-minute audit call

    We map your funnel against your goal and pull live data from your channels.

  2. 02

    Lift estimate

    You get a written estimate of where the lift is, with a 30-day plan to capture it.

  3. 03

    You decide

    Run it with us, run it in-house, or shelve it. No commitment from the audit.