Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision d97c58c1d15ec3570a575b49ec2da4ca41691ed1)
+++ src/services/ActivityPubService.js	(revision acbc9fc37db938981585559eac40eda58373493e)
@@ -390,5 +390,7 @@
     url: channelUrls(base, site),
     ...(channelCategory(site) ? { category: channelCategory(site) } : {}),
-    manuallyApprovesFollowers: isWard,
+    // …and the same honesty for the OWNER gate (Robins wens, 18-8): a site
+    // with approve_followers on holds follows pending until the owner decides.
+    manuallyApprovesFollowers: isWard || !!site.approve_followers,
     discoverable: true,
     inbox: `${id}/inbox`,
@@ -2474,4 +2476,27 @@
       }
       console.log('[AP] Follow', who, '→ ward', slug, '(gated, awaiting guardians)');
+      return 202;
+    }
+    // De eigenaarspoort (Robins wens, 18-8): met approve_followers aan wordt
+    // een Follow niet automatisch geaccepteerd — hij wacht in dezelfde
+    // wachtrij als een ward-follow, maar hier beslist de EIGENAAR, op
+    // /connect. Zo kan niemand een klonkt zomaar aan een hub of ander
+    // verzamelplatform hangen zonder dat de eigenaar ja heeft gezegd.
+    // Wards vallen hier nooit: de guardianpoort hierboven gaat vóór.
+    const ownerGate = db.prepare('SELECT approve_followers FROM sites WHERE slug = ?').get(slug);
+    if (ownerGate && ownerGate.approve_followers) {
+      const followId = (typeof act.id === 'string' && act.id) || `${who}#follow-${Date.now()}-${rid()}`;
+      Guardianship.follows.recordPending(slug, {
+        id: followId, follower: who, inbox: remote.inbox, sharedInbox,
+        name: fi.name, handle: fi.handle, icon: fi.icon, activity: act, quorum: 'owner',
+      });
+      const L = pushLang(slug);
+      pushEvent(slug, {
+        type: 'follow',
+        title: i18nT(L, 'push.n_folreq_t'),
+        body: i18nT(L, 'push.n_folreq_b', { who: fi.name || fi.handle || i18nT(L, 'notif.someone') }),
+        url: `${pushPrefix(slug)}/connect`,
+      });
+      console.log('[AP] Follow', who, '→', slug, '(awaiting owner approval)');
       return 202;
     }
