View source is empty. Here's what that does — and doesn't — mean.
You looked at your page's source and found a div, a handful of script tags, and nothing else — no text, no links, none of the page you can plainly see in the browser. The page isn't broken. It's telling you, accurately, where it gets rendered.
View source and Inspect Element are different artifacts
This distinction resolves most of the confusion behind this search, in both directions. View source shows the response body the server sent — frozen, pre-JavaScript. Inspect Element shows the live DOM — the result after JavaScript has run, and it keeps changing as scripts do.
So: a rich Elements panel does not mean crawlers see your content — they read the response first, the way view source does. And an empty view source does not mean your site is broken for users — their browsers run the JavaScript happily. The two views answer different questions, and SEO questions are answered by the first one.
Whose shell is it? Reading the signature
The empty container isn't anonymous — it names the framework, which tells you which fix path exists:
The last two rows matter: an emptyshell from a framework that server-renders by default isn't a rendering-strategy problem — it's a configuration or build problem, and it's usually a faster fix.
When an empty source is completely fine
The pages that do need a real source: marketing pages, articles and docs, product and category pages, anything you want quoted by AI engines — and any page whose links lead to those, because links that exist only in the DOM are links crawlers never find.
Measure the gap instead of eyeballing it
Two reasons not to trust the eyeball test. Some sites serve crawlers different HTML than browsers, so yourview source may not be what Googlebot gets. And some "empty" sources aren't — the content is present but embedded as JSON inside a script tag, which changes the diagnosis entirely.
Reading the result
What to do about it
Six steps — the first three are triage, and step three is the one people skip: deciding whether this page needs fixing at all.
For the remediation itself, go to the page for your stack — the causes and fixes are framework-specific and covered in depth there: React for shell-shipping SPAs, Next.js when a server-rendering framework is producing thin output anyway.
The special case: content hiding in script tags
Sometimes a "mostly empty" source contains one enormous script tag full of JSON — __NEXT_DATA__, Nuxt's payload, Redux state, Apollo cache. Your content is technically in the response, but as data, not as HTML. Search engines index rendered HTML, not serialized state; treat data-only responses as unrendered content, not as a loophole. The presence of a big payload plus empty markup usually means the framework could render on the server and is configured not to — which is good news, because configuration fixes are cheaper than migrations.
Common questions
Because the server sends a minimal HTML shell and JavaScript constructs the visible page in the browser. View source shows that initial shell; the working page you see is the result of the scripts running afterwards. Nothing is broken — the page is simply rendered on the client, which only becomes a problem for pages that need to be indexed.