crea.site
3 min de leitura seoagents

llms.txt, robots.txt e páginas servidas como Markdown

Os agentes leem de forma diferente dos navegadores. O que cada site gerado lhes oferece: llms.txt, política para crawlers de IA e cada página em markdown.

Uma parte cada vez maior das pessoas que vão ouvir falar de um pequeno negócio nunca visitará o seu site. Vão perguntar a um modelo, e o modelo responde com o que conseguiu ler.

Isso faz de "um agente consegue ler este site?" uma questão de distribuição, e não uma curiosidade técnica. Daí resultam três coisas, e todo site gerado aqui recebe as três sem que ninguém peça.

O robots.txt deve nomear os crawlers de IA

Se você não disser nada sobre eles, caem em User-agent: *. Isso não é uma política, é um padrão que você herdou.

Por isso nós os nomeamos. Os agentes de busca e resposta que devolvem citações - OAI-SearchBot, ChatGPT-User, Claude-SearchBot, Claude-User, PerplexityBot - e os crawlers de treino GPTBot, ClaudeBot, Google-Extended, meta-externalagent. Cada um herda exatamente a mesma lista de Disallow que todos os outros: nenhum bot acessa a API, e nenhum bot acessa uma página só para membros.

Nomeá-los não é ser permissivo. É ter a política escrita num lugar onde pode ser alterada de propósito.

O llms.txt é um índice, não um discurso de vendas

A convenção llms.txt é simples: um título, um resumo de um parágrafo num blockquote e depois seções com links. Um modelo que chegue lá deve conseguir perceber o que é este site e onde ficam as páginas importantes, em uma única requisição, sem renderizar nada.

O nosso é gerado a partir da definição do site, o que importa mais do que parece. A listagem é filtrada pela mesma regra de público/privado que o sitemap:

# Piekarnia Lune

> A sourdough bakery in Kraków. Bread baked daily, cakes to order,
> open from seven.

## Pages

- [Menu](https://...): What we bake, and what it costs.
- [Order a cake](https://...): Wedding and birthday cakes, two weeks' notice.

Uma lista, lida três vezes - pelo sitemap, pelo llms.txt e pela meta tag robots. Não há como os três discordarem, porque não há nada para manter sincronizado.

Cada página, também em markdown

A forma mais rápida de ser mal interpretado é obrigar o leitor a analisar uma página cheia de layout para encontrar três frases. Por isso, todas as páginas de todos os sites gerados respondem tanto em markdown como em HTML:

  • Envie Accept: text/markdown e você recebe a página em markdown na mesma URL.
  • Ou acrescente .md ao caminho, para os muitos agentes que não negociam.

As regras que mantêm isto honesto merecem ser ditas. É uma reescrita, não um redirecionamento. Só acontece num pedido explícito de text/markdown, nunca com */* - um navegador que envia "qualquer coisa" quer a página. As duas respostas levam Vary: Accept, para que uma cache partilhada não sirva o mesmo corpo a todos. E a variante em markdown é noindex, para nunca competir na busca com a página de que é cópia.

O serializador percorre a definição do site e não o HTML renderizado, e é por isso que o resultado sai limpo: uma secção de funcionalidades vira uma lista, um FAQ vira títulos e respostas, uma tabela de preços vira uma tabela. Um mapa ou um calendário de reservas vira uma linha honesta a dizer o que lá está, em vez de uma invenção do que mostraria.

Vale também para nós

Este artigo está disponível na mesma URL com .md no final. Assim como todas as outras páginas do crea.site, e o nosso próprio llms.txt as lista.

Um construtor de sites cujas próprias páginas um agente não consegue ler está a argumentar contra si mesmo.