Implementando llms.txt: Haz Tu Sitio Amigable para IA
llms.txt es básicamente robots.txt pero para modelos de lenguaje. Es un archivo de texto plano en la raíz del sitio que le dice a los crawlers de IA qué hay acá y dónde encontrarlo.
Lo agregué a este sitio porque cada vez más gente llega a contenido técnico a través de asistentes de IA, y si el contenido no está estructurado para que un LLM lo entienda, simplemente se pierde.
El endpoint en Astro
// src/pages/llms.txt.ts
import type { APIRoute } from 'astro'
import { getCollection } from 'astro:content'
export const GET: APIRoute = async () => {
const notes = await getCollection('notes')
const sorted = notes
.filter(n => !n.data.draft)
.sort((a, b) => b.data.publishDate.getTime() - a.data.publishDate.getTime())
const content = `# Giorgiosaud.io
> Notebook de desarrollador web con notas sobre Astro, JavaScript, TypeScript y desarrollo web moderno.
## Notas
${sorted.map(n => `- [${n.data.title}](/notebook/${n.id}.md): ${n.data.description || ''}`).join('\n')}
`
return new Response(content, {
headers: { 'Content-Type': 'text/plain; charset=utf-8' }
})
}
Genera el archivo dinámicamente en cada request — así siempre está actualizado sin necesidad de rebuild manual.
El tag para descubrimiento
En el <head> de cada página:
<head>
<link rel="alternate" type="text/plain" href="/llms.txt" title="Índice de Contenido LLM">
<link rel="alternate" type="text/markdown" href="/notebook/pagina-actual.md" title="Versión Markdown">
</head>
Esto le da a los crawlers y asistentes de IA una forma de descubrir el archivo sin tener que adivinar la URL.
La idea es simple: si alguien le pasa una URL de este sitio a Claude o ChatGPT, el asistente puede ir a /llms.txt, ver el índice completo, y navegar al endpoint .md de la nota específica para leer el contenido limpio. Sin HTML, sin ruido.
Eso es todo por ahora.



Comments for llmstx