Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 41a7637a2e5b561b6a96b9a2791ddd41145c13c3)
+++ src/routes/posts.js	(revision a885afc878cdd6df0962a173a88ddd8f69f820ec)
@@ -86,5 +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',
+  'authorize_interaction', 'fediverse',
 ]);
 
@@ -542,4 +542,23 @@
   }
   res.redirect('/authorize_interaction?sent=1&uri=' + encodeURIComponent(uri));
+});
+
+// Manage / delete your own outbound fediverse replies (site owner only).
+router.get('/fediverse', requireSiteManager, (req, res) => {
+  const site = res.locals.site;
+  const items = site ? ActivityPubService.listOutbox(site.slug) : [];
+  renderPage(req, res, 'pages/authorize-interaction', {
+    pageTitle: 'Mijn fediverse-reacties', bodyClass: 'on-special',
+    manage: items, uri: '', target: null, sent: false, siteTitle: site ? site.title : '',
+  });
+});
+
+router.post('/fediverse/:id/delete', requireSiteManager, async (req, res) => {
+  const site = res.locals.site;
+  if (site) {
+    try { await ActivityPubService.deliverOutboxDelete(site, req.params.id); }
+    catch (e) { console.warn('[AP] outbox delete failed:', e.message); }
+  }
+  res.redirect(req.get('Referer') || `${res.locals.siteUrlBase || ''}/fediverse`);
 });
 
@@ -783,7 +802,10 @@
     db.prepare('SELECT 1 FROM post_likes WHERE post_id = ? AND user_id = ?').get(post.id, req.session.user.id));
 
-  // Inbound fediverse activity (replies/likes/boosts) for this post.
-  let fediverse = { replies: [], outReplies: [], likeCount: 0, announceCount: 0, total: 0 };
-  try { fediverse = ActivityPubService.getInteractions(post.id); } catch { /* non-fatal */ }
+  // Inbound fediverse activity (threaded) for this post.
+  let fediverse = { thread: [], likeCount: 0, announceCount: 0, total: 0 };
+  try {
+    const _apBase = (process.env.PUBLIC_BASE_URL || `${req.protocol}://${req.get('host')}`).replace(/\/+$/, '');
+    fediverse = ActivityPubService.getInteractions(post.id, _apBase);
+  } 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));
