Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 75ab393b61dbacf266594c3d44c01d8ad60781a1)
+++ src/routes/posts.js	(revision 7c62efb527b6d9b96c67754d6a8f37d0de4f6327)
@@ -485,6 +485,11 @@
   const uri = (req.query.uri || '').toString();
   const sent = !!req.query.sent;
-  let target = null;
-  if (!sent) { try { target = await ActivityPubService.resolveRemoteNote(uri); } catch { /* ignore */ } }
+  const followed = !!req.query.followed;
+  let target = null, followTarget = null;
+  if (!sent && !followed && uri) {
+    try { target = await ActivityPubService.resolveRemoteNote(uri); } catch { /* ignore */ }
+    // Not a post? Maybe the URI is a profile/actor → offer Follow, not reply.
+    if (!target) { try { followTarget = await ActivityPubService.resolveRemoteActor(uri); } catch { /* ignore */ } }
+  }
   renderPage(req, res, 'pages/authorize-interaction', {
     pageTitle: 'Interacteer via de fediverse',
@@ -492,5 +497,7 @@
     uri,
     target,
+    followTarget,
     sent,
+    followed,
     liked: !!req.query.liked,
     siteTitle: site ? site.title : '',
@@ -508,4 +515,15 @@
   }
   res.redirect('/authorize_interaction?liked=1&uri=' + encodeURIComponent(uri));
+});
+
+// Follow a remote actor from your own site (when the target is a profile, not a post).
+router.post('/authorize_interaction/follow', requireSiteManager, (req, res) => {
+  const site = res.locals.site;
+  const uri = (req.body.uri || '').toString();
+  if (site && uri) {
+    ActivityPubService.followActor(site, uri)
+      .catch((e) => console.warn('[AP] remote follow failed:', e.message));
+  }
+  res.redirect('/authorize_interaction?followed=1&uri=' + encodeURIComponent(uri));
 });
 
