Compare raw and rendered HTML
See which links, metadata, directives, and content appear only after JavaScript runs.
Free, no signup. Open the page in a browser and it looks complete; Google sees raw HTML first, then runs JavaScript and looks again — and those two views don't always agree. Test a public URL through the bounded rendering service to find where they diverge, with a side-by-side raw-vs-rendered diff.
Free, no sign-up. The page is rendered in headless Chrome only when the initial HTML looks incomplete — most server-rendered sites never need it.
Checks run from our server; we fetch the URL you enter and don't keep the results. Reports are kept 7 days so you can share a link to the result. Anonymous aggregate stats feed our research posts; domains are counted once via an anonymized hash and never stored in the clear. Anonymous run-level outcome counters may be used for aggregate research; URLs, domains, IPs, and identifiers are never included, and no statistic is released below 100 runs.
Say you test a product page whose server response is essentially an empty container — the real content is painted in by a client-side framework. The initial HTML the tool fetches looks like this:
<div id="root"></div>
<script src="/assets/app.4f2c.js"></script> …and the tool returns a verdict, a field comparison, and a flagged check:
Illustrative example — a live check renders the page in headless Chrome via this site's Browser Rendering binding, which this static page can't invoke; the verdict shape and thresholds shown match the real tool
React · rendered in 4.2s · probed 0 expanders
The initial HTML has 12 words; the rendered DOM has 1,840. Almost all of the page’s content and its 57 internal links depend on successful JavaScript rendering and are absent from the initial response.
1. Content arrives after an arbitrary timer or slow dependency.
<main id="product"></main>
<script>
setTimeout(async () => {
const product = await fetch('/api/product/42').then(r => r.json());
document.querySelector('#product').textContent = product.description;
}, 8000);
</script> There is no universal five-second Google rendering cutoff. The practical problem is that important copy now depends on an eight-second timer, a second request, and successful JavaScript execution. A bounded renderer may capture the empty state, while a different run may capture the completed state. Test repeatedly, inspect runtime errors, and move essential content into the initial HTML rather than tuning the timer.
2. Correct signals occur after the fetched response prefix.
<!-- 2,180,000 bytes of inline application state appear first -->
<link rel="canonical" href="https://example.com/products/trail-runner">
<main>Product copy, structured data, and internal links...</main> Google documents an approximately 2 MB fetch limit for supported non-PDF files. If oversized inline state pushes the canonical, main copy, structured data, or links beyond that boundary, those signals can be correct in View Source and still fall outside what Googlebot fetched. This tool treats truncated acquisition as not evaluated, not as proof that a missing signal does not exist. Reduce the response and keep critical markup early.
+ saves the current site or page. Use ☆ beside any saved site, page, or list to favorite it. Recent check history appears below.
Target filled from your local choices.
Saved targets, named lists, and recent check summaries remain only in this browser.
This is a fast, directional check. For anything that affects indexing, confirm it in Google Search Console's URL Inspection tool — that's Google's own renderer and the real source of truth.
Google can process JavaScript in a rendering phase after crawling. Content that appears only after rendering depends on that phase and is absent from the initial response; this comparison does not predict discovery or indexing timing.
If a noindex appears in either the raw or rendered HTML, Google may use it — and an initial-HTML noindex may cause Google to skip rendering, so JavaScript cannot reliably undo it.
JavaScript may add a canonical when the raw HTML has none, or keep the same value. A different or additional value creates competing canonical input.
Checks based on the JavaScript SEO guide on Ahrefs. Confirm findings in Search Console.
The verdict banner rolls the whole test into one of three levels:
noindex, a canonical conflict, or
blocked resources.Each individual check carries a severity badge:
In the comparison table, a row tinted amber with a changed flag means that field—title, meta description, canonical, robots, word count, links, H1s, images without alt, structured-data blocks, or hreflang—is not the same in the initial HTML as in the rendered DOM.
A small Worker endpoint fetches your page’s raw HTML and its robots.txt.
Only when that initial HTML looks incomplete does it render the page in headless
Chrome (behind a cost ledger; a skipped render means the raw heuristic found substantial content, not that SSR or parity was proved).
It returns both HTML versions to your browser.
Everything analytical then runs client-side. Each HTML version is parsed with an inert
DOMParser (scripts in the fetched HTML never execute), reduced to a snapshot of
the fields that matter, and run through roughly fifteen calibrated JS-SEO checks. The tool
detects the framework, builds the verdict, and produces the line-by-line raw-vs-rendered diff
you see in the second tab. No sign-in, and reports are stored for seven days only for sharing.
robots.txt blocks the JavaScript or CSS Google needs
to render the page.This is a fast, directional check — not Google’s renderer. Its headless Chrome is not the exact evergreen build Google uses, timing and network conditions differ, and it renders one page at a time. It will not click through complex interactions beyond probing common content expanders, and very large pages are truncated for analysis. When the initial HTML already looks complete, no render runs, so there is nothing to diff. For any finding that affects whether a URL is actually indexed, confirm it in Google Search Console’s URL Inspection tool, which runs Google’s own renderer on your verified property.
The render gap is the difference between what a page contains in its raw, server-delivered HTML and what it contains after the browser runs JavaScript and builds the final DOM. Google can process JavaScript in a rendering phase after crawling. Anything that appears only after JavaScript runs depends on successful rendering and is absent from the initial response. This tool measures that dependency; it does not predict when Google will discover or index the content.
Yes. Google renders pages with an evergreen Chromium, so client-side content can be indexed. Rendering is a separate processing phaseTurning HTML, CSS, and JavaScript into the final visual page and DOM., and blocked resources or JavaScript errors can prevent content from appearing in rendered HTML. Google Search does not interact with a page to load content, so content that requires an interaction must already be present in rendered HTML to be available. Putting critical content and tags in the server response removes that rendering dependency.
Headless Chrome runs only when a bounded heuristic says the initial HTML looks incomplete. Substantial raw titles, links, and body text can make the tool skip rendering, but that does not prove the framework is server-rendered or that JavaScript would add nothing. A skipped run gives an initial-HTML analysis without a rendered parity comparison.
Google may skip rendering after it sees noindexNoindex is a directive that tells search engines to keep a page out of their index, so it won't appear in search results. It works only on pages a crawler can actually fetch — a page blocked in robots.txt can never be noindexed. in the initial HTML, so JavaScript cannot reliably remove that directive later; rendered-only noindex can also be used. For canonicals, JavaScript may add one when the initial HTML has none, and setting the same value is okay. Changing it to a different value or leaving multiple values creates risky competing input.
No, and it is not meant to replace it. This is a fast, directional comparison. Search Console’s URL Inspection toolA Google Search Console feature that reports how Google sees one specific URL on a property you own. By default it shows the last-indexed snapshot; a separate "Test live URL" mode fetches the current version. provides Google-specific crawl, indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed., and live-test evidence for a verified property, but neither tool guarantees how a URL will be processed on a later crawl.
Upvote what you want most. New ideas can be submitted from the floating Feedback menu; requests appear here once approved, and the most-wanted rise to the top.
You won't be emailed about that request anymore.
Loading…
New requests are reviewed before they appear here.
Where this tool helps
See which links, metadata, directives, and content appear only after JavaScript runs.
Review calibrated checks for changed canonicals, noindex, robots blocking, link loss, and soft-404 signals.
Use the observed HTML differences to classify the page as server-rendered, prerendered, client-rendered, or hybrid.
Rerun the page after deployment and confirm that important search signals are present in the intended HTML state.
Watch the full workflow
A page can look complete in your browser while its first H-T-M-L response is nearly empty. I’ll show you when this matters, how the check works, how to read the comparison, its main features and limits, and what to verify next.
The render gap is the difference between the server-delivered initial H-T-M-L and the document after JavaScript runs. Search engines can render JavaScript, but content that exists only afterward depends on that extra phase, its resources, timing, and successful execution. This checker measures the dependency; it does not predict indexing.
Use it on JavaScript-heavy product, category, article, or application pages; after a framework migration; when view source looks thin; when titles or canonicals appear to change; or when important internal links seem absent to non-rendering crawlers. Choose the exact affected template, not only the homepage.
Paste one complete public U-R-L and clear the anti-abuse check before selecting "Test page". The service fetches raw H-T-M-L first and uses headless Chrome only when a bounded heuristic says that response looks incomplete. A skipped render is not proof that the page uses server-side rendering or has perfect parity.
The illustrative result begins with a red verdict: key content is missing until JavaScript runs. The meta line reports the detected framework and render timing. This sample matches the real result shape and thresholds, but it is teaching data, not a live accusation about the example domain.
Now compare the two columns. Initial H-T-M-L contains no title, twelve words, and zero links. After JavaScript, the rendered document has a product title, one thousand eight hundred forty words, and fifty-seven links. Every changed row shows which search evidence depends on rendering rather than the first response.
The error translates that gap into plain language: almost all body content and internal links appear only after rendering. The durable repair is usually to ship essential content in the initial H-T-M-L through server rendering or pre-rendering, then confirm that the browser still hydrates without changing the critical signals.
A green verdict means the initial response already contains the important evidence measured here. Amber means the page leans on rendering or changes a meaningful field. Red marks a stronger indexing risk such as an empty shell, noindex conflict, canonical conflict, or blocked resource. Always read the individual checks instead of acting on color alone.
The first less-obvious case waits on an arbitrary timer and another request before adding product copy. There is no universal five-second Google cutoff. The real issue is instability: different render conditions can capture different states. Move essential content into the first response and inspect runtime failures rather than tuning a guessed timer.
The other case places a canonical and main content after more than two megabytes of inline state. Oversized responses can put correct markup beyond a crawler fetch boundary. When acquisition is truncated, this tool reports not evaluated instead of claiming absence. Reduce the response and keep critical markup early.
The main features include a ten-field side-by-side comparison, about fifteen calibrated checks grouped by severity, a line-by-line raw-versus-rendered diff, framework detection, robots-aware resource checks, shareable seven-day reports, developer-ticket and evidence exports, rendered-schema handoff, and local baseline comparison. Each feature preserves the observed evidence behind the conclusion.
This is a fast directional check, not Google’s renderer. Browser versions, timing, network conditions, cookies, location, and interactions can differ. It checks one page, probes only common expanders, truncates very large inputs, and cannot prove discovery, crawl frequency, indexing, canonical selection, or ranking. A blocked or unavailable render is incomplete evidence, not a pass.
Save the tested U-R-L, time, acquisition state, verdict, changed fields, runtime evidence, and exported tickets. Reproduce important gaps in browser developer tools, inspect server output and logs, fix the responsible template or delivery layer, and rerun. Then use Search Console U-R-L Inspection for Google-specific crawl, render, indexing, and canonical evidence.
Test a representative public page, move essential titles, copy, links, and directives into reliable server output, and rerun the comparison. Finish with Search Console, browser diagnostics, logs, and the people who own the application and infrastructure.