Hoe je elke pagina aan een neuraal netwerk kunt voeren zonder reclame en extra tokens
Wanneer je een LLM-agent reguliere webscraping geeft, vliegt er meteen een hoop navigatiemenu's, footers, banners en markup-wanden de context in. Samen met een artikel van een paar duizend woorden krijgt de agent een megabyte aan troep, raakt het contextvenster vol en groeit de tokenrekening.
Ik ben onlangs het pullmd-project tegengekomen. Het is een zelfgehoste service die een pagina- of bestand-URL accepteert en schone Markdown retourneert. Geen extra bloat, geen metadataduplicatie in de tekst, en een paar functies die vaak ontbreken in standaard parsing-bibliotheken.
Wat er onder de motorkap zit
De makers van het project hebben verschillende bewezen tools gecombineerd. Wanneer een URL binnenkomt, controleert de service eerst op native Markdown van Cloudflare. Als dat er niet is, schieten Mozilla Readability en Trafilatura te hulp.
Soms is een pagina volledig gebouwd met React of Vue en retourneert kale HTML een lege template. In zulke situaties draait pullmd een Playwright sidecar, rendert de pagina in headless Chromium en extraheert de content van daaruit. Als je de zware browser niet nodig hebt, kun je de Playwright-container gewoon uitschakelen via docker-compose.yml, waardoor je ongeveer 3,7 GB schijfruimte bespaart. In dat geval werkt de service gewoon door via reguliere statische parsing.
Alle resultaten komen terecht in een lokale SQLite-database. Als je dezelfde URL binnen een uur opnieuw opvraagt, komt het antwoord direct uit de cache. Elke conversie krijgt een permanente korte identifier, dus een link zoals /s/:id kan worden gebruikt als stabiele feed.
Belangrijkste functies die tijd besparen
Reddit- en Hacker News-threads
Meestal struikelen scripts over commentaarpagina's. Hier is de parser specifiek getraind om Reddit- en Hacker News-threads te parsen. De output is een gestructureerde commentaarboom met behouden nesting, auteurs en upvote-tellers.
Pagina-zoekfunctie via BM25
Een van de beste vondsten in de derde versie van de service. Als je de ?query=как настроить базу parameter in de query meestuurt, retourneert pullmd niet alle documentatie van meerdere pagina's. De service breekt Markdown op in secties per headers, rankt ze met het BM25-algoritme en levert alleen de blokken die de vraag beantwoorden. Voor grote pagina's vermindert dit het tokengebruik met 70% tot 95%, wat de agentprestaties merkbaar versnelt. Tabellen en codeblokken blijven intact.
Documenten, video en audio
De service verwerkt meer dan alleen websites. Wanneer je een MarkItDown sidecar van Microsoft aansluit, verwerkt het PDF's, Word-bestanden, Excel-spreadsheets, PowerPoint-presentaties en EPUB-e-books.
Als je een YouTube-link doorgeeft, extraheert de service het videotranscript met klikbare timestamps—geen API-sleutels nodig. Voor beeld- en audiotherkenning kun je een endpoint configureren voor elk OpenAI-compatibel model of lokale server zoals Ollama.
Ingebouwde MCP-server en integraties
Verschillende connectie-opties zijn beschikbaar voor agent-integratie:
- Standaard REST API (
GET /api?url=...) - MCP-server voor Cursor, Claude Desktop en andere compatibele clients
- Kant-en-klare plugin voor Claude Code
- PWA-webinterface met drag-and-drop bestandsondersteuning rechtstreeks vanuit de verkenner
Beveiliging en SSRF-bescherming
Services die data ophalen van willekeurige URL's zijn kwetsbaar voor SSRF-aanvallen. Een gebruiker kan de parser een intern netwerkadres of cloudprovider-metadata voeren.
pullmd bevat adresvalidatie. Voor elke aanvraag en bij elke redirect-stap worden de IP-adressen van de host opgelost. Als een adres binnen privé-netwerkbereiken, loopback, CGNAT of cloud-metadatabereiken zoals 169.254.169.254 valt, wordt de aanvraag onmiddellijk geblokkeerd met een 403-fout. Voor opzettelijke toegang tot een interne wiki kunnen adressen worden goedgekeurd via de PULLMD_ALLOWED_HOSTS environment variable.
Hoe te deployen
Voor basis-opstart volstaat een enkel docker-compose.yml bestand:
mkdir pullmd && cd pullmd
curl -O https://raw.githubusercontent.com/AeternaLabsHQ/pullmd/main/docker-compose.yml
docker compose up -d
De service draait op poort 3000. Authenticatie is standaard uitgeschakeld, maar je kunt het configureren: zowel single administrator-modus als multi-user-modus met registratie en sessiecookies worden ondersteund.
Voorbeeld van een eenvoudige API-aanvraag:
curl "http://localhost:3000/api?url=https://news.ycombinator.com/item?id=1"
Om te verbinden met Claude Code volstaat een enkele opdracht:
claude mcp add --transport http pullmd http://localhost:3000/mcp
Waarvoor is het geschikt
Het project is schoon en praktisch gebleken. Het heeft minder dan vijfhonderd GitHub-sterren, maar de codebase oogt volwassen: schone modulaire structuur, gedetailleerd migratiebestand en minimale externe afhankelijkheden in de main-container.
Het gereedschap is geschikt voor wie RAG-pipelines bouwt, lokale AI-assistenten opzet, of gewoon een handige lezer voor lange artikelen in Markdown-formaat wil. Als je Cursor of Claude Code gebruikt en ze vaak vraagt om documentatie vanaf een link te bekijken, bespaart een lokale pullmd-instantie je plenty context en zenuwen.
Gerelateerde projecten