offloadcms has one job that matters more than any other: take what's in the database and print it. Everything else — the admin UI, the importer, the provisioning wizard — exists to feed this one pipeline. Here's what actually happens when you hit "Publish."
1. Read the site from D1
Posts, pages, taxonomy, media references, and settings are assembled into one in-memory model of the whole site. Content itself is stored as TipTap JSON, not HTML — it's structured, so it can be rendered differently later without a migration.
2. Render each entry to static HTML
The renderer package serializes that TipTap JSON into HTML, then builds a complete <head> for the page: canonical URL, Open Graph tags, and JSON-LD. This step runs once per entry, not once per visitor.
3. Generate sitemap, robots, RSS, and search
A sitemap and an RSS feed get generated from the same site model, and robots.txt is written to explicitly allow the AI crawlers that most default WordPress configs never think about. A Pagefind index is built so the site keeps working search without a database to query.
4. Upload the bundle to Pages
The finished bundle ships straight to your Cloudflare Pages project's Direct Upload API — same Cloudflare account, no cross-account token to manage. A few seconds later the old version is gone and the new one is live at the edge.
None of these four steps run again until you publish again. That's the whole trick: the "server" for your public site is a build step you triggered once, not a process running forever. See the numbered version of this on the homepage, or read about migrating an existing WordPress site into this pipeline.