Index: src/middleware/render.js
===================================================================
--- src/middleware/render.js	(revision eb2fe0897cef9cbb78c919b3de1e4ba2d3056e5a)
+++ src/middleware/render.js	(revision 283f618f8d224646dfaad3dc3b04b9ac7c092b92)
@@ -17,5 +17,5 @@
 import PermissionsService from '../services/PermissionsService.js';
 import { isViewer } from './auth.js';
-import { getSetting } from '../services/SettingsService.js';
+import { getSetting, apEnabled } from '../services/SettingsService.js';
 import { isPremium as isPremiumInstance, premiumEnabled, premiumUnlocked } from '../services/PatreonService.js';
 import ActivityPubService from '../services/ActivityPubService.js';
@@ -122,4 +122,5 @@
     canSeeBeheer,
     canManageFedi,
+    apEnabled: apEnabled(),
     isViewer: _isViewer,
     canMutate: !_isViewer,
Index: src/routes/activitypub.js
===================================================================
--- src/routes/activitypub.js	(revision eb2fe0897cef9cbb78c919b3de1e4ba2d3056e5a)
+++ src/routes/activitypub.js	(revision 283f618f8d224646dfaad3dc3b04b9ac7c092b92)
@@ -17,6 +17,11 @@
 import AP from '../services/ActivityPubService.js';
 import { apReadLimiter, apInboxLimiter } from '../middleware/rate-limit.js';
+import { apEnabled } from '../services/SettingsService.js';
 
 const router = express.Router();
+// The whole fediverse layer can be turned off (solo "no federation" mode):
+// then /ap/*, WebFinger and NodeInfo are simply gone — the site is undiscoverable
+// and unfederatable.
+router.use((req, res, next) => { if (!apEnabled()) return res.status(404).end(); next(); });
 // Generous per-IP baseline over all /ap/* (reads). The inbox POST gets an
 // additional, tighter cap inline (it triggers outbound fetches).
Index: src/routes/admin-settings.js
===================================================================
--- src/routes/admin-settings.js	(revision eb2fe0897cef9cbb78c919b3de1e4ba2d3056e5a)
+++ src/routes/admin-settings.js	(revision 283f618f8d224646dfaad3dc3b04b9ac7c092b92)
@@ -82,4 +82,5 @@
     smtp: mailerStatus(),
     footerNewsletter: getSetting('footer_newsletter') === '1',
+    apEnabledSetting: getSetting('ap_enabled', '1') !== '0',
     success: req.query.success || null,
     error: req.query.error || null,
@@ -166,4 +167,10 @@
 });
 
