>_ DevTrendsde

Sprache

Start

Sprachen

Bereiche

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicherheit
JavaScript

Wie man jede Seite einem neuronalen Netzwerk zuführt – ohne Werbemüll und zusätzliche Tokens

Wenn man einem LLM-Agenten normales Web-Scraping übergibt, fliegen Unmengen von Navigationsmenüs, Footern, Bannern und Markup-Wänden sofort in den Kontext. Zusammen mit einem Artikel von ein paar tausend Wörtern erhält der Agent ein Megabyte Müll, der Kontext-Window füllt sich, und die Token-Rechnung wächst.

Ich bin kürzlich auf das Projekt pullmd gestoßen. Es ist ein selbstgehosteter Dienst, der eine Seite oder Datei-URL entgegennimmt und sauberes Markdown zurückgibt. Kein zusätzlicher Ballast, keine Metadaten-Duplizierung im Text, und ein paar Features, die in Standard-Parsing-Bibliotheken oft fehlen.

PullMD Web-Interface (helles und dunkles Theme)

Was steckt unter der Haube

Die Projekt-Ersteller haben mehrere erprobte Tools kombiniert. Wenn eine URL eingeht, prüft der Dienst zunächst auf natives Markdown von Cloudflare. Falls das nicht vorhanden ist, kommen Mozilla Readability und Trafilatura zum Einsatz.

Manchmal ist eine Seite vollständig mit React oder Vue gebaut und das nackte HTML gibt eine leere Vorlage zurück. In diesen Situationen startet pullmd einen Playwright-Sidecar, rendert die Seite in headless Chromium und extrahiert den Inhalt von dort. Wenn man den schweren Browser nicht braucht, kann man den Playwright-Container einfach über docker-compose.yml deaktivieren und spart damit etwa 3,7 GB Speicherplatz. In diesem Fall arbeitet der Dienst über normales statisches Parsing weiter.

Alle Ergebnisse landen in einer lokalen SQLite-Datenbank. Wenn dieselbe URL innerhalb einer Stunde erneut angefordert wird, kommt die Antwort sofort aus dem Cache. Jeder Konvertierung wird ein permanenter Kurzbezeichner zugewiesen, sodass ein Link wie /s/:id als stabiler Feed verwendet werden kann.

Hauptfunktionen, die Zeit sparen

Reddit- und Hacker-News-Threads

Normalerweise scheitern Skripte an Kommentarseiten. Hier ist der Parser speziell darauf trainiert, Reddit- und Hacker-News-Threads zu parsen. Die Ausgabe ist ein strukturierter Kommentarbaum mit erhaltenem Nesting, Autoren und Upvote-Zahlen.

Seitensuche via BM25

Eine der besten Neuerungen in der dritten Version des Dienstes. Wenn man den ?query=как настроить базу-Parameter in der Query übergibt, gibt pullmd nicht die gesamte mehrseitige Dokumentation zurück. Der Dienst zerlegt Markdown anhand der Überschriften in Abschnitte, rankt sie mit dem BM25-Algorithmus und liefert nur die Blöcke, die die Frage beantworten. Bei großen Seiten reduziert das den Token-Verbrauch um 70% bis 95%, was die Agentenleistung spürbar beschleunigt. Tabellen und Code-Blöcke bleiben intakt.

Dokumente, Video und Audio

Der Dienst bewältigt mehr als nur Webseiten. Wenn man einen MarkItDown-Sidecar von Microsoft anschließt, verarbeitet er PDFs, Word-Dateien, Excel-Tabellen, PowerPoint-Präsentationen und EPUB-E-Books.

Wenn man einen YouTube-Link übergibt, extrahiert der Dienst das Video-Transkript mit klickbaren Zeitstempeln – keine API-Keys erforderlich. Für Bild- und Audio-Erkennung kann man einen Endpunkt für jedes OpenAI-kompatible Modell oder einen lokalen Server wie Ollama konfigurieren.

Integrierter MCP-Server und Integrationen

Für die Agenten-Integration stehen mehrere Verbindungsoptionen zur Verfügung:

  • Standard-REST-API (GET /api?url=...)
  • MCP-Server für Cursor, Claude Desktop und andere kompatible Clients
  • Fertiges Plugin für Claude Code
  • PWA-Web-Interface mit Drag-and-Drop-Dateiunterstützung direkt aus dem Datei-Explorer

Sicherheit und SSRF-Schutz

Dienste, die Daten von beliebigen URLs abrufen, sind anfällig für SSRF-Angriffe. Ein Benutzer könnte dem Parser eine interne Netzwerkadresse oder Cloud-Provider-Metadaten füttern.

pullmd enthält eine Adressvalidierung. Vor jeder Anfrage und bei jedem Redirect-Schritt werden die IP-Adressen des Hosts aufgelöst. Wenn eine Adresse in private Netzwerkbereiche, Loopback, CGNAT oder Cloud-Metadaten-Bereiche wie 169.254.169.254 fällt, wird die Anfrage sofort mit einem 403-Fehler blockiert. Für absichtlichen Zugriff auf ein internes Wiki können Adressen über die Umgebungsvariable PULLMD_ALLOWED_HOSTS auf die Whitelist gesetzt werden.

So wird es deployed

Für den grundlegenden Start reicht eine einzige docker-compose.yml-Datei:

mkdir pullmd && cd pullmd
curl -O https://raw.githubusercontent.com/AeternaLabsHQ/pullmd/main/docker-compose.yml
docker compose up -d

Der Dienst startet auf Port 3000. Authentifizierung ist standardmäßig deaktiviert, aber man kann sie konfigurieren: sowohl Einzeladministrator-Modus als auch Multi-User-Modus mit Registrierung und Session-Cookies werden unterstützt.

Beispiel für eine einfache API-Anfrage:

curl "http://localhost:3000/api?url=https://news.ycombinator.com/item?id=1"

Um sich mit Claude Code zu verbinden, reicht ein einziger Befehl:

claude mcp add --transport http pullmd http://localhost:3000/mcp

Für wen es gedacht ist

Das Projekt ist sauber und praktisch geworden. Es hat weniger als fünfhundert GitHub-Sterne, aber die Codebase wirkt ausgereift: saubere modulare Struktur, detaillierte Migrationsdatei und minimale externe Abhängigkeiten im Haupt-Container.

Das Tool eignet sich für alle, die RAG-Pipelines bauen, lokale KI-Assistenten einrichten oder einfach einen praktischen Reader für lange Artikel im Markdown-Format wollen. Wenn man Cursor oder Claude Code nutzt und sie oft bittet, Dokumentation von einem Link zu prüfen, spart einem eine lokale pullmd-Instanz eine Menge Kontext und Nerven.

Ähnliche Projekte