Exporte tarefas com guias detalhados ou copie um prompt pronto para Cursor/Codex corrigir o site.
Pré-visualizar checklist
# GEO Score — Checklist dev
- **Domínio:** https://fuels4life.com
- **Pergunta/dor:**
- **Score:** 70/100 (orange)
- **Audit:** 401a7ab6-8430-4239-971c-b35814337926 · 2026-10-05
## Tarefas (por impacto)
- [ ] **`P2-JSONLD`** · CRITICAL — JSON-LD ausente
- Nenhum bloco JSON-LD em https://fuels4life.com/
- Busca: <script type="application/ld+json"> — 0 ocorrências
- URL analisada: https://fuels4life.com/
- Ação: Adicione JSON-LD (Organization, Product/SoftwareApplication, FAQPage).
- **Guia:**
- Adicione pelo menos um bloco `<script type="application/ld+json">` na home (ou layout global).
- Inclua `Organization` ou `SoftwareApplication`/`Product` com name, url, description, logo.
- Valide JSON (vírgulas, aspas) — JSON inválido é pior que ausência.
- Opcional: adicione `WebSite` com `potentialAction` SearchAction se houver busca.
- **Snippets:**
- Organization + SoftwareApplication:
```
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"name": "Nome da Marca",
"url": "https://example.com",
"logo": "https://example.com/logo.png"
},
{
"@type": "SoftwareApplication",
"name": "Nome do Produto",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Web",
"description": "O que o produto faz em uma frase.",
"url": "https://example.com"
}
]
}
</script>
```
- **Pronto quando:**
- ≥1 bloco JSON-LD válido no HTML da home
- Audit P2-JSONLD passa
- [ ] **`P1-ROBOTS-SITEMAP`** · MEDIUM — robots.txt não referencia sitemap
- Nenhuma linha Sitemap: no robots.txt
- Trecho do robots.txt:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8">
- <title>Fuels 4 Life | Ingredients for Agriculture, Livestock & Fermentation</title>
- <meta name="description" content="High-performance ingredients for crop nutrition, animal nutrition and fermentation systems. Reliable sourcing and formulation support for manufacturers.">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="canonical" href="https://fuels4life.com/">
- Ação: Adicione Sitemap: https://seudominio/sitemap.xml no robots.txt.
- **Guia:**
- Confirme que o sitemap existe e está acessível (ex.: `/sitemap.xml`).
- Adicione ao final do `robots.txt` uma linha `Sitemap:` com URL absoluta HTTPS.
- Se houver múltiplos sitemaps (índice), liste o sitemap-index principal.
- **Snippets:**
- Diretiva no robots.txt:
```
Sitemap: https://example.com/sitemap.xml
```
- **Pronto quando:**
- robots.txt contém linha Sitemap: com URL válida
- Audit P1-ROBOTS-SITEMAP passa
- [ ] **`P1-LINK-HEADERS`** · MEDIUM — Headers HTTP Link (RFC 8288) ausentes
- GET https://fuels4life.com/ sem header Link — agentes não descobrem llms.txt, sitemap ou API pelo HTTP
- Não confundir com <link> no HTML (canonical no <head> não conta). O check lê o header HTTP Link.
- Formato: Link: </llms.txt>; rel="describedby"; type="text/markdown"
- Nenhum header Link na resposta da home
- Ação: Adicione headers Link na home apontando para /llms.txt, sitemap e, se houver API, /.well-known/api-catalog.
- **Guia:**
- Confirme que o check é o header HTTP `Link`, não a tag HTML `<link rel="canonical">`.
- Na home, envie pelo menos um `Link` apontando para recursos que agentes devem descobrir: `/llms.txt`, `/sitemap.xml`, docs de API se existirem.
- Em hosting estático: `_headers` (Netlify/Cloudflare Pages), `nitro.routeRules`, ou config do CDN/nginx.
- Valide: `curl -sI https://seudominio.com/ | findstr /i Link` (Windows) ou `curl -sI … | grep -i ^link`.
- **Snippets:**
- Headers HTTP (RFC 8288):
```
Link: </llms.txt>; rel="describedby"; type="text/markdown"
Link: </sitemap.xml>; rel="index"
Link: </.well-known/api-catalog>; rel="api-catalog"
```
- Nuxt — nitro.routeRules:
```
nitro: {
routeRules: {
'/': {
headers: {
Link: '</llms.txt>; rel="describedby"; type="text/markdown", </sitemap.xml>; rel="index"',
},
},
},
},
```
- Cloudflare Pages / Netlify — public/_headers:
```
/
Link: </llms.txt>; rel="describedby"; type="text/markdown"
Link: </sitemap.xml>; rel="index"
```
- **Pronto quando:**
- GET / inclui header Link com rel de descoberta (describedby, index, api-catalog ou service-doc)
- Audit P1-LINK-HEADERS passa
- **Notas:**
- Verificado pelo isitagentready.com (Discoverability).
- Landing sem API: describedby → llms.txt + index → sitemap já basta. api-catalog só se houver catálogo RFC 9727.
- [ ] **`P2-OPENING`** · MEDIUM — Abertura pouco extratível
- Primeiros parágrafos não definem o produto claramente
- Parágrafo 1 (10 chars): "Loading..."
- Parágrafo 2 (18 chars): "What Sets Us Apart"
- Ação: Defina o produto de forma direta nos 2 primeiros parágrafos ("X é uma ferramenta de Y que Z").
- **Guia:**
- Se a evidência indicar SPA / HTML cru sem <p>: ative SSR/SSG primeiro (P1-RENDER) — reescrever copy no Hero.vue não coloca texto no HTML inicial.
- Com HTML populado: reescreva os 2 primeiros parágrafos acima da dobra.
- Primeira frase: "[Marca] é [categoria] que [benefício principal]."
- Segunda frase: público-alvo ou diferencial concreto.
- Evite abrir só com slogans ou CTAs.
- **Snippets:**
- Modelo de abertura:
```
<p>Acme é uma plataforma de gestão de tempo para equipes remotas que integra timesheet, aprovações e relatórios em um só lugar.</p>
<p>Indicada para agências e consultorias B2B que cobram por hora e usam Slack no dia a dia.</p>
```
- **Pronto quando:**
- View Source mostra parágrafo de abertura >50 chars com definição clara
- Audit P2-OPENING passa
- **Notas:**
- GEO mede o HTML cru. Texto só após JS = abertura “ausente” para crawlers.
- [ ] **`P1-LLMS-TXT-QUALITY`** · LOW — llms.txt com conteúdo insuficiente
- Arquivo encontrado mas com qualidade baixa para LLMs
- Sem título H1 (linha começando com "# ")
- Sem seções H2 (linhas começando com "## ")
- Tamanho atual: 31956 caracteres
- Ação: Enriqueça o /llms.txt raiz (H1, seções, ≥100 palavras). Detalhes longos por página → .md linkados no índice.
- **Guia:**
- Abra `/llms.txt` e verifique os itens apontados na evidência.
- Adicione título H1 se ausente: `# Nome do Produto`.
- Adicione seções H2 se ausentes: `## Funcionalidades`, `## FAQ`, `## Docs e páginas` (ou `## Links`).
- Expanda até ≥100 palavras com fatos citáveis (o que é, para quem, diferencial) — evite marketing vazio.
- Se o conteúdo por página for distinto: mova detalhes longos para `.md` por URL e deixe na raiz só resumo + lista de links (melhor para agentes).
- Use linguagem direta; alinhe FAQ do llms.txt às dores usadas no probe GEO.
- **Pronto quando:**
- llms.txt tem título H1
- llms.txt tem pelo menos 2 seções H2
- llms.txt tem ≥100 palavras de conteúdo
- Audit P1-LLMS-TXT-QUALITY passa
- **Notas:**
- Prefira enriquecer a raiz com links para MD por página a inflar um único arquivo.
- HTML da página continua sendo a fonte principal de busca — mantenha paridade de fatos entre HTML e Markdown.
- [ ] **`P1-MARKDOWN`** · LOW — Servidor não serve Markdown por negociação de conteúdo
- Requisição com Accept: text/markdown não retornou text/markdown
- LLMs preferem Markdown limpo a HTML — menos tokens, menos ruído.
- Para Nuxt/Next.js: adicione um endpoint /api/content ou middleware de content negotiation.
- Para sites estáticos: serve /llms.txt já cobre a maioria dos casos práticos.
- Ação: Configure o servidor/framework para responder com Markdown quando solicitado via Accept: text/markdown.
- **Guia:**
- Avalie se faz sentido para seu stack — sites estáticos já têm /llms.txt como alternativa mais simples.
- Para Nuxt/Next.js: adicione middleware que, quando `Accept: text/markdown` for enviado, sirva uma versão Markdown da página.
- Para sites estáticos: garanta que /llms.txt esteja rico — é o equivalente prático.
- **Snippets:**
- Nuxt server middleware (server/middleware/markdown.ts):
```
export default defineEventHandler(async (event) => {
const accept = getHeader(event, 'accept') ?? ''
if (!accept.includes('text/markdown')) return
// Redireciona para versão Markdown equivalente
const url = getRequestURL(event)
if (url.pathname === '/') {
setHeader(event, 'content-type', 'text/markdown; charset=utf-8')
// retorne o conteúdo Markdown da home
return '# Worklift\n\nDescrição Markdown da home...'
}
})
```
- **Pronto quando:**
- GET / com Accept: text/markdown retorna Content-Type: text/markdown
- Audit P1-MARKDOWN passa
- **Notas:**
- Este check tem impacto prático menor que llms.txt — priorize os outros primeiro.
## Prompt para code agent (todos os findings)
Copie o bloco abaixo para Cursor/Codex:
```
Você está corrigindo múltiplos problemas de GEO (Generative Engine Optimization) em um site.
Trabalhe por ordem de severidade. Mudanças mínimas, estilo consistente.
## Contexto
- Domínio: https://fuels4life.com
- Pergunta/dor:
- Score atual: 70/100
- Audit ID: 401a7ab6-8430-4239-971c-b35814337926
## 6 finding(s) a tratar
---
### 1. P2-JSONLD — JSON-LD ausente (critical)
Nenhum bloco JSON-LD em https://fuels4life.com/
Detalhes coletados:
- Busca: <script type="application/ld+json"> — 0 ocorrências
- URL analisada: https://fuels4life.com/
**Ação resumida:** Adicione JSON-LD (Organization, Product/SoftwareApplication, FAQPage).
## Passos
1. Adicione pelo menos um bloco `<script type="application/ld+json">` na home (ou layout global).
2. Inclua `Organization` ou `SoftwareApplication`/`Product` com name, url, description, logo.
3. Valide JSON (vírgulas, aspas) — JSON inválido é pior que ausência.
4. Opcional: adicione `WebSite` com `potentialAction` SearchAction se houver busca.
## Snippets (adapte ao stack do projeto)
### Organization + SoftwareApplication
```
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"name": "Nome da Marca",
"url": "https://example.com",
"logo": "https://example.com/logo.png"
},
{
"@type": "SoftwareApplication",
"name": "Nome do Produto",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Web",
"description": "O que o produto faz em uma frase.",
"url": "https://example.com"
}
]
}
</script>
```
## Definition of done
- ≥1 bloco JSON-LD válido no HTML da home
- Audit P2-JSONLD passa
---
### 2. P1-ROBOTS-SITEMAP — robots.txt não referencia sitemap (medium)
Nenhuma linha Sitemap: no robots.txt
Detalhes coletados:
- Trecho do robots.txt:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8">
- <title>Fuels 4 Life | Ingredients for Agriculture, Livestock & Fermentation</title>
- <meta name="description" content="High-performance ingredients for crop nutrition, animal nutrition and fermentation systems. Reliable sourcing and formulation support for manufacturers.">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="canonical" href="https://fuels4life.com/">
**Ação resumida:** Adicione Sitemap: https://seudominio/sitemap.xml no robots.txt.
## Passos
1. Confirme que o sitemap existe e está acessível (ex.: `/sitemap.xml`).
2. Adicione ao final do `robots.txt` uma linha `Sitemap:` com URL absoluta HTTPS.
3. Se houver múltiplos sitemaps (índice), liste o sitemap-index principal.
## Snippets (adapte ao stack do projeto)
### Diretiva no robots.txt
```
Sitemap: https://example.com/sitemap.xml
```
## Definition of done
- robots.txt contém linha Sitemap: com URL válida
- Audit P1-ROBOTS-SITEMAP passa
---
### 3. P1-LINK-HEADERS — Headers HTTP Link (RFC 8288) ausentes (medium)
GET https://fuels4life.com/ sem header Link — agentes não descobrem llms.txt, sitemap ou API pelo HTTP
Detalhes coletados:
- Não confundir com <link> no HTML (canonical no <head> não conta). O check lê o header HTTP Link.
- Formato: Link: </llms.txt>; rel="describedby"; type="text/markdown"
- Nenhum header Link na resposta da home
**Ação resumida:** Adicione headers Link na home apontando para /llms.txt, sitemap e, se houver API, /.well-known/api-catalog.
## Passos
1. Confirme que o check é o header HTTP `Link`, não a tag HTML `<link rel="canonical">`.
2. Na home, envie pelo menos um `Link` apontando para recursos que agentes devem descobrir: `/llms.txt`, `/sitemap.xml`, docs de API se existirem.
3. Em hosting estático: `_headers` (Netlify/Cloudflare Pages), `nitro.routeRules`, ou config do CDN/nginx.
4. Valide: `curl -sI https://seudominio.com/ | findstr /i Link` (Windows) ou `curl -sI … | grep -i ^link`.
## Snippets (adapte ao stack do projeto)
### Headers HTTP (RFC 8288)
```
Link: </llms.txt>; rel="describedby"; type="text/markdown"
Link: </sitemap.xml>; rel="index"
Link: </.well-known/api-catalog>; rel="api-catalog"
```
### Nuxt — nitro.routeRules
```
nitro: {
routeRules: {
'/': {
headers: {
Link: '</llms.txt>; rel="describedby"; type="text/markdown", </sitemap.xml>; rel="index"',
},
},
},
},
```
### Cloudflare Pages / Netlify — public/_headers
```
/
Link: </llms.txt>; rel="describedby"; type="text/markdown"
Link: </sitemap.xml>; rel="index"
```
## Definition of done
- GET / inclui header Link com rel de descoberta (describedby, index, api-catalog ou service-doc)
- Audit P1-LINK-HEADERS passa
## Notas
- Verificado pelo isitagentready.com (Discoverability).
- Landing sem API: describedby → llms.txt + index → sitemap já basta. api-catalog só se houver catálogo RFC 9727.
---
### 4. P2-OPENING — Abertura pouco extratível (medium)
Primeiros parágrafos não definem o produto claramente
Detalhes coletados:
- Parágrafo 1 (10 chars): "Loading..."
- Parágrafo 2 (18 chars): "What Sets Us Apart"
**Ação resumida:** Defina o produto de forma direta nos 2 primeiros parágrafos ("X é uma ferramenta de Y que Z").
## Passos
1. Se a evidência indicar SPA / HTML cru sem <p>: ative SSR/SSG primeiro (P1-RENDER) — reescrever copy no Hero.vue não coloca texto no HTML inicial.
2. Com HTML populado: reescreva os 2 primeiros parágrafos acima da dobra.
3. Primeira frase: "[Marca] é [categoria] que [benefício principal]."
4. Segunda frase: público-alvo ou diferencial concreto.
5. Evite abrir só com slogans ou CTAs.
## Snippets (adapte ao stack do projeto)
### Modelo de abertura
```
<p>Acme é uma plataforma de gestão de tempo para equipes remotas que integra timesheet, aprovações e relatórios em um só lugar.</p>
<p>Indicada para agências e consultorias B2B que cobram por hora e usam Slack no dia a dia.</p>
```
## Definition of done
- View Source mostra parágrafo de abertura >50 chars com definição clara
- Audit P2-OPENING passa
## Notas
- GEO mede o HTML cru. Texto só após JS = abertura “ausente” para crawlers.
---
### 5. P1-LLMS-TXT-QUALITY — llms.txt com conteúdo insuficiente (low)
Arquivo encontrado mas com qualidade baixa para LLMs
Detalhes coletados:
- Sem título H1 (linha começando com "# ")
- Sem seções H2 (linhas começando com "## ")
- Tamanho atual: 31956 caracteres
**Ação resumida:** Enriqueça o /llms.txt raiz (H1, seções, ≥100 palavras). Detalhes longos por página → .md linkados no índice.
## Passos
1. Abra `/llms.txt` e verifique os itens apontados na evidência.
2. Adicione título H1 se ausente: `# Nome do Produto`.
3. Adicione seções H2 se ausentes: `## Funcionalidades`, `## FAQ`, `## Docs e páginas` (ou `## Links`).
4. Expanda até ≥100 palavras com fatos citáveis (o que é, para quem, diferencial) — evite marketing vazio.
5. Se o conteúdo por página for distinto: mova detalhes longos para `.md` por URL e deixe na raiz só resumo + lista de links (melhor para agentes).
6. Use linguagem direta; alinhe FAQ do llms.txt às dores usadas no probe GEO.
## Definition of done
- llms.txt tem título H1
- llms.txt tem pelo menos 2 seções H2
- llms.txt tem ≥100 palavras de conteúdo
- Audit P1-LLMS-TXT-QUALITY passa
## Notas
- Prefira enriquecer a raiz com links para MD por página a inflar um único arquivo.
- HTML da página continua sendo a fonte principal de busca — mantenha paridade de fatos entre HTML e Markdown.
---
### 6. P1-MARKDOWN — Servidor não serve Markdown por negociação de conteúdo (low)
Requisição com Accept: text/markdown não retornou text/markdown
Detalhes coletados:
- LLMs preferem Markdown limpo a HTML — menos tokens, menos ruído.
- Para Nuxt/Next.js: adicione um endpoint /api/content ou middleware de content negotiation.
- Para sites estáticos: serve /llms.txt já cobre a maioria dos casos práticos.
**Ação resumida:** Configure o servidor/framework para responder com Markdown quando solicitado via Accept: text/markdown.
## Passos
1. Avalie se faz sentido para seu stack — sites estáticos já têm /llms.txt como alternativa mais simples.
2. Para Nuxt/Next.js: adicione middleware que, quando `Accept: text/markdown` for enviado, sirva uma versão Markdown da página.
3. Para sites estáticos: garanta que /llms.txt esteja rico — é o equivalente prático.
## Snippets (adapte ao stack do projeto)
### Nuxt server middleware (server/middleware/markdown.ts)
```
export default defineEventHandler(async (event) => {
const accept = getHeader(event, 'accept') ?? ''
if (!accept.includes('text/markdown')) return
// Redireciona para versão Markdown equivalente
const url = getRequestURL(event)
if (url.pathname === '/') {
setHeader(event, 'content-type', 'text/markdown; charset=utf-8')
// retorne o conteúdo Markdown da home
return '# Worklift\n\nDescrição Markdown da home...'
}
})
```
## Definition of done
- GET / com Accept: text/markdown retorna Content-Type: text/markdown
- Audit P1-MARKDOWN passa
## Notas
- Este check tem impacto prático menor que llms.txt — priorize os outros primeiro.
---
## Instruções finais
- Corrija na ordem listada (critical → high → medium → low).
- Um commit ou PR por tema (robots/sitemap, HTML/headings, JSON-LD) se fizer sentido.
- Ao terminar, liste cada finding e se o critério de pronto foi atendido.
```
---
_Gerado por GEO Score_