+// Fediverse (ActivityPub) on/off. Off = no federation + no fediverse reactions.
+router.post('/ap', requireGod, (req, res) => {
+  setSetting('ap_enabled', req.body.ap_enabled ? '1' : '0');
+  res.redirect('/admin/settings?success=' + encodeURIComponent('Fediverse-instelling opgeslagen'));
+});
+
 // Send a test email to a specified address (or the logged-in user).
 router.post('/smtp/test', requireGod, async (req, res) => {
Index: src/services/SettingsService.js
===================================================================
--- src/services/SettingsService.js	(revision eb2fe0897cef9cbb78c919b3de1e4ba2d3056e5a)
+++ src/services/SettingsService.js	(revision 283f618f8d224646dfaad3dc3b04b9ac7c092b92)
@@ -49,2 +49,9 @@
   setSetting('tenancy', m);
 }
+
+// ActivityPub / fediverse federation. ON by default. '0' = off: the site does
+// not federate, /ap/* is gone, and the "from the fediverse" reactions disappear
+// — which (since native comments were removed) means no comments at all.
+export function apEnabled() {
+  return getSetting('ap_enabled', '1') !== '0';
+}
Index: src/services/i18n.js
===================================================================
--- src/services/i18n.js	(revision eb2fe0897cef9cbb78c919b3de1e4ba2d3056e5a)
+++ src/services/i18n.js	(revision 283f618f8d224646dfaad3dc3b04b9ac7c092b92)
@@ -188,4 +188,7 @@
     'aset.newsletter_help_2': 'van je site zodat bezoekers zich op elke pagina kunnen inschrijven. (De volledige aanmeldpagina blijft op',
     'aset.newsletter_show_footer': 'Aanmeldveld in de footer tonen',
+    'aset.fediverse': 'Fediverse (ActivityPub)',
+    'aset.fediverse_help': 'Laat je site meedoen met de fediverse: mensen op Mastodon (of een andere Klonkt) kunnen je volgen, liken en reageren — en die reacties verschijnen onder je posts. Zet je dit uit, dan federeert je site niet en zijn er geen reacties (een rustige, op zichzelf staande blog).',
+    'aset.fediverse_toggle': 'Fediverse aan (volgen, liken, reageren)',
     'aset.email_smtp': 'E-mail (SMTP)',
     'aset.smtp_help_1': 'Nodig om de',
@@ -1196,4 +1199,7 @@
     'aset.newsletter_help_2': 'of your site so visitors can subscribe from any page. (The full sign-up page stays at',
     'aset.newsletter_show_footer': 'Show sign-up field in the footer',
+    'aset.fediverse': 'Fediverse (ActivityPub)',
+    'aset.fediverse_help': 'Let your site join the fediverse: people on Mastodon (or another Klonkt) can follow, like and reply — and those replies show up under your posts. Turn this off and your site does not federate and has no comments (a quiet, standalone blog).',
+    'aset.fediverse_toggle': 'Fediverse on (follow, like, comment)',
     'aset.email_smtp': 'Email (SMTP)',
     'aset.smtp_help_1': 'Needed to',
@@ -2203,4 +2209,7 @@
     'aset.newsletter_help_2': 'deiner Site, damit sich Besucher auf jeder Seite eintragen können. (Die vollständige Anmeldeseite bleibt unter',
     'aset.newsletter_show_footer': 'Anmeldefeld in der Fußzeile anzeigen',
+    'aset.fediverse': 'Fediverse (ActivityPub)',
+    'aset.fediverse_help': 'Lass deine Seite am Fediverse teilnehmen: Leute auf Mastodon (oder einem anderen Klonkt) können dir folgen, liken und antworten — und diese Antworten erscheinen unter deinen Beiträgen. Schaltest du das aus, föderiert deine Seite nicht und hat keine Kommentare (ein ruhiger, eigenständiger Blog).',
+    'aset.fediverse_toggle': 'Fediverse an (Folgen, Liken, Kommentieren)',
     'aset.email_smtp': 'E-Mail (SMTP)',
     'aset.smtp_help_1': 'Erforderlich, um den',
Index: src/views/pages/admin-settings.ejs
===================================================================
--- src/views/pages/admin-settings.ejs	(revision eb2fe0897cef9cbb78c919b3de1e4ba2d3056e5a)
+++ src/views/pages/admin-settings.ejs	(revision 283f618f8d224646dfaad3dc3b04b9ac7c092b92)
@@ -117,4 +117,18 @@
   </section>
   <% } %>
+
+  <%# Fediverse (ActivityPub) on/off. Off = no federation + no fediverse reactions,
+      which (since native comments were removed) means no comments at all. %>
+  <section class="set-card" style="margin-top:1rem">
+    <h2><%= t('aset.fediverse') %></h2>
+    <p class="set-help"><%= t('aset.fediverse_help') %></p>
+    <form method="post" action="/admin/settings/ap" class="set-form">
+      <label class="set-toggle" style="display:flex;align-items:center;gap:.6rem;cursor:pointer">
+        <input type="checkbox" name="ap_enabled" value="1" <%= (typeof apEnabledSetting === 'undefined' || apEnabledSetting) ? 'checked' : '' %>>
+        <span><%= t('aset.fediverse_toggle') %></span>
+      </label>
+      <div class="set-actions"><button type="submit" class="btn btn-primary"><%= t('aset.save') %></button></div>
+    </form>
+  </section>
 
   <%# E-mail / SMTP — required for sending newsletters, notify-mails and password resets. %>
