Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision c16e0a5a2c2c866ae09afb2b0996809746bc8e4b)
+++ src/routes/posts.js	(revision 3a2c9d3bd2a16914b0e05ace0ec9a4b522932dd6)
@@ -7,5 +7,5 @@
 import ejs from 'ejs';
 import db from '../config/database.js';
-import { requireAuth } from '../middleware/auth.js';
+import { requireAuth, requireSiteManager } from '../middleware/auth.js';
 import { renderPage } from '../middleware/render.js';
 import { recordPageview, recordPostView } from '../services/StatsService.js';
@@ -749,6 +749,8 @@
 
   // Inbound fediverse activity (replies/likes/boosts) for this post.
-  let fediverse = { replies: [], likeCount: 0, announceCount: 0, total: 0 };
+  let fediverse = { replies: [], outReplies: [], likeCount: 0, announceCount: 0, total: 0 };
   try { fediverse = ActivityPubService.getInteractions(post.id); } catch { /* non-fatal */ }
+  // Owner/admin of this site may reply back to a fediverse interaction.
+  const canManageSite = !!(req.session?.user && PermissionsService.canAdminSite(req.session.user, site));
 
   renderPage(req, res, 'pages/post', {
@@ -760,4 +762,5 @@
     totalComments,
     fediverse,
+    canManageSite,
     likeCount,
     likedByMe,
@@ -769,4 +772,20 @@
 });
 
+// ── Reply back to a fediverse interaction (site owner/admin only) ──
+router.post('/posts/:slug/fedi-reply', requireSiteManager, async (req, res) => {
+  const site = res.locals.site;
+  if (!site) return res.status(404).send('Site required');
+  const post = db.prepare('SELECT id, slug FROM posts WHERE site_id = ? AND slug = ?').get(site.id, req.params.slug);
+  if (!post) return res.status(404).send('Not found');
+  const parent = ActivityPubService.getInteractionById(req.body.interaction_id);
+  const text = (req.body.text || '').toString();
+  if (parent && parent.post_id === post.id && text.trim()) {
+    try {
+      await ActivityPubService.deliverReply(site, { postId: post.id, postSlug: post.slug, parent, text });
+    } catch (e) { console.warn('[AP] reply send failed:', e.message); }
+  }
+  res.redirect(`${res.locals.siteUrlBase || ''}/${post.slug}#fediverse`);
+});
+
 export default router;
 export { postNeighbors };
