Datawijs met Thijs

thijs@datawijs:~/het-lab$ cat lab-006.md

LAB-006 [draait] · productie · sinds sep 2026

Plop, een weekblad dat zichzelf samenstelt

vraag:
Kan een automatisch weekblad me elke week materiaal van buiten mijn bubbel aanleveren (artikelen, podcasts, boeken)? De naam Plop komt van het geluid dat je hoort als je een bubbel doorprikt. Het idee komt van the-syllabus.com, maar dan speciaal voor mij gemaakt.
opzet:
Elke avond haalt het systeem feeds op uit de krochten van het internet en labelt het de stukken met een lokaal model (Qwen). Op vrijdag stelt het een editie van 5 tot 7 stukken samen, ongeveer 2 tot 3 uur lezen en luisteren. Zakelijk en tech blijven er bewust uit. De samenstelling is steeds 1 stuk aan de rand van mijn bubbel, 2 tot 3 verder weg, 1 of 2 podcasts en 1 wildcard, om mij nog verder uit m'n comfortzone te halen.
uitkomst:
Iedere zaterdag om 7:00 krijg ik een mooi vormgegeven mail met een bijbehorende magazinesite en de optie om het als EPUB te downloaden en op m'n e-reader te zetten. Daarnaast komen de aanbevolen podcastafleveringen via RSS automatisch in een eigen privéfeed in m'n podcastspeler.
werkte niet:
Sommige bronnen, zoals Historiek, Knowable en Atlas Obscura, weren bots. Die staan in alleen-link-modus, zonder leesweergave of EPUB. Ik heb niet geprobeerd dat te omzeilen.

Verder zijn de bubbels zo sterk dat ik nog niet de rust heb gevonden om ervoor te gaan zitten, vooral voor de artikelen. De podcastfeed is wel handig, maar ik heb nog geen handige manier gevonden om me op de originele podcast te abonneren als ik iets interessants tegenkom.

Zelf bouwen

De code van Plop is privé, maar zo bouw je zoiets zelf. Het model leest en beoordeelt, een vast script kiest. Zo blijft de selectie voorspelbaar en weet je achteraf waarom iets erin stond.

Wat je nodig hebt

  • Een machine die 's avonds aanstaat, zoals een kleine server of een oude laptop.
  • Een taalmodel met een API. Dat kan een cloudmodel zijn, of een lokaal model met een OpenAI-compatibele API via llama.cpp of Ollama, zoals bij Plop. Lokaal is een model van rond de 30 miljard parameters ruim genoeg. Kleiner werkt ook, maar minder consistent.
  • Een scripttaal die je kent. Een feedbibliotheek (zoals feedparser) en een functie die de tekst uit HTML haalt, helpen. Met alleen de standaardbibliotheek kan het ook, maar dat is lastiger dan het klinkt. (Snap je hier niks van? Claude is je vriend ;))
  • Een lijst bronnen met een RSS-feed.
  • Een korte beschrijving van je eigen smaak: waar je al veel over leest. Dat is je bubbel.

1. Bronnen kiezen

Begin met tien tot twintig feeds. Zet per bron in een configbestand: naam, feed-url, taal en een gewicht (hoe graag je die bron terugziet). Respecteer robots.txt: weert een site bots, haal dan alleen de samenvatting uit de feed en link naar het origineel.

2. Elke avond ophalen

Lees de feeds, haal van elk nieuw stuk de tekst op en bewaar alles in een kleine database (SQLite is genoeg). Sla per stuk op: bron, titel, url, datum, tekst en een status (opgehaald, gelabeld, fout).

3. Laten labelen door het model

Stuur elk stuk apart naar het model, met een vaste systeemprompt en je smaakbeschrijving vooraan en de tekst ingekort tot een paar duizend woorden. Vraag om JSON volgens een vast schema, zodat het antwoord altijd te verwerken is:

{
  "onderwerp": "een van je vaste onderwerpen",
  "kwaliteit": 4,
  "kwaliteit_reden": "één zin",
  "nabijheid": 2,
  "evergreen": true,
  "samenvatting": "twee zinnen",
  "waarom": "waarom dit het lezen waard is, als tip van een vriend"
}

nabijheid (1 tot 5) zegt hoe dicht een stuk bij je smaakbeschrijving ligt: 5 is midden in je bubbel, 1 ver erbuiten. Daar selecteer je straks op. evergreen zegt of het stuk over een maand nog net zo goed te lezen is.

Tips:

  • Zet de temperatuur laag (0,1) en, als je model dat kent, het "denken" uit. Dat is sneller en consistenter.
  • Als je met een klein lokaal model werkt, doe dan één verzoek tegelijk. Je lokale model wordt meestal niet sneller van parallelle verzoeken.

4. Vrijdagavond samenstellen

Kies de stukken met een vast script, niet met het model. Twee regels gelden altijd:

  • Een stuk komt nooit twee keer in een nummer. Houd bij welke stukken al eens gekozen zijn en sla die over.
  • Alleen evergreen stukken van de laatste vier weken komen in aanmerking. Zo krijg je geen nieuws dat al verouderd is als je het leest.

Daarbinnen kies je op nabijheid. Bij Plop is dat steeds 1 stuk aan de rand van de bubbel (nabijheid 3), 2 tot 3 verder weg (1 of 2), 1 of 2 podcasts en 1 wildcard, met de hoogste kwaliteit eerst, hooguit twee stukken per bron en samen niet langer dan drie uur lezen en luisteren. Laat het model daarna hooguit een titel of een korte inleiding voor het nummer schrijven.

5. Zaterdag verschijnen

Zet het nummer klaar als webpagina of mail en publiceer het op een vast moment. Plan de drie stappen met een timer (cron of systemd): elke avond ophalen en labelen, vrijdagavond samenstellen, zaterdagochtend publiceren.

Wat niet werkte bij het kiezen

Ik probeerde eerst met embeddings te meten hoe ver een stuk van mijn eigen notities af lag. Die score onderscheidde niets: de rangcorrelatie met wat ik zelf interessant vond, bleef rond 0,1. Het oordeel van het model zelf, gevraagd als nabijheid in het schema, deed dat wel. Meet dit eerst voordat je erop gaat selecteren: leg een week labels naast je eigen oordeel.

Klaar als

Open je minder dan 3 van de eerste 6 nummers, zet het dan uit of verander de bronnen. Dat is ook de regel die Plop zelf gebruikt.

thijs@datawijs:~/het-lab$ cd ..

Terug naar Het Lab

thijs@datawijs:~/het-lab$