llms.txt, 90 dias depois: uma retrospectiva honesta
Há três meses implantámos um llms.txt em todo o aat.ee. O que é, o que lançámos, o que os logs e as referências mostram na realidade, e um veredicto honesto sobre se vale a pena o esforço.

Em junho, lançámos um llms.txt em todo o aat.ee — um único ficheiro de rota, um mapa em markdown do conteúdo principal do site, servido em aat.ee/llms.txt. Custou cerca de uma hora. Noventa dias depois, este é um relato honesto do que fez e do que não fez, porque a maior parte do que vais ler sobre llms.txt é ou uma repetição da especificação ou um argumento de venda, e o meio-termo — resultados medidos de um site real em produção — é escasso.
O que é o llms.txt, num parágrafo
O llms.txt é uma convenção proposta (não um padrão — mais sobre isto adiante): um ficheiro markdown na raiz do teu domínio que dá aos modelos de linguagem um mapa curado do teu site. Onde o sitemap.xml é uma lista exaustiva de URLs para crawlers, o llms.txt é uma lista de leitura curta e priorizada para assistentes — o que importa, como se chama e onde vive. A aposta é que os agentes preferem um resumo curado a rastejar às cegas.
O que lançámos
A implementação é deliberadamente aborrecida: uma única rota dinâmica que compõe três coisas — um preâmbulo estático de política de crawling, os 15 lançamentos mais recentes, os 10 artigos publicados mais recentes e a lista de categorias — em markdown, com uma função de escape a envolver tudo o que é controlado pelo utilizador.
// User text (project names, article titles) must not break out of the
// markdown link or inject headings into an agent-facing file.
function mdSafe(text: string): string {
return text
.replace(/[\r\n]+/g, " ")
.replace(/[[\]()]/g, "")
.trim()
}
const projectLinks = recentProjects
.map((p) => `- [${mdSafe(p.name)}](${baseUrl}/projects/${p.slug})`)
.join("\n")// User text (project names, article titles) must not break out of the
// markdown link or inject headings into an agent-facing file.
function mdSafe(text: string): string {
return text
.replace(/[\r\n]+/g, " ")
.replace(/[[\]()]/g, "")
.trim()
}
const projectLinks = recentProjects
.map((p) => `- [${mdSafe(p.name)}](${baseUrl}/projects/${p.slug})`)
.join("\n")Esse passo de sanitização é a única parte subtil. Os nomes de projetos e os títulos vêm de utilizadores e de pipelines de LLM; quebras de linha ou parênteses retos incorporados permitiriam que uma listagem injetasse um cabeçalho ou um link falso num ficheiro que os assistentes são convidados a confiar como mapa.
O que os logs mostraram
Três observações de noventa dias de logs de servidor e dados de referenciadores.
Os agentes vão buscá-lo. Vemos pedidos periódicos de /llms.txt a partir de user-agents conhecidos de crawlers de assistentes, a uma frequência muito inferior à do robots.txt, mas consistentemente presentes. Qualquer que seja o estatuto da especificação, o comportamento de busca é real.
Nenhum milagre mensurável de referências. As referências de assistentes de IA para o aat.ee cresceram ao longo do trimestre — mas o crescimento acompanha o nosso ritmo de publicação, não a implementação do llms.txt. Não conseguimos atribuir uma única sessão a um agente ter lido o ficheiro, e desconfiamos de quem reivindica atribuição rigorosa aqui: os assistentes buscam, depois respondem a partir de uma mistura de fontes, e a citação raramente traz um referenciador com a forma de um llms.txt.
Forçou um inventário útil. O benefício inesperado: escrever um mapa curado significa decidir o que é realmente o topo do teu site. A nossa rota renderiza dados em tempo real, por isso o ficheiro mantém-se atual — mas a disciplina de "o que pertence à lista de leitura" melhorou a estrutura de categorias mais do que o próprio ficheiro.
A parte desconfortável: ainda é uma proposta
O llms.txt não tem um padrão ratificado por trás. O tipo MIME é debatido (text/markdown vs text/plain), os assistentes não estão documentados como o lendo, e nada se quebra se não tiveres um. Qualquer publicação que te diga que é "essencial para SEO de IA" em 2026 está à frente das evidências.
A nossa posição após noventa dias: o custo é tão baixo que o valor esperado se mantém positivo, tal como um lobby bem organizado é positivo para um edifício de escritórios. Não vai conduzir o resultado por si só, mas quando um agente vai à procura de orientação, preferes que encontre um mapa curado do que uma parede.
Deves construir um?
Uma tabela de decisão, honestamente:
- Se o teu site tem menos de ~50 páginas com títulos claros — marginal. O teu sitemap e a navegação já contam a história.
- Se tens um site orientado por dados (lançamentos, listagens, artigos, docs — conteúdo que muda semanalmente) — sim. Um llms.txt gerado é um ficheiro de rota, mantém-se atual automaticamente e dá aos assistentes um resumo livre de spam que o teu sitemap não consegue.
- Se te disseram que vai impulsionar os rankings de IA — não. É um mapa, não uma meta tag.
O padrão de implementação acima — compor, sanitizar, servir — encaixa em qualquer framework com uma camada de routing. Mantém-no gerado em vez de escrito à mão, mantém o texto do utilizador sanitizado e mantém as tuas expectativas calibradas.