Most modern CMS themes ship a server response that's mostly empty — a shell <div id="root"></div> that only fills in once JavaScript runs. That's fine for a browser. It's a dead end for a crawler that fetches the HTML once and never executes a script.
That distinction didn't matter much when the only crawlers you cared about were search engines, and search engines eventually got good at rendering JavaScript. It matters again now. GPTBot, Anthropic's ClaudeBot, and PerplexityBot are, by their own published behavior, primarily plain HTTP fetchers — no headless browser, no JS execution budget per page. A site that depends on hydration to show its content is invisible to them, no matter how good the writing is.
The fix isn't a "use static site generator" slogan
It's a specific claim about where rendering happens. offloadcms reads a site's content once from D1 and prints every entry to flat HTML at publish time — not at request time. There is no template renderer sitting behind the public URL waiting to assemble a page; the page is already assembled, sitting in Cloudflare Pages as a file.
That has a side effect that matters for the same reason: the structured data a crawler actually reads is baked into that same file. Every entry gets a <script type="application/ld+json"> block describing what it is — an article, a product, an FAQ — instead of leaving a crawler to guess from prose.
<script type="application/ld+json">
{
"@type": "BlogPosting",
"headline": "Hello world",
"datePublished": "2026-06-30",
"author": { "@type": "Person", "name": "Editor" }
}
</script>
Fast for people, legible for machines
The nice part is that the same decision that makes a page legible to a crawler also makes it fast for a human: no database query per request, no PHP execution, no cold cache after a deploy. It's one artifact, served from the edge, read the same way by a browser and a bot.
If you're deciding whether an existing WordPress site is worth migrating, this is usually the deciding factor: not the hosting bill, but whether the content is readable by the tools that increasingly stand between your writing and the person who wanted to read it. See how the migration works or read how the publish pipeline turns D1 rows into that HTML.