Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 7c44c1227391a3e62327e785d8a67b661aaae489)
+++ src/routes/posts.js	(revision de3d24b1b5f65ddc12b43239cbde13c70c92dfe0)
@@ -538,5 +538,5 @@
     // Resolve + deliver in the background so Send responds instantly.
     ActivityPubService.resolveRemoteNote(uri)
-      .then((parent) => parent && ActivityPubService.deliverReply(site, { postId: '', postSlug: null, parent, text }))
+      .then((parent) => parent && ActivityPubService.deliverReply(site, { postId: parent.localPostId || '', postSlug: null, parent, text }))
       .catch((e) => console.warn('[AP] remote reply failed:', e.message));
   }
Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 7c44c1227391a3e62327e785d8a67b661aaae489)
+++ src/services/ActivityPubService.js	(revision de3d24b1b5f65ddc12b43239cbde13c70c92dfe0)
@@ -537,4 +537,7 @@
   const actor = await fetchActor(actorUri).catch(() => null);
   const ai = actorInfo(actor, actorUri);
+  // Is what we're replying to a post (or a comment) on one of OUR posts? If so,
+  // link our reply to that local post so it shows nested in the post thread.
+  const localTgt = findThreadTarget(note.id, (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''));
   // If this note is itself a reply (a comment), also reach the original post's
   // author so THEIR server threads our reply under the comment.
@@ -564,4 +567,5 @@
     images,
     threadInbox,                                            // post author's inbox (if a comment)
+    localPostId: localTgt ? localTgt.post_id : '',          // our post this belongs to (if any)
     preview: HtmlSanitizerService.toPlainText(note.content || '').slice(0, 240),
   };
