SEO and GEO

Default EDS is lean. Crawlers need more.

EDS publishes semantic content HTML. Everything else is added by scripts.js and blocks in the browser, so the raw HTML a crawler receives is bare.

Why it matters

Two audiences, one gap.

SEO

Googlebot can render JavaScript, but rendering is queued and budgeted, and other engines render less. Anything that only exists after JS runs is indexed later, or only partly.

GEO

AI assistants retrieve and quote passages from pages. Many of their crawlers do not execute JavaScript. Content missing from raw HTML cannot be retrieved, cited or summarised.

The matrix

Gap by gap, what loom does.

Gap in default EDS

Why it matters for SEO

Why it matters for GEO

loom support

Status

Navigation and footer are fetched client-side, so raw header and footer are empty

Internal links and site structure are not seen on first crawl, which weakens crawl paths and link signals

The model gets no site context: sections, contact, legal, brand links

Nav and footer are rendered into the first response

Delivered

Blocks (accordions, tabs, product blocks) arrive as authored divs and are decorated in the browser

Visible content may be indexed late or incompletely

Passages inside a block may never reach the retrieval index

A block’s own decorate() runs at the edge for blocks that opt in with an .edge.js

Delivered, per block

Fragments are loaded client-side

Shared content is missing from the indexed page

Shared answers and facts are absent from the page the model reads

Inline fragments are resolved at the edge

Delivered

No structured data unless a site adds it with JS

Rich-result eligibility (FAQ, Product) depends on it

Explicit entities and question/answer pairs are the least ambiguous input for answer engines

One clean JSON-LD @graph from the rendered content. FAQ text is exactly the visible text

Delivered

<html lang> is not set by the boilerplate

Wrong or missing language signals hurt language targeting and hreflang correctness

Language and locale detection when retrieving and answering

Correct lang set at the edge

Delivered

Canonical is generated by EDS, but nothing checks it

Wrong canonicals cause duplicate-content and consolidation problems

Duplicate URLs split the citations a page could earn

A canonical check that warns and never rewrites

Delivered (check only)

No semantic elements from the pipeline (section, article, nav, table, details, figure)

Clearer structure helps parsers separate main content from boilerplate

Passage chunking is cleaner when sections, tables and Q&A are semantic elements

A block that emits these elements gets them in the raw HTML. loom does not add landmarks by itself

Possible per block or via a page hook, not shipped as a default

Per-page head enrichment (hreflang, more structured-data types, noindex rules)

Correct alternates and indexing control

Consistent signals across language variants

The page-hook mechanism can do this, but no hook is provided out of the box

Possible via site hook, not shipped

Side by side

Raw EDS versus loom-powered.

The same content, as the first HTTP response a crawler receives. Raw EDS is the *.aem.live origin. loom-powered is this site on loom.wefixyourproject.com.

Dimension

Raw EDS (*.aem.live)

loom-powered

SEO and GEO impact

Document language (<html lang>)

Missing: <html>

Set at the edge: <html lang="en">

Language targeting for search engines, screen readers and AI locale classification

Header and navigation

Empty <header></header>, filled later by client-side JS

Rendered at the edge: How it works, SEO and GEO, Edge vs publish, Proof, FAQ

Crawlability: crawlers that do not run JavaScript cannot discover internal links such as /proof on raw EDS

Footer and site architecture

Empty <footer></footer>

Rendered at the edge with link groups and the entity attribution (Valtech)

Sitewide link distribution, and clearer entity ownership for language models

Structured data (JSON-LD)

Not in the server response. Only present if a script adds it after load

Generated at the edge from the visible content into one clean @graph (for example FAQPage)

Rich-result eligibility, and deterministic machine-readable facts without JavaScript rendering

Interactive blocks (accordion, tabs)

Nested <div> tables, as authored, until JS decorates them

Blocks with an .edge.js run decorate() at the edge and output semantic HTML such as <details> and <summary>

Semantic elements help models tell prose from UI and read question and answer pairs. Blocks without an edge hook stay as authored

Time to first byte

About 0.09 s on a cache miss. Instant on a CDN hit

About 0.28 to 0.38 s on a cache miss. Same as plain EDS on a CDN hit

A small latency cost on uncached HTML. No change for cached pages or static assets

Honest limits

What loom does not fix.

Content that does not exist

loom makes existing content visible. It does not improve it, and it cannot add what was never authored.

Weak headings or copy

Structure and wording still decide how a page is read, indexed and quoted.

Blocks that import aem.js

They cannot run at the edge. loom leaves them as authored.

Honest status: the SEO and GEO effect described here is the expected mechanism. We have no before and after numbers yet.

Be the answer, not just a page.

Content unchanged. Authors unchanged. Crawlers and AI assistants finally read all of it.

Read the proof

Back to the overview