Index: .beads/.auto-import-issues.jsonl
===================================================================
--- .beads/.auto-import-issues.jsonl	(revision c4b24b3124b1464cef50b076ef0dee1b96d5f00c)
+++ .beads/.auto-import-issues.jsonl	(revision c4b24b3124b1464cef50b076ef0dee1b96d5f00c)
@@ -0,0 +1,1 @@
+{"size":32459,"mtime_ns":1785829499677029815}
Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 4f97b7090dcb51d0cbd1921a0dbaf3e6f051408b)
+++ src/services/ActivityPubService.js	(revision c4b24b3124b1464cef50b076ef0dee1b96d5f00c)
@@ -3407,10 +3407,21 @@
       : (repliesRef.id ? await signedGetJson(slug, repliesRef.id) : repliesRef);
   }
-  // ÉÉN pagina, met opzet: de eerste. Wie meer wil moet eerst kunnen zeggen
-  // waarom dertig directe antwoorden niet genoeg context is voor een gesprek.
-  let items = collectionItems(coll);
-  if (!items.length && coll && coll.first) {
-    const first = typeof coll.first === 'string' ? await signedGetJson(slug, coll.first) : coll.first;
-    items = collectionItems(first);
+  // De pagina-wandeling van collectReplyItems, maar met behoud van INLINE
+  // objecten (die niet opnieuw opgehaald hoeven). Niet "de eerste pagina":
+  // Mastodon serveert `first` als inline-pagina met LEGE items en een `next`
+  // waar de antwoorden echt staan -- wie alleen de eerste pagina leest, ziet
+  // op elke Mastodon-post een leeg gesprek. Dat was precies Barts melding
+  // (8-8, reacties op een vreemde post). Eigen posts maskeerden het: die
+  // gaan door de lokale kortsluiting en hebben orderedItems meteen vol.
+  let items = [];
+  let node = coll;
+  if (node && node.first && !collectionItems(node).length) {
+    node = typeof node.first === 'string' ? await signedGetJson(slug, node.first) : node.first;
+  }
+  let pages = 0;
+  while (node && pages++ < 3 && items.length < THREAD_VIEW_LIMIT) {
+    items.push(...collectionItems(node));
+    if (!node.next) break;
+    node = typeof node.next === 'string' ? await signedGetJson(slug, node.next) : node.next;
   }
   items = items.slice(0, THREAD_VIEW_LIMIT);
Index: test/thread.test.js
===================================================================
--- test/thread.test.js	(revision 4f97b7090dcb51d0cbd1921a0dbaf3e6f051408b)
+++ test/thread.test.js	(revision c4b24b3124b1464cef50b076ef0dee1b96d5f00c)
@@ -91,4 +91,31 @@
 });
 
+test('de Mastodon-vorm: first is een lege inline-pagina, de antwoorden staan op next', async () => {
+  // Precies wat Mastodon serveert en wat Barts melding (8-8) verklaarde: wie
+  // alleen de eerste pagina leest, ziet op elke Mastodon-post een leeg gesprek.
+  const MPOST = 'https://203.0.113.50/notes/masto-1';
+  const vorige = globalThis.fetch;
+  globalThis.fetch = async (url) => {
+    const u = String(url);
+    const json = (o) => new Response(JSON.stringify(o), { status: 200, headers: { 'content-type': 'application/activity+json' } });
+    if (u === MPOST) return json({
+      id: MPOST, type: 'Note', attributedTo: TANTE, content: '<p>toot</p>',
+      replies: {
+        id: `${MPOST}/replies`, type: 'Collection',
+        first: { type: 'CollectionPage', items: [], next: `${MPOST}/replies?page=true` },
+      },
+    });
+    if (u === `${MPOST}/replies?page=true`) return json({
+      type: 'CollectionPage',
+      items: [{ id: `${MPOST}/r1`, type: 'Note', attributedTo: TANTE, inReplyTo: MPOST, content: '<p>eerste echte antwoord</p>', published: '2026-08-02T10:00:00Z' }],
+    });
+    return vorige(url);
+  };
+  const uit = await AP.getThread('kind', MPOST, { isWard: false });
+  globalThis.fetch = vorige;
+  assert.equal(uit.notes.length, 1, 'het antwoord op de next-pagina is gevonden');
+  assert.ok(uit.notes[0].content.includes('eerste echte antwoord'));
+});
+
 test('de tweede lezing komt uit het geheugen, niet van het netwerk', async () => {
   let calls = 0;
