SEO and discovery
Apply Core's search, metadata, structured-data, and discovery contracts.
- Owner
- Foundry Core
- Source
core/docs/SEO.md- Ref
v0.1.21- Policy
- release-bound
Component pins for v0.2.5
| Component | Role | Version |
|---|---|---|
| core | runtime | v0.1.21 |
| theme-shield | theme | v0.1.15 |
| starter | reference | v0.1.3 |
| docs | reference | v0.1.4 |
| distribution | tooling | v0.3.3 |
| restricted-component-1 | consumer-reference | v0.1.10 |
| restricted-component-2 | consumer-reference | v1.1.21 |
Foundry now emits shared SEO from partial "foundry/seo/render.html" ..
Downstream themes should call that partial from baseof.html, not from a site overrideable head-end.html file. This keeps canonical tags, alternates, metadata, and schema from drifting between core, theme, and project repos.
What core renders
- Canonical URL
- Meta description
- Robots and googlebot tags when
robots,noindex, orprivateare set - Open Graph and Twitter metadata
hreflangalternate links for multilingual pages- JSON-LD for:
WebSiteWebPageorCollectionPageMedicalWebPagefor medical treatment/article pages when the site declares a medical local businessBreadcrumbListBlogPostingServicePersonFAQPage- optional
Organization/LocalBusiness
Theme responsibility
Theme head-end.html files should only add theme or brand assets such as:
- dark-mode anti-flash scripts
- theme CSS bundles
- favicons
- theme color
- project-specific preconnects
Shared SEO should not be reimplemented there.
Site config fields
Supported site params:
params:
description: "Site-wide fallback description"
og_image: "/images/og-default.jpg"
social:
instagram: "https://instagram.com/example"
facebook: "https://facebook.com/example"
contact:
phone: "(555) 555-5555"
email: "info@example.com"
hours: "By appointment only"
seo:
author: "Site Author"
reviewed_by_default: "author-key"
twitter_handle: "@example"
og_image_default: "/images/og-default.jpg"
organization:
name: "Example Company"
logo: "/images/logo.png"
same_as:
- "https://linkedin.com/company/example"
local_business:
types:
- "LocalBusiness"
name: "Example Company"
price_range: "$$"
address:
street_address: "123 Main St"
city: "Anywhere"
region: "CA"
postal_code: "90210"
country: "US"
Supported page params:
canonical: "https://example.com/custom-url/"
robots: "noindex,nofollow"
noindex: true
author: "author-key"
author_name: "Author Name"
author_role: "Medical Reviewer"
reviewed_by: "reviewer-key"
reviewed_at: 2026-03-04
seo:
person:
key: "author-key"
service:
type: "Service"
service_type: "Primary service label"
Robots
Set enableRobotsTXT: true in each downstream site config. Shield and restricted proof consumer theme repos expose layouts/robots.txt wrappers that call the shared Foundry robots partial.
Projects with their own custom base layout and no theme layouts/robots.txt wrapper should add a local layouts/robots.txt file that calls:
{{ partial "foundry/seo/robots.txt" . }}