SEO & Metadados
O Seed gera automaticamente canonical, Open Graph, Twitter Cards, hreflang e JSON-LD (Article, WebSite, Person, BreadcrumbList, FAQPage, HowTo) a partir do front matter e do seed.yaml — sem componentes visuais, tudo no <head>.
Canonical e og:url
Todo build com url: configurado no seed.yaml gera <link rel="canonical"> e <meta property="og:url"> a partir da mesma URL final da página — os dois nunca divergem.
```html <link rel="canonical" href="https://meusite.com/blog/meu-post.html"> <meta property="og:url" content="https://meusite.com/blog/meu-post.html"> ```
Open Graph e Twitter Cards
Gerados automaticamente a partir de title, description, image e do seed.yaml:
| Tag | Origem |
|---|---|
og:title / twitter:title | title da página |
og:description / twitter:description | og_description (se definido) ou description |
og:image / twitter:image | image da página → primeira imagem do conteúdo → image global do seed.yaml |
og:image:alt | image_alt (ou alt, ou title) — mesma lógica para twitter:image:alt |
og:image:width / og:image:height | image_width / image_height, quando definidos — o Seed nunca baixa a imagem só para descobrir as dimensões |
og:site_name | title do seed.yaml |
og:locale | lang (da página ou global), convertido de BCP47 para o formato Open Graph — pt-BR → pt_BR |
og:type | article quando a página tem publish_date, senão website. Sobrescreva com og_type: |
twitter:card | summary_large_image quando há imagem, senão summary |
twitter:site | Derivado de uma URL x.com/twitter.com em person.sameAs (seed.yaml) — sem configuração extra |
Para og:type: article, o Seed também emite article:published_time e article:modified_time — mas só quando o campo de data tem horário explícito (publish_date: 2026-08-20 09:30, não publish_date: 2026-08-20). O Seed nunca inventa horário para uma data puramente editorial.
hreflang
Declare alternativas de idioma explicitamente no front matter da página — útil para URLs que o Seed não controla (outro domínio, outra build):
```seed
---
title: Artigo em português
hreflang:
- lang: pt-BR
href: https://meusite.com/artigo.html
- lang: en
href: https://meusite.com/en/article.html
- lang: x-default
href: https://meusite.com/artigo.html
---
```Gera um <link rel="alternate" hreflang="..."> por entrada. Sem hreflang: no front matter, nenhuma tag é gerada — não há default nem inferência. Para sites multilíngue construídos e hospedados pelo próprio Seed, com URLs geradas automaticamente por prefixo, veja i18n.
JSON-LD
Article (ou schema_type customizado)
Toda página com publish_date recebe um bloco Article no <head>:
```seed --- title: Meu Post publish_date: 2026-03-01 update_date: 2026-03-05 description: Resumo do post. schema_type: BlogPosting # opcional — padrão: Article --- ```
| Campo JSON-LD | Origem |
|---|---|
headline | title |
datePublished / dateModified | publish_date / update_date — data simples vira YYYY-MM-DD; datetime vira ISO 8601 com offset |
url / image | Mesma URL do canonical e mesma imagem resolvida para Open Graph |
mainEntityOfPage, inLanguage | Gerados automaticamente |
author / publisher | Veja a seção Autoria, abaixo |
WebSite e Person (homepage)
Quando person.name está configurado no seed.yaml, a homepage recebe WebSite e Person, ligados por @id — a mesma entidade pode ser referenciada como author/publisher em qualquer artigo.
BreadcrumbList
Gerado automaticamente para toda página que não seja a homepage: Home → coleção → página. Pula páginas de paginação, arquivos de tag/data e páginas noindex — é sempre JSON-LD, nunca cria breadcrumb visual no layout.
```yaml
breadcrumbs:
enabled: true # false desliga globalmente
labels:
blog: Blog # rótulo customizado por segmento de URL
3min: Em 3 min
```FAQPage e HowTo
Blocos <!--FAQ-->/<!--HOWTO--> escritos em Markdown (veja Markdown) emitem FAQPage/HowTo no <head>, combinados com Article/BreadcrumbList sem conflito — a deduplicação é por tipo de schema, não por "já existe algum script".
Autoria
Três níveis de precedência, do mais específico para o mais genérico:
author_name(+author_url,author_sameas) no front matter da página — autor customizado, sempre venceauthor: falsena página — remove qualquer autoria, mesmo com default da coleçãoauthor:na coleção (seed.yaml) — autor padrão de todo item, sem precisar repetir em cada postauthor: truesemauthor_namenem autor de coleção — usa operson:global doseed.yaml
Se nenhum caso se aplica, a página não tem autor.
```yaml
# seed.yaml
person:
name: Jane Doe
url: https://meusite.com
collections:
blog:
author:
name: Jane Doe
url: https://meusite.com
sameAs:
- https://x.com/jane
```O autor da coleção fica disponível tanto no JSON-LD quanto como variável {author_name} (e {blog-author_name} em listagens) nos layouts item.layout/list.layout — sem precisar declarar author_name em cada post.
O publisher do JSON-LD sempre usa o person: global (o dono do site), independente do autor editorial da coleção — são conceitos diferentes: quem assina o texto vs. quem publica o site.
Idioma (lang e timezone)
lang: no seed.yaml define o idioma padrão do <html> e a base do og:locale; cada página pode sobrescrever com seu próprio lang. timezone: (IANA, padrão America/Sao_Paulo) normaliza todos os campos de data — um valor inválido gera erro de build. Veja seed.yaml.
Feito com ❤️ e Seed