Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 82079add2859eb42986c97e651ed5be8d0bec7d1)
+++ src/routes/posts.js	(revision 594cc50a8129da2718ac2bcd302e38991cd42653)
@@ -86,4 +86,5 @@
   'tag', 'type', 'user', 'users', 'artiesten', 'leden', 'favorieten', 'feed.xml', 'atom.xml', 'sitemap.xml',
   'manifest.webmanifest', 'sw.js', 'favicon.ico', 'favicon.svg', 'assets',
+  'authorize_interaction',
 ]);
 
@@ -509,4 +510,36 @@
   return { newerPost, olderPost };
 }
+
+// ==================== REMOTE INTERACTION (reply to a fediverse post as your site) ====================
+// Standard fediverse "reply from your own server" landing endpoint. A post page
+// elsewhere bounces the visitor here with ?uri=<remote post>; the site owner
+// composes a reply that federates back to that post.
+router.get('/authorize_interaction', requireSiteManager, async (req, res) => {
+  const site = res.locals.site;
+  const uri = (req.query.uri || '').toString();
+  let target = null;
+  try { target = await ActivityPubService.resolveRemoteNote(uri); } catch { /* ignore */ }
+  renderPage(req, res, 'pages/authorize-interaction', {
+    pageTitle: 'Reageer via de fediverse',
+    bodyClass: 'on-special',
+    uri,
+    target,
+    siteTitle: site ? site.title : '',
+  });
+});
+
+router.post('/authorize_interaction', requireSiteManager, async (req, res) => {
+  const site = res.locals.site;
+  const uri = (req.body.uri || '').toString();
+  const text = (req.body.text || '').toString();
+  if (site && uri && text.trim()) {
+    try {
+      const parent = await ActivityPubService.resolveRemoteNote(uri);
+      if (parent) await ActivityPubService.deliverReply(site, { postId: '', postSlug: null, parent, text });
+    } catch (e) { console.warn('[AP] remote reply failed:', e.message); }
+  }
+  // Send them to the post they replied to so they can see the thread.
+  res.redirect(uri && /^https?:\/\//i.test(uri) ? uri : (res.locals.siteUrlBase || '/'));
+});
 
 // ==================== VIEW POST (last route â€” catches /:slug) ====================
