Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 5a6a457ca2bf625de84ec03d20f7757480337fde)
+++ src/services/ActivityPubService.js	(revision d7526bda1a7c629688e73f463847832f685c3381)
@@ -153,7 +153,20 @@
     cc: [`${aId}/followers`],
     tag: Array.isArray(post.tags) ? post.tags.map((t) => ({ type: 'Hashtag', name: '#' + String(t).replace(/\s+/g, '') })) : [],
+    replies: `${id}/replies`,
   };
   if (attachment.length) note.attachment = attachment;
   return note;
+}
+
+// All reply note URIs on a local post (inbound fediverse replies + our own
+// outbound replies) — backs the Note's `replies` Collection so remote servers
+// can fetch the whole thread.
+export function getReplyUris(base, postId) {
+  const out = [];
+  try {
+    for (const r of db.prepare("SELECT object_uri FROM ap_interactions WHERE kind = 'reply' AND post_id = ? AND object_uri != '' ORDER BY created_at").all(postId)) out.push(r.object_uri);
+    for (const r of db.prepare('SELECT id FROM ap_outbox WHERE post_id = ? ORDER BY rowid').all(postId)) out.push(`${base}/ap/notes/${r.id}`);
+  } catch { /* non-fatal */ }
+  return out;
 }
 
@@ -906,3 +919,4 @@
   getNotifications, listBlocks, isBlockedAny, blockTarget, unblock,
   deliverWithRetry, enqueueDelivery, processDeliveryQueue, startDeliveryWorker,
+  getReplyUris,
 };
