Index: src/routes/prutter.js
===================================================================
--- src/routes/prutter.js	(revision 7bc636b391c66ac399c33e54f7173a022c6a3cbd)
+++ src/routes/prutter.js	(revision 8afbdd6572a947bce4726d5aa0d0aa0d6c7e5067)
@@ -18,5 +18,5 @@
 import db from '../config/database.js';
 import { renderPage } from '../middleware/render.js';
-import { requireAuth } from '../middleware/auth.js';
+import { requireAuth, isViewer } from '../middleware/auth.js';
 import PermissionsService from '../services/PermissionsService.js';
 
@@ -55,4 +55,10 @@
 // ==================== START / RESUME CONVERSATION ====================
 router.get('/new', requirePrutter, (req, res) => {
+  // Een gesprek starten is een schrijf-actie (INSERT) — een kijker mag dat niet.
+  // De globale guard pakt dit niet omdat het een GET is, dus expliciet blokkeren.
+  if (isViewer(req.session.user)) {
+    res.status(403);
+    return renderPage(req, res, 'pages/viewer-blocked', { pageTitle: 'Kijker-modus', bodyClass: 'on-special' });
+  }
   const targetUsername = (req.query.to || '').toString().trim();
   if (!targetUsername) {
@@ -90,6 +96,7 @@
   const messages = prutter.getMessages(conv.id, 200, 0).reverse();
 
-  // Mark inbound messages as read
-  prutter.markAsRead(conv.id, me);
+  // Mark inbound messages as read — sla over voor kijkers (markAsRead is een
+  // UPDATE; een GET valt buiten de globale guard, dus hier expliciet skippen).
+  if (!isViewer(req.session.user)) prutter.markAsRead(conv.id, me);
 
   renderPage(req, res, 'pages/prutter-conversation', {
