Index: src/middleware/render.js
===================================================================
--- src/middleware/render.js	(revision eef691ed4ca5b407f1c937176796ce2b368aeec0)
+++ src/middleware/render.js	(revision 8aa85d06c34d1b16a4f9440e4c87fac432d0cf6e)
@@ -18,5 +18,5 @@
 import { isViewer } from './auth.js';
 import { getSetting } from '../services/SettingsService.js';
-import { isPremium as isPremiumInstance, premiumEnabled } from '../services/PatreonService.js';
+import { isPremium as isPremiumInstance, premiumEnabled, premiumUnlocked } from '../services/PatreonService.js';
 import { PLATFORMS as PLATFORMS_CATALOG } from '../services/PlatformIcons.js';
 
@@ -80,4 +80,5 @@
     isPremium: isPremiumInstance(),
     premiumEnabled: premiumEnabled(),
+    premiumUnlocked: premiumUnlocked(),
     siteOwnerAvatar,
     site: _site,
Index: src/routes/prutter.js
===================================================================
--- src/routes/prutter.js	(revision eef691ed4ca5b407f1c937176796ce2b368aeec0)
+++ src/routes/prutter.js	(revision 8aa85d06c34d1b16a4f9440e4c87fac432d0cf6e)
@@ -19,4 +19,6 @@
 import { renderPage } from '../middleware/render.js';
 import { requireAuth, isViewer } from '../middleware/auth.js';
+import { getTenancy } from '../services/SettingsService.js';
+import { premiumUnlocked } from '../services/PatreonService.js';
 import PermissionsService from '../services/PermissionsService.js';
 
@@ -31,7 +33,15 @@
 }
 
-// Middleware: require both auth + Prutter enabled
+// Middleware: Prutter = Hub-feature achter de premium-laag, plus login.
+//  - alleen in Hub-modus (DM tussen artiesten/leden van het collectief)
+//  - vergrendeld als de premium-laag aan staat maar Patreon niet gekoppeld is
+//    (premium uit = niet gegate → huidige gedrag, demo's blijven werken)
+//  - geen anonieme DMs
 function requirePrutter(req, res, next) {
   if (!siteAllowsDM(req, res)) return res.status(404).send('Prutter not enabled on this site');
+  if (getTenancy() !== 'hub') return res.status(404).send('Prutter is alleen beschikbaar in Hub-modus');
+  if (!premiumUnlocked()) {
+    return res.status(403).send('Prutter is een premium-functie — koppel Patreon in Beheer → Instellingen.');
+  }
   return requireAuth(req, res, next);
 }
Index: src/services/PatreonService.js
===================================================================
--- src/services/PatreonService.js	(revision eef691ed4ca5b407f1c937176796ce2b368aeec0)
+++ src/services/PatreonService.js	(revision 8aa85d06c34d1b16a4f9440e4c87fac432d0cf6e)
@@ -82,4 +82,11 @@
 }
 
+// Is een premium-feature beschikbaar? True als de premium-laag UIT staat (dan is
+// niets gegate — huidige gedrag), of AAN én deze instance is entitled. False alleen
+// als premium aan staat maar er geen geldige Patreon-koppeling is (= betaalmuur).
+export function premiumUnlocked() {
+  return !premiumEnabled() || isPremium();
+}
+
 export function entitlementStatus() {
   return {
Index: src/views/pages/admin-settings.ejs
===================================================================
--- src/views/pages/admin-settings.ejs	(revision eef691ed4ca5b407f1c937176796ce2b368aeec0)
+++ src/views/pages/admin-settings.ejs	(revision 8aa85d06c34d1b16a4f9440e4c87fac432d0cf6e)
@@ -44,6 +44,7 @@
   <section class="set-card" style="margin-top:1rem">
     <h2>Premium (Patreon)</h2>
-    <p class="set-help">Ontgrendel de premium-modules (Hub-modus, Statistieken, Fan-login)
-      met je <strong>$10-lifetime</strong> Patreon-steun. De app en alle updates blijven gratis.</p>
+    <p class="set-help">Ontgrendel de premium-modules (Hub-modus, Statistieken, Fan-login,
+      Prutter-DMs) met je <strong>$10-lifetime</strong> Patreon-steun. De app en alle updates
+      blijven gratis.</p>
     <% if (premium.premium) { %>
       <p class="set-help"><strong>✓ Premium actief.</strong>
Index: src/views/pages/user.ejs
===================================================================
--- src/views/pages/user.ejs	(revision eef691ed4ca5b407f1c937176796ce2b368aeec0)
+++ src/views/pages/user.ejs	(revision 8aa85d06c34d1b16a4f9440e4c87fac432d0cf6e)
@@ -27,5 +27,5 @@
         <% } %>
       </p>
-      <% if (user && user.id !== author.id && site && site.enable_prutter) { %>
+      <% if (user && user.id !== author.id && site && site.enable_prutter && (typeof tenancy !== 'undefined' && tenancy === 'hub') && (typeof premiumUnlocked === 'undefined' || premiumUnlocked)) { %>
         <p class="user-actions">
           <a href="<%= siteUrlBase %>/prutter/new?to=<%= encodeURIComponent(author.username) %>" class="btn btn-primary">💬 Send DM</a>
Index: src/views/partials/bottom-tab.ejs
===================================================================
--- src/views/partials/bottom-tab.ejs	(revision eef691ed4ca5b407f1c937176796ce2b368aeec0)
+++ src/views/partials/bottom-tab.ejs	(revision 8aa85d06c34d1b16a4f9440e4c87fac432d0cf6e)
@@ -13,5 +13,5 @@
 const _canPost     = !!(user && (typeof canMutate === 'undefined' || canMutate)
                         && permissions && permissions.canCreatePost && permissions.canCreatePost(user, site));
-const _hasPrutter  = !!(user && site && site.enable_prutter && (typeof tenancy !== 'undefined' && tenancy === 'hub'));
+const _hasPrutter  = !!(user && site && site.enable_prutter && (typeof tenancy !== 'undefined' && tenancy === 'hub') && (typeof premiumUnlocked === 'undefined' || premiumUnlocked));
 const _ownProfile  = user ? ('/users/' + user.username) : null;
 
Index: src/views/partials/topnav.ejs
===================================================================
--- src/views/partials/topnav.ejs	(revision eef691ed4ca5b407f1c937176796ce2b368aeec0)
+++ src/views/partials/topnav.ejs	(revision 8aa85d06c34d1b16a4f9440e4c87fac432d0cf6e)
@@ -15,5 +15,5 @@
 const _isAdmin     = typeof bodyClass !== 'undefined' && bodyClass.indexOf('on-admin') >= 0;
 const _hasSearch   = !site || site.show_search === undefined || site.show_search;
-const _hasPrutter  = user && site && site.enable_prutter && (typeof tenancy !== 'undefined' && tenancy === 'hub');
+const _hasPrutter  = user && site && site.enable_prutter && (typeof tenancy !== 'undefined' && tenancy === 'hub') && (typeof premiumUnlocked === 'undefined' || premiumUnlocked);
 const _canPost     = user && (typeof canMutate === 'undefined' || canMutate)
                      && permissions && permissions.canCreatePost && permissions.canCreatePost(user, site);
