See your page the way a crawler does
Enter a URL. It is fetched once, the way a crawler fetches it — no JavaScript, no cookies — and you see what is actually in the HTML: the text in reading order, the headings, the links a crawler can follow and the tags a search result is built from.
Why look at a page without JavaScript
A browser runs the page's scripts before you see anything, so what you see is not what was sent. A crawler starts from what was sent. If the words, links and tags are in that first HTML response, every crawler reads them. If a script builds them afterwards, only a crawler that renders will — and later, if at all.
Who renders and who does not
- Googlebot renders JavaScript, but in a second pass: the HTML is crawled first and the page is queued for rendering. Content that only exists after rendering is indexed later, and a script that fails or times out leaves the page as this tool shows it.
- Bingbot renders too, with fewer resources to spend on it; Microsoft's own guidance is to serve the content in the HTML.
- AI crawlers — GPTBot, ClaudeBot, PerplexityBot and the like — fetch HTML and, by every public measurement so far, do not run JavaScript. A page that is empty here is empty to them.
- Link previews in Slack, Discord, X, LinkedIn and messaging apps read the Open Graph tags from the raw HTML and nothing else.
Reading the result
- Rendered by JavaScript — under 50 words next to an empty mount point such as
<div id="app"></div>or a<noscript>message. A single-page app without server-side rendering looks like this. - Thin — under 200 words with a script bundle on the page. Either the page really is short, or its shell is rendered on the server and its content fetched in the browser; the text below tells you which.
- In the HTML — the content arrived with the response. Check the outline and the text below it say what the page is about.
How to fix a page that is empty here
Render the content on the server: server-side rendering or static generation in Next.js, Nuxt, SvelteKit
or Astro, or plain server templates. Put the title, description, canonical and Open Graph tags in the
server response rather than setting them from a script, and make every navigation link a real
<a href>. Pre-rendering for bots only is a stopgap: two versions of a page drift apart.
What this tool does not do
It makes one GET request from our server, with no cookies, and reads at most
2 MB of HTML. It does not run
JavaScript, check robots.txt or fetch the page's CSS and images. A site that blocks data-centre
addresses or verifies crawlers by reverse DNS will answer differently than it does to the real crawler.
Only public addresses on ports 80 and 443 are fetched, and a result is cached for ten minutes.
The public pages of Bilis are plain server-rendered HTML for exactly this reason — run this tool on any of them.
More free tools
- Log volume & cost calculator Events per second to GB a day, a per-GB SaaS bill, and the disk the same logs need on your own box.
- Log levels, mapped Syslog, PSR-3, Python, Log4j, slog, pino, .NET and Ruby levels side by side, on the OpenTelemetry severity scale.
- Traceparent decoder Decode, validate or generate a W3C Trace Context traceparent header.
- Timestamp converter Unix seconds, milliseconds, microseconds and nanoseconds to dates and back — OTLP and ClickHouse formats included.
These tools are made by Bilis: self-hosted logs, traces and metrics that you and your coding agent read alike, stored on your own box in OpenTelemetry's formats. See what it does or read the docs.