Skip to content

Content and grounding

The full page build's Content step decides what the copy is made of:

  • AI copy — written for the page.
  • Placeholder — structure now, words later.
  • Site name & tagline — the safest real-content source.

Grounding goes further: pick published pages as reference material and the build uses their actual text and images. The picker searches your pages, and one tap adds the page you are editing.

Two things worth knowing about grounding:

  • The client sends only references, never content. The server resolves them, so grounding stays server-authoritative.
  • Grounded material is framed to the model explicitly as data, not instructions, so nothing a referenced page happens to say can redirect the build.

Images are found by walking entity reference fields down to a media entity with a populated image field. A plain image field directly on the node, or a media item only embedded inline in a text field, is not visible to that walk.

Where the AI can put an image

Two places, and the difference matters:

  • A component's own image prop — a card's picture, a split band's media column. The model writes the url into inputs; an object-typed prop takes {"src": "<url>"}.
  • Any component's background — the background_image style. This is what lets a plain Section become a full-bleed banner without depending on a hero component being installed, so a cinematic opening is composed from Section + background image + overlay tint + a text component rather than from one big SDC. The model is told to always pair it with the overlay tint, because that is what keeps a headline readable over a photograph.

Background video works the same way, grounded through the same stock provider as images — with one restriction: at most one clip per build, since a page with video everywhere is worse than one with none. The model is told to use it in only one of two places: a background_video style on a full-height opening band with little text over it, or the video prop of a component built to show video. Either way it always pairs with an overlay tint, same as an image background. Of the two stock providers, only Pexels serves video — Unsplash is image-only — so a video clip only ever shows up once a Pexels key is configured.

A build only ever places images the server handed it in that section's AVAILABLE IMAGES block, and no image appears in more than one section of a page — the per-build ledger excludes anything an earlier section already took, and the stock provider is paged deeper to keep later sections supplied.

Stock photo providers

Real photography comes from a pluggable provider subsystem. Unsplash and Pexels ship with the module; each stays inactive until you add its API key on the AI settings page, and with none configured a build simply gets no AVAILABLE IMAGES block rather than failing.

The model never talks to a provider. The server searches, picks candidates for the section it is about to build, and hands over a fixed list — which is what makes the "only places images the server handed it" rule enforceable rather than a request in the prompt.

Adding another source is a plugin: extend StockPhotoProviderBase, declare the credentials it needs, and it appears alongside the shipped two.