Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 55bba230a2ce508b0cd79ff85d0f16c00382bb9c)
+++ src/routes/posts.js	(revision 3dd99d358789ab51bb5361e4c9a6beaf3c1857be)
@@ -7,5 +7,5 @@
 import ejs from 'ejs';
 import db from '../config/database.js';
-import { requireAuth, requireSiteManager } from '../middleware/auth.js';
+import { requireAuth, requireSiteManager, isViewer } from '../middleware/auth.js';
 import { renderPage } from '../middleware/render.js';
 import { recordPageview, recordPostView } from '../services/StatsService.js';
@@ -591,5 +591,7 @@
   const site = res.locals.site;
   const items = site ? ActivityPubService.getNotifications(site.slug, 80) : [];
-  if (site) ActivityPubService.markNotificationsSeen(site.slug); // viewing = seen → clears the bell badge
+  // viewing = seen → clears the bell badge. A viewer (kijker) may look but must not
+  // mutate state (the global write-guard only catches non-GET, not this GET-side effect).
+  if (site && !isViewer(req.session.user)) ActivityPubService.markNotificationsSeen(site.slug);
   renderPage(req, res, 'pages/fedi-notifications', { pageTitle: 'Meldingen', bodyClass: 'on-special', items });
 });
