🌱 Seed

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:

TagOrigem
og:title / twitter:titletitle da página
og:description / twitter:descriptionog_description (se definido) ou description
og:image / twitter:imageimage da página → primeira imagem do conteúdo → image global do seed.yaml
og:image:altimage_alt (ou alt, ou title) — mesma lógica para twitter:image:alt
og:image:width / og:image:heightimage_width / image_height, quando definidos — o Seed nunca baixa a imagem só para descobrir as dimensões
og:site_nametitle do seed.yaml
og:localelang (da página ou global), convertido de BCP47 para o formato Open Graph — pt-BRpt_BR
og:typearticle quando a página tem publish_date, senão website. Sobrescreva com og_type:
twitter:cardsummary_large_image quando há imagem, senão summary
twitter:siteDerivado 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-LDOrigem
headlinetitle
datePublished / dateModifiedpublish_date / update_date — data simples vira YYYY-MM-DD; datetime vira ISO 8601 com offset
url / imageMesma URL do canonical e mesma imagem resolvida para Open Graph
mainEntityOfPage, inLanguageGerados automaticamente
author / publisherVeja 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.

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:

  1. author_name (+ author_url, author_sameas) no front matter da página — autor customizado, sempre vence
  2. author: false na página — remove qualquer autoria, mesmo com default da coleção
  3. author: na coleção (seed.yaml) — autor padrão de todo item, sem precisar repetir em cada post
  4. author: true sem author_name nem autor de coleção — usa o person: global do seed.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