# SEO and plugin contracts

## Responsibilities

The theme defines content, semantic HTML and presentation. GrowSite controls plugin access, public data, form submissions and the HTML document. Do not add a custom comment submission script, a second form handler or a manual `head` inside a Loom section.

| Feature | Identifier | Requirements |
| --- | --- | --- |
| Blog | `blog` | Workspace plugin and theme blog support |
| Comments | `comments` | Blog, active Comments and permission on the post |
| Contact form | `contact-form` | Plugin and an active instance belonging to the site |
| Basic SEO | `seo.core` | Built into GrowSite |
| SEO Pro | `seo-pro` | Workspace access to Pro features |

## Basic SEO

Set the page title, description, sharing image and indexing in the panel. Without a custom title, GrowSite combines the page title and site name. Default descriptions come from content or site configuration. For predictable results on important pages, enter a specific description.

Page SEO data includes `title`, `description`, `og_image`, `canonical`, `index`. These are not automatically `section.settings`: adding a Loom setting named `seo_title` does not change document metadata. The backend generates title, description, canonical, robots and sharing metadata, and the renderer puts them into the document. Canonical URLs must belong to the correct site domain. Drafts should not be indexed.

## SEO Pro

SEO Pro provides `seo.advanced`, `seo.audit`, `seo.redirects`, `seo.monitor`. The backend decides access from the workspace plugin. A theme cannot activate these through schema, and must not hide ordinary content when Pro is disabled. Basic SEO remains available. Manage audit results and redirects through the panel, not Loom files.

## Blog and forms

For an article, GrowSite reads post SEO, sets a canonical containing `?post=slug` and uses the `article` sharing type. See [Blog](/en/blog/) for page roles. The article title should be the main heading; do not wrap the ready-made article component with a second H1.

Embed contact forms through `gs-form` or a canvas form element. Instance IDs belong to a specific site; foreign or inactive instances must not work. See [Forms](/en/forms/) for exact field configuration and request data.

## Final checks

Inspect the rendered document source: one title, the expected description, the correct canonical domain and no draft indexing. Check image ALT text and a logical H1/H2 hierarchy. Test enabled and disabled plugins. SEO Pro must not be required for ordinary links, text, forms or menus. Never put private API keys in theme assets or package settings.
