Ich betreibe dieses Blog auf einem self-hosted Stack und will genau wissen, wie gesund es ist — kaputte Links, Metadaten, Rankings, alles. Die Tools, die diese Fragen sauber beantworten, fangen bei rund 99 Dollar im Monat an, und ich brauchte die Antworten meist einmal pro Woche. Also habe ich mir in den letzten Wochen eigene gebaut: vier kleine Node-Skripte, jedes beantwortet eine Frage, jedes erzeugt einen Markdown-Report. Heute habe ich sie aufgeräumt und auf GitHub gestellt.
Das Ergebnis ist seo-geo-audit — MIT-lizenziert, insgesamt rund 1.500 Zeilen und null npm-Dependencies (eine Ausnahme, dazu gleich mehr). Jedes Tool ist ein einzelner Befehl, jeder Report ist pures Markdown — lesbar im Terminal, diffbar in Git, einfügbar in ein Issue.
Warum GEO? AI-Crawler führen dein JavaScript nicht aus
GEO — Generative Engine Optimization — fragt, ob AI-Antwortmaschinen wie ChatGPT, Claude oder Perplexity deine Seite tatsächlich lesen und zitieren können. Für mich wurde das konkret, als AI-Assistenten in meinen eigenen Analytics als Referrer auftauchten. Diese Besucher sind echt — sie kommen, weil eine AI deine Seite gelesen und verlinkt hat.
Der Haken: Die meisten AI-Crawler holen dein rohes Server-HTML und führen kein JavaScript aus. Google rendert deine Seite; GPTBot, ClaudeBot und PerplexityBot größtenteils nicht. Strukturierte Daten, die dein Framework client-seitig injiziert, sind für sie unsichtbar — auch wenn jede SEO-Browser-Extension sagt, alles sei in Ordnung. Dasselbe gilt für Metadaten, die Streaming-Frameworks in den Body statt in den initialen Head schreiben: Google verschiebt sie, ein JS-loser Crawler verpasst sie. Meine eigene Seite hatte sechs Seiten mit genau diesem Problem — und ich weiß es nur, weil der Crawler es als eigene Issue-Kategorie meldet.
Die vier Tools
seo-audit crawlt die Sitemap und danach jedes interne Link- und Bild-Ziel und analysiert das rohe Server-HTML — bewusst die JS-lose Sicht. Es prüft die Klassiker (Titles, Descriptions, Canonicals, hreflang, Open Graph, kaputte Links inkl. Redirect-Ketten, Sitemap-Hygiene) plus die GEO-Checks: nur client-seitig vorhandenes JSON-LD, in den Body gestreamte Metadaten, Lücken in der Überschriften-Hierarchie, dünner Content, llms.txt, in der robots.txt blockierte AI-Crawler.
seo-audit/run.sh https://deine-site.comperf-audit ist das eine Tool mit Dependency — es steuert per Playwright einen echten Browser. Es misst Lab-Core-Web-Vitals (LCP, CLS, FCP, TTFB, TBT) gegen Googles Schwellwerte, zieht echte Nutzerdaten (CrUX inkl. INP) über die kostenlose PageSpeed-Insights-API, trackt ein Performance-Budget pro Seite und — am nützlichsten — erfasst das DOM nach der Hydration, sodass du vergleichen kannst, was Google sieht und was AI-Crawler sehen.
gsc-fetch spricht mit der Search-Console-API und berechnet die zwei Listen, auf die ein Solo-Betreiber wirklich reagieren kann: Striking-Distance-Queries (Position 5–20 mit echten Impressionen — einen Title-Tweak von Seite 1 entfernt) und Low-CTR-Winner (schon Top 5, aber weniger Klicks als die Position hergibt, inklusive Schätzung der liegengelassenen Klicks). Die zweite Liste ist inzwischen wortwörtlich mein Redaktions-Backlog.
umami-fetch liest eine self-hosted Umami-v3-Instanz aus: Traffic-Kanäle, Top-Seiten, Custom Events, UTM-Kampagnen — und eine um Datacenter bereinigte Totals-Zeile, denn ein einzelnes Datacenter-Land entpuppte sich als ein Drittel meiner „Visits“, bevor ich angefangen habe, es abzuziehen. Umamis API filtert nur auf Gleichheit, also holt das Tool die Verdachts-Länder separat und rechnet selbst.
Was es auf meiner eigenen Seite gefunden hat
Das eigene Hundefutter zu essen war ernüchternd: sechs Seiten mit für JS-lose Crawler unsichtbaren Metadaten, achtzig zu lange Meta-Descriptions, ein kaputtes internes Link-Ziel, das ich wochenlang übersehen hatte, Bot-Traffic, der meine Besucherzahlen um die Hälfte aufgeblasen hat, und eine Brand-Query auf Platz 1 mit 0 % Klickrate. Nichts davon war in irgendeinem einzelnen Dashboard sichtbar. Ein Audit, das man in dreißig Sekunden neu laufen lassen kann, lässt sich deutlich schwerer ignorieren als ein Abo, in das man einmal im Monat schaut.
Philosophie
Ein Befehl, ein Markdown-Report. Kein Build-Step, keine Config-Datei mit achtzig Optionen, keine Plattform. Pure Node-Skripte, die man in einer Sitzung durchlesen und für die eigenen Bedürfnisse umbauen kann — scharfe kleine Messer, kein Schweizer Taschenmesser. Wenn ein Check für deinen Stack nicht passt: löschen, es ist deine Kopie.
FAQ
Ist es kostenlos?
Ja — MIT-Lizenz, keine Bezahlstufe. Die einzigen optionalen Kosten sind Dritt-APIs: PageSpeed Insights ist mit einem kostenlosen Google-API-Key frei, die Search Console ist frei, und Backlink-Daten sind das Einzige, wofür es wirklich keine kostenlose Quelle gibt (das Tool bindet einen Bezahl-Anbieter an, falls vorhanden — und sagt es ehrlich, falls nicht).
Was genau ist GEO?
Generative Engine Optimization: Inhalte so aufbereiten, dass AI-Antwortmaschinen sie lesen, parsen und zitieren können. In der Praxis überschneidet sich das stark mit technischem SEO — der Unterschied ist der Renderer. AI-Crawler lesen rohes HTML; was erst nach JavaScript-Ausführung existiert, existiert für sie nicht.
Brauche ich API-Keys?
Der Crawler braucht nichts — klonen und gegen jede beliebige Seite laufen lassen. PageSpeed-Felddaten brauchen einen kostenlosen Google-API-Key, die Search Console einen einmaligen OAuth-Flow (das Kit enthält einen dependency-freien Helfer, der den Refresh-Token erzeugt), und das Analytics-Tool deinen eigenen Umami-Login.
Loslegen
git clone https://github.com/lireking/seo-geo-audit
cd seo-geo-audit
seo-audit/run.sh https://deine-site.comMehr ist es nicht — das Repo liegt unter github.com/lireking/seo-geo-audit. Wenn es auf deiner Seite etwas meldet, das es nicht sollte (oder etwas übersieht, das es fangen müsste): Issue aufmachen. PRs willkommen — der Scope bleibt absichtlich klein.


