llms.txt zum Astro-Blog hinzufügen, Anleitung
Ausgangslage
Als Anwendungsentwickler betreibe ich IRC-Coding.de mit über 600 Artikeln zu Softwareentwicklung und Programmierung. KI-Suchmaschinen wie ChatGPT, Perplexity und Claude crawlen Webseiten und versuchen, den Inhalt zu verstehen. Dabei kämpfen sie mit HTML-Markup, JavaScript-Rendering und unnötigem Code.
Die llms.txt-Spezifikation löst dieses Problem: Eine einfache Textdatei im Wurzelverzeichnis einer Seite, die den Inhalt in maschinenlesbarem Format bereitstellt.
Bei der Umsetzung stand ich vor folgenden Fragen:
- Wie generiere ich
llms.txtautomatisch beim Build? - Welche Dateien brauche ich (
llms.txt,llms-full.txt,llms-small.txt)? - Wie schütze ich meinen Content vor einfachem Kopieren durch Betrüger?
Ich habe mir zwei bekannte Ansätze angesehen: ein custom API Route (wie Alex OP beschreibt) und das @4hse/astro-llms-txt Plugin (siehe GitHub). In diesem Artikel zeige ich Dir, wie ich beides verglichen und welche Lösung ich für IRC-Coding.de gewählt habe.
Übrigens, die Seite von Alex OP ist echt empfehlenswert, schaut sie Euch mal an. Gefunden habe ich sie übrigens durch eine Google-Suche nach llms.txt Astro.
Lösung
Schritt 1: Plugin installieren
npm install @4hse/astro-llms-txt
Das Plugin nutzt Astro’s astro:build:done Hook, liest die generierten HTML-Dateien aus dem dist/-Verzeichnis und wandelt sie mit rehype-remark in Markdown um. Das bedeutet: Ich brauche keine eigenen Parser oder Content-Extraktion-Logik.
Schritt 2: Astro-Konfiguration anpassen
In meiner astro.config.mjs habe ich das Plugin zu den Integrations hinzugefügt:
import astroLlmsTxt from '@4hse/astro-llms-txt';
export default defineConfig({
site: 'https://www.deine-seite.de',
integrations: [
// ... andere Integrations
astroLlmsTxt({
title: 'IRC-Coding',
description: 'Software Development and Programming, Tutorials, Artikel und Ressourcen.',
notes: '- Content is auto-generated from the official source at https://www.irc-coding.de',
docSet: [
{
title: 'Complete site',
description: 'Excerpts of all blog articles with links to full content',
url: '/llms-full.txt',
include: ['**'],
promote: ['index', 'blog/**'],
excerptLength: 600,
visitLinkText: 'Visit full article',
},
{
title: 'Compact overview',
description: 'Structure-only index of all pages',
url: '/llms-small.txt',
include: ['**'],
onlyStructure: true,
promote: ['index', 'blog/**'],
},
],
pageSeparator: '\n\n---\n\n',
}),
],
});
Schritt 3: Build ausführen
npm run build
Nach dem Build fand ich drei Dateien in dist/:
llms.txt: Index mit Titel, Beschreibung und Links zu den DocSetsllms-full.txt: Inhalt aller Seiten als Markdownllms-small.txt: Nur Struktur (Überschriften und Listen)
Schritt 4: Excerpt-Limit für Content-Schutz
Standardmäßig generiert das Plugin den kompletten Inhalt in llms-full.txt. Bei meinen 600 Artikeln entstand so eine Datei mit über 140.000 Zeilen, ein gefundenes Fressen für Content-Diebe. Jeder konnte https://www.irc-coding.de/llms-full.txt aufrufen und den kompletten Text aller Artikel kopieren.
Ich habe das Plugin daher erweitert. Die Option excerptLength begrenzt jeden Artikel auf die ersten 600 Zeichen. Am Ende erscheint ein Link zur Original-Seite:
# Algorithmus einfach erklärt
> Algorithmus verständlich erklärt: Eigenschaften, Entwurfsparadigmen...
## Definition
Ein Algorithmus ist eine endliche Folge von wohldefinierten Anweisungen...
[Visit full article](https://www.irc-coding.de/algorithmus-begriffserklaerung-komplexitaet-korrektheit)
KI-Suchmaschinen erhalten genug Kontext, um zu verstehen, worum es geht. Den vollständigen Artikel gibt es nur auf der Webseite selbst. Für die Anpassung habe ich die DocSet-Schnittstelle im Plugin erweitert und die buildEntryFromHtml-Funktion so modifiziert, dass sie den Content bei excerptLength Zeichen abschneidet und den Visit-Link anhängt.
Warum 600 Zeichen? Ich habe ein paar Artikel getestet und gemerkt: 600 Zeichen reichen aus, damit die KI den Kontext versteht, aber nicht genug hat, um den Artikel einfach 1:1 zu kopieren. Probier es selbst aus, vielleicht passen für Deinen Use Case auch 400 oder 800.
Alternative Ansätze
Custom API Route (Alex OP)
Alex OP beschreibt einen simplen Ansatz mit einem Astro API Route:
// src/pages/llms.txt.ts
import type { APIRoute } from "astro";
import { getCollection } from "astro:content";
export const GET: APIRoute = async () => {
const posts = await getCollection("blog", ({ data }) => !data.draft);
const sortedPosts = posts.sort(
(a, b) => new Date(b.data.pubDatetime).valueOf() - new Date(a.data.pubDatetime).valueOf()
);
let llmsContent = "";
for (const post of sortedPosts) {
llmsContent += `---\ntitle: ${post.data.title}\ndescription: ${post.data.description}\n---\n\n`;
// ... Content-Extraktion
}
return new Response(llmsContent, {
headers: { "Content-Type": "text/plain; charset=utf-8" },
});
};
Vorteile:
- Keine zusätzliche Abhängigkeit
- Volle Kontrolle über Formatierung
- Funktioniert auch im Dev-Server
Nachteile:
- Content-Extraktion muss selbst implementiert werden (MDX-Komponenten entfernen, Shiki-Twoslash-Directives filtern, Frontmatter parsen)
- Keine
llms-small.txtoder strukturierte DocSets - Kein
onlyStructureModus
In der Regel eine gute Lösung, schaut Euch die Seite aber bitte selbst an, ich kann mich irren oder es missdeuten.
@4hse/astro-llms-txt Plugin
Das Plugin von 4HSE geht einen anderen Weg:
Es liest die fertigen HTML-Dateien nach dem Build und wandelt sie mit rehype-remark zurück in Markdown.
Vorteile:
- Komplette Pipeline (
rehype-parse→rehype-remark→remark-gfm→remark-stringify) - MDX-Komponenten, Expressive Code und Tabs werden automatisch behandelt
onlyStructureModus für kompakte Übersicht- DocSets mit
include,promote,demotePattern-Matching
Nachteile:
- Funktioniert nur beim Build (nicht im Dev-Server)
- Kein eingebautes Excerpt-Limit (ich habe es selbst hinzugefügt)
Vergleich
| Kriterium | Custom API Route | @4hse/astro-llms-txt |
|---|---|---|
| Aufwand | Mittel (eigene Logik) | Gering (Konfiguration) |
| MDX-Support | Manuell implementieren | Automatisch |
onlyStructure | Nicht vorhanden | Eingebaut |
| Excerpt-Limit | Selbst implementieren | Selbst erweitern |
| Dev-Server | Ja | Nur Build |
| DocSets | Nicht vorhanden | Mit Pattern-Matching |
Ich habe mich für das @4hse/astro-llms-txt Plugin entschieden, weil es die MDX-Komponenten und Expressive-Code-Blöcke automatisch verarbeitet. Bei über 600 Artikeln wäre eine eigene Content-Extraktion zu fehleranfällig gewesen. Der Custom-API-Route-Ansatz von Alex OP ist interessant für kleinere Blogs, bei meiner Artikelanzahl wäre der Wartungsaufwand für die Content-Extraktion aber unverhältnismäßig hoch geworden.
Häufige Fehler
-
Fehler:
Expected pattern to be a non-empty stringLösung: Das Plugin nutztpicomatchintern. Leere Strings inpromoteoderincludeArrays verursachen diesen Fehler. Ich habe stattdessen['index', 'blog/**']verwendet. -
Fehler:
File not found: dist/de/index.htmlLösung: Derinclude: ['**']Pattern matcht alle Seiten. Wenn einige Seiten nicht generiert werden (z.B. durchdraft: true), erscheint diese Warnung. Sie ist harmlos, die Datei wird einfach übersprungen. -
Fehler:
llms-full.txtist zu groß Lösung: Ich habeexcerptLengthauf 600 Zeichen gesetzt. Damit schütze ich meinen Content und die Datei bleibt kompakt. Die Anpassung erforderte eine kleine Modifikation des Plugins innode_modules/@4hse/astro-llms-txt/src/index.ts, dort habe ich dieDocSet-Schnittstelle umexcerptLengthundvisitLinkTexterweitert. -
Fehler: KI-Systeme finden die Datei nicht Lösung: Stelle sicher, dass
llms.txtim Wurzelverzeichnis Deiner Domain liegt (z.B.https://www.irc-coding.de/llms.txt). Bei Deployments auf Vercel oder Netlify wird die Datei ausdist/automatisch korrekt ausgeliefert.
Beachtet ChatGPT oder Claude.ai Deine llms.txt und lohnt sich die Mühe es zu implementieren?
Vermutlich nicht, es hilft vermutlich nur dem Content-Dieb.
Ich war schockiert, wie schnell man meine Wordpress-Seite zu Markdown kopieren konnte, denn Wordpress hat schon alle Tools dafür mitgebracht.
Auch hier ist es eher ein Community-Gedanke, aber die KIs werden in der Regel anders angelernt.
Fragt man ChatGPT so kommen folgendes bei heraus
'''text Für mich als ChatGPT in diesem Chat bringt eine llms.txt keinen direkten Vorteil, weil ich beim Antworten nicht einfach beliebige Webseiten live crawle und nach einer llms.txt suche. Wenn ich deine Website nicht per Websuche oder über einen Link aufrufe, sehe ich die Datei gar nicht.
Wenn ich aber mit Webzugriff Informationen von deiner Website abrufe, dann kann eine gut strukturierte llms.txt durchaus hilfreich sein – insbesondere wenn sie:
wichtige Dokumentationen übersichtlich auflistet, gute Titel und Beschreibungen enthält, auf relevante Seiten verweist, und idealerweise eine llms-full.txt oder ähnliche strukturierte Inhalte bereitstellt. Für andere KI-Systeme
Hier ist der potenzielle Nutzen derzeit größer. Systeme und Werkzeuge, die gezielt llms.txt unterstützen, können dadurch:
die Dokumentation schneller finden, Inhalte besser priorisieren, weniger irrelevante Seiten durchsuchen, und eine API- oder Projektdokumentation effizienter erschließen. Für SEO?
Im klassischen Sinn (Google-Ranking) gibt es derzeit keine belegten Vorteile.
Ich würde llms.txt eher als:
robots.txt → für Crawler, sitemap.xml → für Suchmaschinen, llms.txt → für KI-gestützte Systeme
sehen. Sie erfüllen unterschiedliche Aufgaben.
Ich würde sie aber nicht als SEO-Maßnahme betrachten, sondern als Investition in die Auffindbarkeit und Nutzbarkeit deiner Inhalte für KI-gestützte Werkzeuge. Falls sich llms.txt weiter etabliert, bist du bereits gut aufgestellt; falls nicht, ist der zusätzliche Aufwand bei einer automatischen Generierung meist überschaubar. '''
Warum habe ich es trotzdem umgesetzt? Nun, die Seite diente mir zum Erlernen des Lernstoffes und jeder weiterer Besucher macht mich irgendwie zufrieden. Und die Hoffnung stirbt zuletzt.
FAQ llms.txt für Astro
1. Was ist llms.txt?
2. Wie unterscheidet sich llms.txt von robots.txt?
3. Brauche ich llms.txt für SEO?
4. Welche Dateien generiert das Plugin?
5. Funktioniert das Plugin im Dev-Server?
6. Kann ich llms.txt ohne Plugin erstellen?
7. Wie schütze ich Content vor Kopie?
8. Was bedeutet onlyStructure?
9. Wie konfiguriere ich promote und demote?
10. Wo muss llms.txt liegen?
11. Ist llms.txt ein offizieller Standard?
12. Kann ich Unterseiten ausschließen?
13. Was kostet das Plugin?
14. Wie viele Zeichen für excerptLength?
15. Funktioniert llms.txt mit SSG und SSR?
Article Quellen und Bezugspunkte!
- llms.txt Spezifikation
- 4hse/astro-llms-txt auf GitHub
- Alex OP: How I Added llms.txt to My Astro Blog
- Astro Dokumentation