301→302301→302
A temporary redirect where a permanent one belongs.
Found by Redirect checker →
redirect loopredirect loop
The URL redirects back to itself and never settles.
Found by Redirect checker →
Crawling

JavaScript rendering crawler

Optional JavaScript crawling renders pages in Chromium through Playwright and keeps the raw and the rendered DOM side by side, so you can see what only exists after scripts run.

JavaScript rendering crawler

Raw versus rendered

render-check and rendered crawls compare the HTML the server sent with the DOM after rendering: titles, canonicals, links and content that appear or disappear.

  • Rendered routes and observed navigation
  • Lab timings, not field Core Web Vitals
JavaScript rendering crawler

Only when you need it

The browser is an optional extra (the render group, about 150 MB for Chromium). The core crawl works without it.

  • pip install -e ".[render]"
  • python -m playwright install chromium
How it works

Three steps, one saved scan

  1. Fetch the raw HTML and the rendered DOM

    render-check loads the URL twice: once as the server sends it, and once in Chromium through Playwright after scripts run.

  2. Compare what only appears after scripts

    The comparison counts words and links that exist only after rendering, and flags an empty app shell such as a bare #root or #app mount point.

  3. Read console errors and lab timings

    Script errors logged during the render are reported as JS_CONSOLE_ERRORS. Timings come from one local run and are lab data, not field Core Web Vitals.

What it checks

Checks in this feature

CheckWhat it meansSeverityEvidence
JS_CONSOLE_ERRORSThe page logged JavaScript errors in the browser console while it was renderedImportantConsole error text from the rendered run
ROBOTS_BLOCKS_RESOURCESrobots.txt blocks .js, .css or _next/static files that rendering needsTiprobots.txt rule that matches the resource path (from robots-check)
AJAX_CRAWLING_SCHEME_URLA page or a link it carries uses the deprecated #! or _escaped_fragment_ AJAX schemeTipThe URL that uses the scheme
How to run it

One command

bash
seohead render-check --url https://example.com/

Install first: installation guide. Every command also runs as an MCP tool for AI agents.

Related checks

From the check registry

ROBOTS_BLOCKS_RESOURCESAJAX_CRAWLING_SCHEME_URL
FAQ

Questions

JavaScript rendering crawler
No. The core crawl works without it. Chromium is an optional extra for render-check and rendered crawls: pip install -e ".[render]", then python -m playwright install chromium (about 150 MB).
No. It sends bounded, read-only requests to the URL you give it. Nothing on the site is edited.
No. LCP, CLS and timings come from one run on one machine. They are lab measurements, not field data from the Chrome UX Report.
Yes. Add --viewport mobile to use the built-in smartphone identity and viewport. Use --user-agent for a custom identity.
Use --wait domcontentloaded. The default is load. networkidle can never occur on sites with persistent connections, so avoid it there.

Check your redirects locally