Problem
The admin exposes a full SEO panel (SEO title, meta description, OG image, canonical URL, "hide from search engines"/noindex). Content editors fill it in expecting it to take effect.
But these fields live on entry.data.seo and have no effect unless the page template explicitly calls getSeoMeta (or getContentSeo). A site author who hand-rolls a collection detail page like:
<title>{entry.data.title}</title>
<meta name="description" content={entry.data.excerpt} />
silently bypasses the entire panel — including the noindex toggle, which is an indexing/correctness risk, not just cosmetic.
Why it's a trap
- The breakage is invisible: no error, no warning — the panel just does nothing.
- The editor and the developer are often different people; the editor has no way to know the field is dead.
- The docs (
skills/building-emdash-site/references/site-features.md) only show getSeoMeta for a posts page and never state that every content detail page must wire it or the panel is inert.
I hit this on a real site: only the scaffolded posts page used getSeoMeta; four hand-written collection pages (albums, interviews, covers, collabs) ignored the panel entirely. Editors had filled SEO titles/descriptions that were never rendered, and the noindex toggle did nothing.
Suggestions (any of)
- Docs: add a prominent gotcha in
site-features.md — "the SEO panel is only honored if your page calls getSeoMeta; hand-written title/description bypass it silently." (Happy to PR this — see below.)
- Ergonomic helper: a
<SeoHead entry={...} defaults={{ title, description, image }} /> component, or let getSeoMeta accept defaultTitle/defaultDescription. Today its only fallbacks are data.title/data.excerpt, so authors with computed titles (e.g. "Maeta — {title} (cover of {artist})") must drop down to getContentSeo and merge panel-vs-default by hand.
- Dev-mode warning: when an entry has non-empty
data.seo fields but the rendered page never read them, log a warning in dev.
Environment
- emdash (current
main), Astro + Cloudflare Workers template.
Problem
The admin exposes a full SEO panel (SEO title, meta description, OG image, canonical URL, "hide from search engines"/noindex). Content editors fill it in expecting it to take effect.
But these fields live on
entry.data.seoand have no effect unless the page template explicitly callsgetSeoMeta(orgetContentSeo). A site author who hand-rolls a collection detail page like:silently bypasses the entire panel — including the
noindextoggle, which is an indexing/correctness risk, not just cosmetic.Why it's a trap
skills/building-emdash-site/references/site-features.md) only showgetSeoMetafor apostspage and never state that every content detail page must wire it or the panel is inert.I hit this on a real site: only the scaffolded
postspage usedgetSeoMeta; four hand-written collection pages (albums, interviews, covers, collabs) ignored the panel entirely. Editors had filled SEO titles/descriptions that were never rendered, and thenoindextoggle did nothing.Suggestions (any of)
site-features.md— "the SEO panel is only honored if your page callsgetSeoMeta; hand-writtentitle/descriptionbypass it silently." (Happy to PR this — see below.)<SeoHead entry={...} defaults={{ title, description, image }} />component, or letgetSeoMetaacceptdefaultTitle/defaultDescription. Today its only fallbacks aredata.title/data.excerpt, so authors with computed titles (e.g."Maeta — {title} (cover of {artist})") must drop down togetContentSeoand merge panel-vs-default by hand.data.seofields but the rendered page never read them, log a warning in dev.Environment
main), Astro + Cloudflare Workers template.