Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision 8cb1dc7b23142c8a8ec44f7659178b51a2da4ddf)
+++ src/config/database.js	(revision 640b39c77691f7bb8ddb40f536fc678f88b8df8d)
@@ -41,4 +41,6 @@
   // Google OAuth: koppel een Google-account aan een user (login via Google).
   ensureColumn('users', 'google_sub', 'TEXT');
+  // Read-only/kijk-account: kan alles bekijken maar geen wijzigingen doen.
+  ensureColumn('users', 'readonly', 'INTEGER DEFAULT 0');
   // Site-level moderation toggle. 'trust' = auto-approve, 'moderate' = pending until reviewed.
   ensureColumn('sites', 'comments_moderation_mode', "TEXT DEFAULT 'trust'");
Index: src/routes/auth.js
===================================================================
--- src/routes/auth.js	(revision 8cb1dc7b23142c8a8ec44f7659178b51a2da4ddf)
+++ src/routes/auth.js	(revision 640b39c77691f7bb8ddb40f536fc678f88b8df8d)
@@ -76,4 +76,5 @@
     id: user.id, username: user.username, email: user.email, role: user.role,
     avatar_url: user.avatar_url, palette: user.palette, theme: user.theme,
+    readonly: !!user.readonly,
   };
   res.redirect(next || '/');
@@ -290,4 +291,5 @@
       id: user.id, username: user.username, email: user.email, role: user.role,
       avatar_url: user.avatar_url, palette: user.palette, theme: user.theme,
+      readonly: !!user.readonly,
     };
     res.redirect(next || '/');
Index: src/server.js
===================================================================
--- src/server.js	(revision 8cb1dc7b23142c8a8ec44f7659178b51a2da4ddf)
+++ src/server.js	(revision 640b39c77691f7bb8ddb40f536fc678f88b8df8d)
@@ -164,4 +164,14 @@
 });
 
+// Read-only/kijk-accounts: alles bekijken mag, niets wijzigen. Blokkeert elke
+// state-wijzigende methode (de login-POST zelf zet de sessie pas, dus die valt
+// hier nog niet onder).
+app.use((req, res, next) => {
+  if (req.session?.user?.readonly && req.method !== 'GET' && req.method !== 'HEAD' && req.method !== 'OPTIONS') {
+    return res.status(403).send('Demo-account: alleen-lezen — wijzigen is uitgeschakeld.');
+  }
+  next();
+});
+
 app.use('/auth', authRoutes);
 app.use('/account', accountRoutes);
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision 8cb1dc7b23142c8a8ec44f7659178b51a2da4ddf)
+++ src/views/shell.ejs	(revision 640b39c77691f7bb8ddb40f536fc678f88b8df8d)
@@ -238,4 +238,10 @@
 
 <body class="<%= bodyClass || 'on-home' %> has-bottom-tab" data-feed-view="<%= _e(safeSite.feed_view_default || 'timeline') %>" data-grid-cols="3">
+
+<% if (user && user.readonly) { %>
+  <div style="position:sticky;top:0;z-index:50;background:#e8b04b;color:#1a1a1a;text-align:center;font-size:0.85rem;font-weight:600;padding:0.4rem 1rem;">
+    👁️ Demo — alleen-lezen: je kunt alles bekijken, maar niets wijzigen.
+  </div>
+<% } %>
 
 <%# Geen shell-chrome (masthead/profile-header/view-switcher/bottom-tab) op:
