Index: src/assets/css/style.css
===================================================================
--- src/assets/css/style.css	(revision 88838bce5b42c9e3fac0481e15e8b4531af35c4e)
+++ src/assets/css/style.css	(revision 520c993bff8f6cefc630de1cf827bd12aa0fe70a)
@@ -2549,4 +2549,12 @@
 .feed-reader .read-post:last-child .read-anker { scroll-snap-align: none; }
 
+/* ELK BERICHT EEN EIGEN SCHERM, als de site dat wil (Instellingen -> Weergave).
+   Aan: een kort bericht vult het scherm en je ziet het volgende pas na een snap.
+   Uit (standaard): de stroom is bericht na bericht, zonder lege ruimte eronder.
+   Dit stond eerst vast op AAN, is toen vast op UIT gezet omdat een kort bericht
+   een halve pagina leegte gaf onder "Replies and reactions", en is nu een keuze
+   -- want welke van de twee prettiger leest hangt af van wat je schrijft. */
+body[data-reader-pages="1"] .feed-reader .read-post { min-height: 100svh; }
+
 /* Een lijn tussen twee berichten: zonder grens is een stroom een lange brij. */
 .feed-reader .read-post + .read-post { border-top: 1px solid color-mix(in srgb, currentColor 12%, transparent); }
Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision 88838bce5b42c9e3fac0481e15e8b4531af35c4e)
+++ src/config/database.js	(revision 520c993bff8f6cefc630de1cf827bd12aa0fe70a)
@@ -209,4 +209,10 @@
   // het is een mediaquery, dus geen resize-afhandeling en geen flikkering.
   ensureColumn('sites', 'feed_alt_view', "TEXT DEFAULT 'reader'");   // reader | timeline | auto
+  // Krijgt elk bericht in Lezen zijn EIGEN scherm? Aan betekent min-height:100svh
+  // per bericht: een kort bericht vult dan het scherm en je ziet het volgende
+  // pas na een snap. Uit is de stroom zoals hij nu is, bericht na bericht zonder
+  // lege ruimte. Stond eerst vast op AAN, is toen vast op UIT gezet omdat een
+  // kort bericht een halve pagina leegte gaf; nu is het een keuze.
+  ensureColumn('sites', 'reader_full_page', 'INTEGER DEFAULT 0');
   ensureColumn('sites', 'show_search',     'INTEGER DEFAULT 1');
   ensureColumn('sites', 'show_archive_link', 'INTEGER DEFAULT 1');
Index: src/routes/admin-sites.js
===================================================================
--- src/routes/admin-sites.js	(revision 88838bce5b42c9e3fac0481e15e8b4531af35c4e)
+++ src/routes/admin-sites.js	(revision 520c993bff8f6cefc630de1cf827bd12aa0fe70a)
@@ -371,5 +371,5 @@
       enable_audio_player = ?,
       approve_followers = ?,
-      feed_view_default = ?, feed_view_switch = ?, feed_alt_view = ?,
+      feed_view_default = ?, feed_view_switch = ?, feed_alt_view = ?, reader_full_page = ?,
       show_search = ?, show_archive_link = ?,
       custom_css = ?, custom_head_html = ?, custom_foot_html = ?,
@@ -396,4 +396,5 @@
     f.feed_view_switch ? 1 : 0,
     feedAlt,
+    f.reader_full_page ? 1 : 0,
     f.show_search ? 1 : 0,
     f.show_archive_link ? 1 : 0,
Index: src/services/i18n.js
===================================================================
--- src/services/i18n.js	(revision 88838bce5b42c9e3fac0481e15e8b4531af35c4e)
+++ src/services/i18n.js	(revision 520c993bff8f6cefc630de1cf827bd12aa0fe70a)
@@ -33,5 +33,5 @@
     'switch.solo': 'Solo',
     'switch.circle': 'Cirkels',