Index: src/views/pages/admin.ejs
===================================================================
--- src/views/pages/admin.ejs	(revision eb2fe0897cef9cbb78c919b3de1e4ba2d3056e5a)
+++ src/views/pages/admin.ejs	(revision 283f618f8d224646dfaad3dc3b04b9ac7c092b92)
@@ -57,8 +57,10 @@
       <a href="/admin/shows" class="btn"><%= t('admin.b_agenda') %></a>
     <% } %>
-    <a href="/tijdlijn" class="btn">🌐 <%= t('tl.title') %></a>
-    <a href="/meldingen" class="btn">🔔 <%= t('notif.title') %></a>
-    <a href="/fediverse" class="btn">🐘 <%= t('admin.b_fediverse') %></a>
-    <a href="/blokkeren" class="btn">🚫 <%= t('blk.title') %></a>
+    <% if (typeof apEnabled === 'undefined' || apEnabled) { %>
+      <a href="/tijdlijn" class="btn">🌐 <%= t('tl.title') %></a>
+      <a href="/meldingen" class="btn">🔔 <%= t('notif.title') %></a>
+      <a href="/fediverse" class="btn">🐘 <%= t('admin.b_fediverse') %></a>
+      <a href="/blokkeren" class="btn">🚫 <%= t('blk.title') %></a>
+    <% } %>
     <a href="/admin/updates" class="btn"><%= t('admin.b_updates') %></a>
     <a href="/admin/handleiding" class="btn"><%= t('admin.b_help') %></a>
Index: src/views/pages/post.ejs
===================================================================
--- src/views/pages/post.ejs	(revision eb2fe0897cef9cbb78c919b3de1e4ba2d3056e5a)
+++ src/views/pages/post.ejs	(revision 283f618f8d224646dfaad3dc3b04b9ac7c092b92)
@@ -70,5 +70,5 @@
   <% var _postAbsUrl = (typeof ogOrigin !== 'undefined' && ogOrigin ? ogOrigin : '') + (typeof _base !== 'undefined' && _base ? _base : '') + '/' + post.slug; %>
   <% var _fedi = (typeof fediverse !== 'undefined' && fediverse) ? fediverse : { thread: [], likeCount: 0, announceCount: 0 }; %>
-  <% if (post.status === 'published') { %>
+  <% if (post.status === 'published' && (typeof apEnabled === 'undefined' || apEnabled)) { %>
     <section class="post-fediverse post-comments" id="fediverse">
       <h2 class="comments-heading"><%= t('fedi.heading') %></h2>
Index: src/views/partials/profile-header.ejs
===================================================================
--- src/views/partials/profile-header.ejs	(revision eb2fe0897cef9cbb78c919b3de1e4ba2d3056e5a)
+++ src/views/partials/profile-header.ejs	(revision 283f618f8d224646dfaad3dc3b04b9ac7c092b92)
@@ -70,5 +70,5 @@
       <%# Follow-via-fediverse: a compact icon in the links row (keeps the header
           short), and hidden for the owner — you don't follow yourself. %>
-      <% var _showFollow = (typeof canManageFedi === 'undefined' || !canManageFedi) && site && site.slug; %>
+      <% var _showFollow = (typeof canManageFedi === 'undefined' || !canManageFedi) && site && site.slug && (typeof apEnabled === 'undefined' || apEnabled); %>
       <% if (_profileLinks.length || _showFollow) { %>
         <% const _platforms = (typeof platforms_catalog !== 'undefined' && platforms_catalog) || {}; %>
