PullMD Teil 3: Mehr als Reddit, mehr als Readability – Einfach erklärt
Das hier ist eine Geschichte in drei Akten. Erst sprengt eine spontane Tippfehler-Frage die Grenzen eines Werkzeugs, das ich für genau einen Zweck gebaut hatte. Dann wächst es in kleinen Schritten weiter. Und am Ende finde ich einen Fehler, der wochenlang still unter allem lief — ohne dass jemand etwas davon merkte.
Wer Teil 2 gelesen hat, weiß: drei Wochen lief mein Markdown-Service still vor sich hin. Nur für Reddit-Posts. Nur auf meinem Handy. Nur für mich.
Erst mal: was ist hier los?
Das Tool nimmt eine Internet-Adresse — also einen Link, zum Beispiel zu einem Blog-Artikel — und gibt mir den Text dieses Artikels in einem ganz einfachen Format zurück. Das Format heißt Markdown und ist nur Text mit ein paar Sternchen für Überschriften und Listen, ohne den ganzen Drumherum-Müll wie Werbung, Menüs oder Cookie-Banner.
Warum will ich das? Weil ich diesen sauberen Text dann in einen Chat mit der KI packe und über den Inhalt reden kann.
Akt 1: Der Pivot — als das Tool plötzlich mehr können musste
Am Vormittag des 20. März wollte ich aus Versehen einen ganz normalen Artikel einlesen — also einen Link, der gar nichts mit Reddit zu tun hatte. Was zurückkam, war nichts. Leeres Ergebnis.
Verständlich. Ich hatte den Service ja nur für Reddit gebaut. Für alles andere gab es schlicht keinen Weg.
Also tippte ich in den Chat mit Claude hinein:
„die URL soll auch bei normalen seiten im markdown erscheinen… das war doch bisher nicht so oder?“
Die Antwort war klar: Nein, ging bisher nicht. Mein Tool saß in einem Käfig, den ich selbst gebaut hatte. Reddit zuerst, hatte ich gesagt. Aber jetzt brauchte ich: jede Webseite. Nicht nur eine.
Drei Wege statt einem
Die Lösung waren drei verschiedene Pfade — je nachdem, was für eine Webseite reinkommt:
Pfad eins: Mozilla Readability. Das ist eine fertige Bibliothek, die Mozilla für den Firefox-Lesemodus entwickelt hat — also genau das Ding, das Artikel-Text aus einer Webseite herausholt und alles drumherum wegwirft. Eine Art „Reinheits-Filter“ für Webseiten. Dazu ein zweites kleines Werkzeug namens Turndown, das den gefilterten Text dann ins Markdown-Format umbaut.
Pfad zwei: Cloudflare. Cloudflare ist eine Firma, durch deren Server viele Webseiten laufen. Für manche Seiten bietet Cloudflare schon fertig sauberen Text an — ohne dass ich selbst irgendwas filtern muss. Wenn das verfügbar ist, nehme ich das. Schneller, zuverlässiger.
Pfad drei: Der bisherige Reddit-Pfad bleibt unverändert für Reddit-Links.
Drei Wege, wo vorher einer war. Der Käfig war offen.
Akt 2: Die Reifephase — kleine Verbesserungen im April
Im April fing ich an, mir Notizen zu machen — kein richtiges Konzept, eher eine Sammlung von Fragen, die mir beim Benutzen auffielen. Die Hauptfrage war: Was fehlt eigentlich, wenn nicht ich den Text lese, sondern eine KI ihn weiterverarbeiten soll?
Ein Mensch füllt Lücken im Kopf automatisch. Eine KI nicht. Sie braucht Struktur.
Daraus wurden drei kleine Verbesserungen.
Tabellen, die als Tabellen ankommen
Das alte Umbau-Werkzeug Turndown konnte mit Tabellen nichts anfangen. Hatte eine Webseite eine Tabelle, kam beim Umbau nur Chaos heraus — die Zeilen und Spalten waren weggebügelt.
Auch Code-Blöcke — also kleine Programm-Schnipsel — kamen ohne Sprach-Etikett an. Das ist ungefähr so, als bekäme man ein Zitat aus einem Buch, ohne den Hinweis, in welcher Sprache es war.
Das Umbau-Werkzeug haben wir ausgetauscht. Das neue versteht Tabellen, behält Sprach-Etiketten bei Code, und unterstützt sogar Häkchen-Listen. Ein Zeilen-Tausch in der Verarbeitung — aber sofort viel bessere Ergebnisse.
Zusatz-Informationen mitliefern
Bis dahin lieferte mein Tool nur den nackten Text. Kein Titel, kein Autor, kein Datum. Das ist okay, wenn ich selber lese. Aber wenn eine KI mit dem Text weiterarbeiten soll, fehlt ihr der Kontext.
Also bauten wir einen kleinen Helfer ein, der diese Zusatz-Informationen aus jeder Webseite herausholt: Titel, Beschreibung, Autor, Veröffentlichungsdatum. Diese Infos kommen jetzt als kurzer Block am Anfang jedes Texts mit.
Notfall-Plan, wenn der Reinheits-Filter versagt
Readability — der Reinheits-Filter — funktioniert nicht überall. Bei Bezahlschranken, bei Seiten die nur mit JavaScript laufen, bei seltsam gebauten Seiten — da kommt manchmal nur ein winziger Text-Schnipsel heraus. Sichtbar zu wenig.
Statt in solchen Fällen aufzugeben, gibt es jetzt einen Notfall-Plan: nehme einfach den gesamten Seiten-Inhalt, putze ihn nur grob durch, und liefere das. Im Zusatz-Info-Block steht dann „Notfall-Pfad“, damit ich später sehen kann, wie oft das passiert ist.
Bis hierher war alles in kleinen Schritten. Dann kam der 25. April.
Akt 3: Der Fehler, der wochenlang lebte
Eigentlich wollte ich nur eine einfache Frage beantworten: Ist Readability wirklich der beste Reinheits-Filter? Oder gibt es einen besseren?
Also habe ich einen Vergleich aufgesetzt. 15 echte Webseiten, drei verschiedene Filter, alles parallel laufen lassen. Einer der Filter war Trafilatura — eine Bibliothek aus der Python-Welt, die ursprünglich für Web-Archive entwickelt wurde und besonders gut darin ist, auch aus schwierigen Seiten noch ordentlich Text herauszuholen.
Beim Auswerten der Ergebnisse fiel mir etwas Komisches auf. Die Ergebnisse von Readability sahen anders aus, als ich erwartet hatte. Kürzer, rauer, irgendwie ungelenker. Nicht das, was ich vom Firefox-Lesemodus kannte.
Ich grub mich in den Code und folgte dem Pfad zurück, den jede Anfrage nimmt. Was ich fand, war unangenehm.
Der eingebaute Schalter, der falsch stand
Beim Reddit-Pfad braucht man die Kommentare unter einem Post. Also gab es einen Schalter: „Kommentare mitnehmen — ja oder nein?“. Für Reddit stand er auf „ja”.
Aber: dieser Schalter stand standardmäßig auf „ja“ — für alle Anfragen. Auch für ganz normale Webseiten. Und wenn er auf „ja“ stand, übersprang das Tool den Reinheits-Filter komplett und nahm stattdessen einen einfacheren Weg — den gesamten Seiten-Inhalt nur grob geputzt.
Das hieß: wochenlang lief mein Tool für ganz normale Webseiten überhaupt nicht durch Readability. Was ich die ganze Zeit für „Readability-Ergebnisse“ gehalten hatte, war eigentlich nur grob geputzter Roh-Inhalt.
Mein Vergleich hatte wochenlang die falsche Sache gegen Trafilatura gemessen.
Der Fix war eine einzige Zeile Code: bei normalen Webseiten den Schalter auf „nein“ stellen.
Was der ehrliche Vergleich zeigte
Nach dem Fix machte der Vergleich endlich Sinn. Und plötzlich war klar:
Auf einer kleinen persönlichen Blog-Seite holte Readability gerade mal etwa 100 Zeichen Text heraus. Trafilatura holte fast 15.000 Zeichen aus derselben Seite. Das ist mehr als hundertmal so viel.
Bei einer Tech-News-Seite: etwa 470 Zeichen mit Readability, etwa 1.700 mit Trafilatura. Bei einem anderen Blog: 80 Prozent mehr Inhalt durch Trafilatura.
Aber: bei Seiten mit Tabellen — Wikipedia zum Beispiel, oder Programmier-Dokumentation — war Readability besser. Es hielt die Struktur sauberer.
Also keine Entweder-Oder-Entscheidung. Beide Filter laufen jetzt parallel. Eine einfache Bewertung entscheidet pro Anfrage, welches Ergebnis besser aussieht — und das wird ausgeliefert.
Wie das Tool entscheidet, was „besser“ ist
Die Bewertung ist absichtlich simpel — fünf Faustregeln:
- Ist der Text länger als 500 Zeichen? Punkt.
- Ist das Verhältnis von extrahiertem Text zur Original-Seiten-Größe über zwei Prozent? Punkt.
- Hat die Original-Seite überhaupt einen Artikel-Bereich? Punkt.
- Ist mindestens eine Überschrift drin? Punkt.
- Sind mindestens drei richtige Absätze drin? Punkt.
Wer die meisten Punkte sammelt, gewinnt. Reddit-Posts und Cloudflare-Texte bekommen Bonus-Punkte, weil sie schon „sauber von der Quelle her“ sind.
Der Punktestand landet in einem versteckten Etikett bei jeder Antwort, damit ich später nachsehen kann, wie zuverlässig das Tool für eine bestimmte Webseite war.
Was sagt es, wenn man wochenlang einen Fehler übersieht?
Das ist die unangenehme Frage am Ende dieser Geschichte.
Der Output war „gut genug“. Grob geputzter Roh-Inhalt enthält für viele Seiten den meisten relevanten Text — auch ohne Reinheits-Filter. Wenn der Unterschied zwischen „richtig“ und „falsch“ schwer zu sehen ist, sieht man ihn eben nicht. Nicht weil man unaufmerksam ist — sondern weil es kein sichtbares Signal gibt.
Daraus zog ich eine Konsequenz: eine kleine Datenbank, die für jede Anfrage mitschreibt, welcher Pfad genommen wurde, wie viele Punkte das Ergebnis bekam, wie lange es gedauert hat. Nach 30 Tagen werden die Einträge automatisch gelöscht.
Dazu ein winziger Abfrage-Punkt: „Zeig mir die letzten sieben Tage“. Daraus sehe ich dann: wie viele Anfragen liefen durch welchen Filter? Welche Seiten haben durchschnittlich schlechte Punktestände? Verschiebt sich gerade irgendetwas?
Wenn das nächste Mal eine Einstellung still und heimlich den falschen Pfad wählt, sehe ich es in der Statistik. Es ist keine Garantie. Aber es ist ein Signal.
Die Lehre
Für jedes selbst-gebaute Tool gilt: entweder du baust dir einen Blick in die Maschine ein — oder du fliegst blind.
Der Blick muss nicht groß sein. Eine kleine Tabelle und ein einfacher Abfrage-Punkt reichen als erster Schritt. Aber ohne irgendetwas davon kann ein Tool wochenlang die falsche Antwort geben — und niemand merkt es.
Was als nächstes kam
Drei Pfade, ein Bewertungs-System, eine Schnittstelle für KI-Helfer und eine App auf dem Handy — aber das alles lief noch unter einem alten Codenamen. Den musste ich aus juristischen Gründen ablegen, bevor das Tool öffentlich werden konnte.
→ Teil 4: Vom Tool für mich zum OSS-Projekt
Teil 3 von 9 der PullMD Serie.
← PullMD Teil 2: Vom Spec zum laufenden Container | PullMD Teil 4: Vom Tool für mich zum OSS-Projekt →