-    'switch.grid': 'Grid', 'switch.reader': 'Lezen', 'switch.timeline': 'Tijdlijn', 'read.to_top': 'Terug naar boven', 'read.pinned': 'Vastgepind',
+    'switch.grid': 'Grid', 'switch.reader': 'Lezen', 'switch.timeline': 'Tijdlijn', 'read.to_top': 'Terug naar boven', 'read.pinned': 'Vastgepind', 'asite.reader_full_page': 'Lezen: elk bericht een eigen scherm',
     'asite.feed_alt': 'Tweede weergave', 'asite.feed_alt_reader': 'Lezen', 'asite.feed_alt_timeline': 'Tijdlijn', 'asite.feed_alt_auto': 'Lezen op mobiel, Tijdlijn op desktop',
     'switch.reader_solo_only': 'Lezen kan alleen in Solo — in de cirkel staan berichten van anderen',
@@ -1049,5 +1049,5 @@
     'switch.solo': 'Solo',
     'switch.circle': 'Circles',
-    'switch.grid': 'Grid', 'switch.reader': 'Reader', 'switch.timeline': 'Timeline', 'read.to_top': 'Back to top', 'read.pinned': 'Pinned',
+    'switch.grid': 'Grid', 'switch.reader': 'Reader', 'switch.timeline': 'Timeline', 'read.to_top': 'Back to top', 'read.pinned': 'Pinned', 'asite.reader_full_page': 'Reader: one screen per post',
     'asite.feed_alt': 'Second view', 'asite.feed_alt_reader': 'Reader', 'asite.feed_alt_timeline': 'Timeline', 'asite.feed_alt_auto': 'Reader on mobile, Timeline on desktop',
     'switch.reader_solo_only': 'Reader is Solo only — a circle shows other people\u2019s posts',
@@ -2056,5 +2056,5 @@
     'switch.solo': 'Solo',
     'switch.circle': 'Zirkel',
-    'switch.grid': 'Raster', 'switch.reader': 'Lesen', 'switch.timeline': 'Zeitleiste', 'read.to_top': 'Nach oben', 'read.pinned': 'Angeheftet',
+    'switch.grid': 'Raster', 'switch.reader': 'Lesen', 'switch.timeline': 'Zeitleiste', 'read.to_top': 'Nach oben', 'read.pinned': 'Angeheftet', 'asite.reader_full_page': 'Lesen: ein Bildschirm pro Beitrag',
     'asite.feed_alt': 'Zweite Ansicht', 'asite.feed_alt_reader': 'Lesen', 'asite.feed_alt_timeline': 'Zeitleiste', 'asite.feed_alt_auto': 'Lesen mobil, Zeitleiste am Desktop',
     'switch.reader_solo_only': 'Lesen gibt es nur in Solo — im Zirkel stehen Beitr\u00e4ge anderer',
Index: src/views/pages/admin-site-edit.ejs
===================================================================
--- src/views/pages/admin-site-edit.ejs	(revision 88838bce5b42c9e3fac0481e15e8b4531af35c4e)
+++ src/views/pages/admin-site-edit.ejs	(revision 520c993bff8f6cefc630de1cf827bd12aa0fe70a)
@@ -218,4 +218,9 @@
         <span><%= t('asite.feed_switch') %></span>
       </label>
+      <%# Alleen van toepassing op Lezen: geeft elk bericht daar een eigen scherm. %>
+      <label class="cb">
+        <input type="checkbox" name="reader_full_page" value="1" <%= site.reader_full_page ? 'checked' : '' %>>
+        <span><%= t('asite.reader_full_page') %></span>
+      </label>
       <label class="cb">
         <input type="checkbox" name="show_search" value="1" <%= site.show_search ? 'checked' : '' %>>
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision 88838bce5b42c9e3fac0481e15e8b4531af35c4e)
+++ src/views/shell.ejs	(revision 520c993bff8f6cefc630de1cf827bd12aa0fe70a)
@@ -222,5 +222,5 @@
 
 <!-- v9 stylesheet (full palette system) -->
