Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision e5fc801d6c108445c8ef0e4607a37607cce78b4f)
+++ src/services/ActivityPubService.js	(revision 44c9f3f0c84f78f0ffcb9f810d8c0724be501de8)
@@ -3502,13 +3502,25 @@
  */
 export function feedCursor(slug) {
-  const max = (sql, ...args) => { try { const r = db.prepare(sql).get(...args); return (r && r.n) || 0; } catch { return 0; } };
-  const t = max('SELECT MAX(rowid) AS n FROM ap_timeline WHERE slug = ?', slug);
-  const m = max('SELECT MAX(rowid) AS n FROM ap_mentions WHERE slug = ?', slug);
-  const o = max('SELECT MAX(rowid) AS n FROM ap_outbox WHERE site_slug = ?', slug);
-  const r = max(`SELECT MAX(i.rowid) AS n FROM ap_interactions i
-                   JOIN posts p ON p.id = i.post_id
-                   JOIN sites s ON s.id = p.site_id
-                  WHERE s.slug = ? AND i.kind = 'reply'`, slug);
-  return `${t}.${m}.${o}.${r}`;
+  try {
+    const r = db.prepare('SELECT MAX(rev) AS n FROM ap_feed_state WHERE slug = ?').get(slug);
+    return String((r && r.n) || 0);
+  } catch { return '0'; }
+}
+
+/**
+ * Wat er sinds `rev` met deze tijdlijn gebeurd is: welke berichten er nieuw zijn,
+ * bewerkt, of weg.
+ *
+ * Nog niet gebruikt door een leespad -- de vorm van de aankomst is shaer-of7 en
+ * de "bewerkt"-markering is daar nog een open beslissing. Maar de gegevens
+ * ontstaan hoe dan ook bij het bijhouden van de merksteen, en dit is de enige
+ * plek waar ze samen te lezen zijn.
+ */
+export function feedChangesSince(slug, rev, limit = 200) {
+  try {
+    return db.prepare(`SELECT object_uri, kind, rev FROM ap_feed_state
+                        WHERE slug = ? AND rev > ? ORDER BY rev ASC LIMIT ?`)
+      .all(slug, parseInt(rev, 10) || 0, limit);
+  } catch { return []; }
 }
 
@@ -5364,5 +5376,5 @@
   buildActor, buildNote, buildCreate, buildOutbox, buildFollowers, buildFollowing, buildFeatured,
   followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete, deliverUpdate, deliverActorUpdate, resyncFeaturedPins,
-  feedCursor, waitForFeedChange,
+  feedCursor, feedChangesSince, waitForFeedChange,
   getInteractions, getInteractionById, setInteractionBoosted, setInteractionLiked, buildReplyNote, getOutboxNote, getSentNotes, deliverReply, resolveRemoteNote, noteAudience, mayReadNote,
   listOutbox, deliverOutboxDelete, deliverOutboxUpdate, deliverDirectNote,
