Skip to content
IRC-Coding IRC-Coding
Astro llms.txt SEO AI Search Content Protection Static Site Generation

llms.txt zum Astro-Blog hinzufügen, Anleitung

Schritt-für-Schritt-Anleitung: So fügst Du llms.txt, llms-full.txt und llms-small.txt zu Deinem Astro-Blog hinzu. Mit @4hse/astro-llms-txt Integration, Excerpt-Limit und Content-Schutz.

S

schutzgeist

7 min read
llms.txt zum Astro-Blog hinzufügen, Anleitung

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.txt automatisch 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 DocSets
  • llms-full.txt: Inhalt aller Seiten als Markdown
  • llms-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.txt oder strukturierte DocSets
  • Kein onlyStructure Modus

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-parserehype-remarkremark-gfmremark-stringify)
  • MDX-Komponenten, Expressive Code und Tabs werden automatisch behandelt
  • onlyStructure Modus für kompakte Übersicht
  • DocSets mit include, promote, demote Pattern-Matching

Nachteile:

  • Funktioniert nur beim Build (nicht im Dev-Server)
  • Kein eingebautes Excerpt-Limit (ich habe es selbst hinzugefügt)

Vergleich

KriteriumCustom API Route@4hse/astro-llms-txt
AufwandMittel (eigene Logik)Gering (Konfiguration)
MDX-SupportManuell implementierenAutomatisch
onlyStructureNicht vorhandenEingebaut
Excerpt-LimitSelbst implementierenSelbst erweitern
Dev-ServerJaNur Build
DocSetsNicht vorhandenMit 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 string Lösung: Das Plugin nutzt picomatch intern. Leere Strings in promote oder include Arrays verursachen diesen Fehler. Ich habe stattdessen ['index', 'blog/**'] verwendet.

  • Fehler: File not found: dist/de/index.html Lösung: Der include: ['**'] Pattern matcht alle Seiten. Wenn einige Seiten nicht generiert werden (z.B. durch draft: true), erscheint diese Warnung. Sie ist harmlos, die Datei wird einfach übersprungen.

  • Fehler: llms-full.txt ist zu groß Lösung: Ich habe excerptLength auf 600 Zeichen gesetzt. Damit schütze ich meinen Content und die Datei bleibt kompakt. Die Anpassung erforderte eine kleine Modifikation des Plugins in node_modules/@4hse/astro-llms-txt/src/index.ts, dort habe ich die DocSet-Schnittstelle um excerptLength und visitLinkText erweitert.

  • Fehler: KI-Systeme finden die Datei nicht Lösung: Stelle sicher, dass llms.txt im Wurzelverzeichnis Deiner Domain liegt (z.B. https://www.irc-coding.de/llms.txt). Bei Deployments auf Vercel oder Netlify wird die Datei aus dist/ 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?

Eine Textdatei im Wurzelverzeichnis einer Webseite, die Inhalt in maschinenlesbarem Format für KI-Suchmaschinen bereitstellt. Spezifikation auf llmstxt.org.

2. Wie unterscheidet sich llms.txt von robots.txt?

robots.txt steuert das Crawling. llms.txt stellt Inhalt vereinfacht für KI-Modelle bereit.

3. Brauche ich llms.txt für SEO?

Nicht für klassisches SEO, sondern für KI-Suchmaschinen wie ChatGPT, Perplexity und Claude.

4. Welche Dateien generiert das Plugin?

Drei: llms.txt (Index), llms-full.txt (Inhalt als Markdown), llms-small.txt (nur Struktur).

5. Funktioniert das Plugin im Dev-Server?

Nein, es nutzt den astro:build:done Hook und liest HTML aus dist/. Nur nach einem Build.

6. Kann ich llms.txt ohne Plugin erstellen?

Ja, per custom API Route. Bei vielen MDX-Artikeln ist der Wartungsaufwand aber hoch.

7. Wie schütze ich Content vor Kopie?

Setze excerptLength auf 600 Zeichen. llms-full.txt enthält dann nur Auszüge mit Links zur Original-Seite.

8. Was bedeutet onlyStructure?

Generiert nur Überschriften und Listen ohne Inhalt. Geeignet für llms-small.txt.

9. Wie konfiguriere ich promote und demote?

promote sortiert Seiten nach oben, demote nach unten. Nutze Glob-Patterns wie blog/**. Keine leeren Strings.

10. Wo muss llms.txt liegen?

Im Wurzelverzeichnis der Domain, z.B. https://www.deine-seite.de/llms.txt.

11. Ist llms.txt ein offizieller Standard?

Community-Standard, kein W3C- oder IETF-Standard. Spezifikation auf llmstxt.org.

12. Kann ich Unterseiten ausschließen?

Ja, mit include-Patterns in DocSets, z.B. nur blog/** einbinden.

13. Was kostet das Plugin?

Open Source und kostenlos. Quellcode auf github.com/4hse/astro-llms-txt.

14. Wie viele Zeichen für excerptLength?

600 Zeichen sind ein guter Wert. KI versteht den Kontext, kann aber nicht den ganzen Artikel kopieren.

15. Funktioniert llms.txt mit SSG und SSR?

Mit SSG ja, die Dateien werden beim Build generiert. Mit SSR funktioniert das Plugin nicht, da es fertige HTML-Dateien aus dist/ liest.

Article Quellen und Bezugspunkte!

Zurück zum Blog
Share:

Ähnliche Beiträge