-<link rel="stylesheet" href="/assets/css/style.css?v=82">
+<link rel="stylesheet" href="/assets/css/style.css?v=83">
 <script>
 /* iOS safe-area, built by hand. env(safe-area-inset-top) resolves to 0 on this iOS in
@@ -345,5 +345,5 @@
 </head>
 
-<body class="<%= bodyClass || 'on-home' %> has-bottom-tab" data-js="chrome<%= (typeof pageJs !== 'undefined' && pageJs) ? ' ' + pageJs : '' %>" data-feed-view="<%- _e(safeSite.feed_view_default === 'grid' ? 'grid' : (["timeline","auto"].indexOf(safeSite.feed_alt_view) >= 0 ? safeSite.feed_alt_view : "reader")) %>" data-feed-alt="<%- _e(["timeline","auto"].indexOf(safeSite.feed_alt_view) >= 0 ? safeSite.feed_alt_view : "reader") %>" data-grid-cols="3" data-site-base="<%- _e((typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '') %>">
+<body class="<%= bodyClass || 'on-home' %> has-bottom-tab" data-js="chrome<%= (typeof pageJs !== 'undefined' && pageJs) ? ' ' + pageJs : '' %>" data-feed-view="<%- _e(safeSite.feed_view_default === 'grid' ? 'grid' : (["timeline","auto"].indexOf(safeSite.feed_alt_view) >= 0 ? safeSite.feed_alt_view : "reader")) %>" data-feed-alt="<%- _e(["timeline","auto"].indexOf(safeSite.feed_alt_view) >= 0 ? safeSite.feed_alt_view : "reader") %>" data-reader-pages="<%- safeSite.reader_full_page ? 1 : 0 %>" data-grid-cols="3" data-site-base="<%- _e((typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '') %>">
 
 <% if (typeof isViewer !== 'undefined' && isViewer) { %>
@@ -505,5 +505,5 @@
   // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig
   // bumpen kost een bugfix die nooit aankomt.
-  var MOD_V = 20;
+  var MOD_V = 21;
 
   // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Index: test/feed-alt-view.test.js
===================================================================
--- test/feed-alt-view.test.js	(revision 88838bce5b42c9e3fac0481e15e8b4531af35c4e)
+++ test/feed-alt-view.test.js	(revision 520c993bff8f6cefc630de1cf827bd12aa0fe70a)
@@ -102,3 +102,32 @@
 // op; valt er een test om, dan hangt de hele suite. Zo overkwam het me bij de
 // controleproef -- de test die de fout moest aantonen, hing erop.
+// ── Elk bericht een eigen scherm in Lezen (Robin, 20-8) ─────────────────────
+// Zelfde reden als hierboven om door de ECHTE route te gaan: dit voegt een
+// kolom toe aan dezelfde UPDATE, en juist daar ging het eerder mis.
+test('de nieuwe kolom staat standaard uit', () => {
+  const s = siteVan('proef');
+  assert.equal(s.reader_full_page, 0, 'bestaande sites veranderen niet van gedrag');
+});
+
+test('aanzetten werkt, en de buren schuiven niet mee', async () => {
+  await post('/admin/sites/proef/save', {
+    title: 'Proef', feed_alt_view: 'timeline', feed_view_default: 'grid',
+    feed_view_switch: '1', reader_full_page: '1', show_search: '1', show_archive_link: '1',
+  });
+  const s = siteVan('proef');
+  assert.equal(s.reader_full_page, 1);
+  // De kolommen rond de nieuwe in de UPDATE. Zet je de kolom er wel bij en de
+  // waarde niet, dan schuift alles erna een plek op en is dit het eerste dat
+  // omvalt.
+  assert.equal(s.feed_alt_view, 'timeline', 'de kolom ervoor');
+  assert.equal(s.show_search, 1, 'de kolom erna');
+  assert.equal(s.show_archive_link, 1, 'en die daarachter');
+  assert.equal(s.feed_view_switch, 1);
+});
+
+test('en weer uit', async () => {
+  await post('/admin/sites/proef/save', { title: 'Proef', feed_alt_view: 'reader', feed_view_default: 'reader' });
+  assert.equal(siteVan('proef').reader_full_page, 0, 'een niet-aangevinkt vakje zet hem uit');
+});
+
 test.after(() => { server.closeAllConnections?.(); server.close(); });
