Site Builder: Overview

Site Builder Overview

Three builders decide what a visitor sees, and they all speak the same language: blocks.

        ┌──────────────── Header Builder ────────────────┐
        │  topbar · logo · navigation · search · actions  │
        └────────────────────────────────────────────────┘
        ┌──────────────── Page Builder ──────────────────┐
        │  slider · banner · features · products · CTA …  │
        │  (one page = an ordered bundle of blocks)       │
        └────────────────────────────────────────────────┘
        ┌──────────────── Footer Builder ────────────────┐
        │  brand · menu columns · newsletter · legal …    │
        └────────────────────────────────────────────────┘
                              ▲
                   ┌──────────┴──────────┐
                   │  Template Library   │
                   │ pages · blocks ·    │
                   │ header · footer     │
                   └─────────────────────┘

Why they are separate builders

Page content and site chrome look similar but behave differently. Chrome appears on every page, must load fast, and contains live functionality (navigation, search, cart). Page content is per-URL and mostly editorial. So chrome gets its own storage and its own cached delivery, while pages get the full block editor. Both use the same block JSON, which is what lets one template library serve all of them.

This mirrors how other mature systems split it — WordPress calls chrome "template parts", Shopify calls it "section groups". Nobody renders the header through the page engine.

Where to find each one

Builder Where
Page Builder Content → Pages → Create / Edit
Header Builder Content → Menus → Header Builder
Footer Builder Content → Menus → Footer Builder
Template Library The Templates & blocks button in the page editor
Email Templates CRM → Engagement → Templates

Performance model

Header and footer are fetched by the storefront in one cached request (GET /public/site-chrome), started by a <link rel="preload"> in the page shell. On a warm cache that request costs zero database queries, and the request is cached in the browser tab for the session, so moving between pages never refetches it. Nothing chrome-related runs inside the page request, so first paint is never blocked — skeletons hold the layout until the payload lands.

Last updated: 8/11/2026