Performance Auditor — renders the audited page in a headless Chromium twice, with JavaScript enabled and disabled, and compares the size of the two documents to tell server-side rendering (SSR) from client-side rendering (CSR).
Discoverability
Content that only exists after JavaScript runs is invisible to crawlers, AI assistants and link previews that do not execute scripts.
Perceived speed
A server-rendered page shows its content as soon as the HTML arrives; a client-rendered one shows nothing until its scripts download, parse and run.
How it works
- Render with JavaScript — loads the audited URL as 37AuditsBot in a headless Chromium with JavaScript enabled, waits for the network to go idle plus a short grace period, and keeps the rendered HTML. A blocked navigation (HTTP 403, HTTP 429 or a Cloudflare challenge) ends the audit with
590; no response, or an HTTP status of 400 or more, ends it with500. A browser error, after one relaunch on a crash, ends it with501. - Render without JavaScript — loads the same URL in a second context with JavaScript disabled and keeps that HTML too.
- Compare — computes the size difference ratio
|sizeWithJs − sizeWithoutJs| / max(sizeWithJs, sizeWithoutJs)(two empty documents count as no difference). - Rules — a ratio above 20% warns (
300): the content is built in the browser. A ratio of 20% or less isSUCCESS(200): the content is delivered by the server. The message of either outcome gives both sizes and the ratio.
What it audits
Every row maps to onecheckRule* method and one CheckCode, in the order the auditor runs them. CheckCode suffixes use status ranges: 200 success, 300–399 warning, 500–599 error.
Output documentation
Every
SUCCESS and WARNING check carries the measured values in data: sizeWithJs, sizeWithoutJs, sizeDifference (characters), ratio, threshold (0.2) and isCsr.
Risks and considerations
Why rendering strategy matters
- Search engines do render JavaScript, but later and with a smaller budget than plain HTML; client-rendered pages are often indexed days after server-rendered ones, or with missing content when a script fails.
- Many AI crawlers, link unfurlers (chat apps, social networks) and accessibility tools read the raw HTML only. A client-rendered page gives them an empty shell.
- Visitors on slow networks or devices wait for every script before the first content appears, which raises Largest Contentful Paint and bounce rates.
A size heuristic, not a framework detector
- The auditor compares the size of the two rendered documents, nothing else. A page whose scripts add a cookie banner, a chat widget or large tracking markup can cross the 20% threshold while its main content is server-rendered; a client-rendered page that replaces a large placeholder with content of a similar size can stay under it.
- The threshold is a fixed constant (20%) and is not configurable.
- Both renders wait for the network to go idle plus 1.5 seconds; content loaded after that, on scroll or on interaction, is not counted.
Changes from the previous version of this auditor
- A page whose JavaScript-enabled navigation answers with an HTTP status of 400 or more is no longer rendered and compared as if it were the site: the audit ends with
ERROR500. - A browser failure that survives the one relaunch is reported as
ERROR501with that code, instead of an error check without a code. - The verdict thresholds are unchanged: a size difference above 20% still warns, 20% or less still succeeds.
What this auditor does not check
- Whether the server-rendered HTML is also correct, complete or hydrated without errors.
- Pages beyond the audited URL; a site can mix strategies per route.
- Which framework or rendering mode (SSR, SSG, ISR, streaming) the site uses.