Index: src/views/pages/home.ejs
===================================================================
--- src/views/pages/home.ejs	(revision 847775cc74de6b701650a36b640f758fba5f214b)
+++ src/views/pages/home.ejs	(revision 9da8027b9243dfb7e0896f681a2551b9a2a3d70b)
@@ -59,4 +59,20 @@
 </div>
 
+<!-- ========== LEZEN (alleen zichtbaar bij body[data-feed-view="reader"]) ==========
+     Hetzelfde stel berichten, maar heel: één per scherm, met de grenzen door
+     CSS-snapping. Geen eigen route en geen eigen shell -- de balken blijven
+     staan, want je bent nog gewoon op de feed en moet terug kunnen schakelen.
+     Leeg? Dan valt de lege staat van de tijdlijn hierboven in beeld; deze
+     sectie rendert dan niet. -->
+<% if (typeof readerItems !== 'undefined' && readerItems && readerItems.length) { %>
+<section class="feed-reader" aria-label="<%= t('switch.reader') %>">
+  <div class="read-stream" id="read-stream" data-base="<%= _base %>">
+    <% readerItems.forEach(function(it) { %>
+      <%- include('../partials/read-article', { post: it.post, entry: it.entry }) %>
+    <% }); %>
+  </div>
+</section>
+<% } %>
+
 <!-- ========== GRID (only visible when body[data-feed-view="grid"]) ========== -->
 <% if (allPosts.length > 0) { %>
Index: src/views/pages/read.ejs
===================================================================
--- src/views/pages/read.ejs	(revision 847775cc74de6b701650a36b640f758fba5f214b)
+++ 	(revision )
@@ -1,111 +1,0 @@
-<%
-// De leesweergave: berichten achter elkaar, één per beeld, en de balken gaan weg.
-//
-// Barts idee, naar bartoverkamp.nl -- maar NIET met de truc die daar staat.
-// Daar wordt bij de rand naar de andere kant gesprongen en het artikel
-// "vloeiend" in beeld gezet; dat is een naad die je verbergt. Hier groeit de
-// stroom gewoon: bij de onderrand hangt de client de oudere buur eronder, bij de
-// bovenrand de nieuwere erboven, en de browser snapt naar de berichtgrenzen.
-// Dan is er geen naad om te verbergen.
-//
-// Zonder JavaScript blijft dit één leesbaar bericht met twee gewone links. Een
-// leesweergave die alleen met script bestaat, bestaat niet voor wie het uitzet.
-var _b = (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '';
-%>
-
-<%# De teksten die het script zelf plaatst, komen van hier -- zoals de
-    zoekteksten van de topnav (zie mod/chrome.js). Een zin die in het
-    script staat, staat in één taal, en dat is nooit de taal van de lezer. %>
-<div class="read-stream" id="read-stream" data-base="<%= _b %>"
-     data-i18n="<%= JSON.stringify({ end: t('read.end'), load_error: t('read.load_error') }) %>">
-  <%- include('../partials/read-article', {
-        post: post, entry: entry, newerPost: newerPost, olderPost: olderPost,
-      }) %>
-</div>
-
-<%# Geen eigen uitgangsknop. De balken schuiven terug zodra je omhoog scrolt
-    (en staan er sowieso bovenaan), dus de weg terug is altijd één veeg weg. Een
-    zwevende knop erbij zou een tweede uitgang zijn die hetzelfde doet. %>
-
-<noscript>
-  <nav class="read-fallback">
-    <% if (newerPost) { %><a href="<%= _b %>/read/<%= newerPost.slug %>">← <%= newerPost.title %></a><% } %>
-    <% if (olderPost) { %><a href="<%= _b %>/read/<%= olderPost.slug %>"><%= olderPost.title %> →</a><% } %>
-  </nav>
-</noscript>
-
-<style>
-/* Alles onder .on-read: dit is een nieuw scherm op een LIVE site, dus niets
-   hiervan mag daarbuiten iets aanraken. */
-
-/* De balken schuiven weg zodra je leest. Transform en niet display: een
-   schuivende balk laat zien dat hij terugkomt, een verdwijnende niet. */
-.on-read #pcms-chrome,
-.on-read .bottom-tab {
-  transition: transform .28s ease, opacity .28s ease;
-  will-change: transform;
-}
-.on-read.read-chrome-hidden #pcms-chrome { transform: translateY(-100%); opacity: 0; }
-.on-read.read-chrome-hidden .bottom-tab  { transform: translateY(100%);  opacity: 0; }
-
-/* De vrije ruimte onder de laatste post moet weg: anders eindigt het document
-   ver onder het laatste bericht en klopt "bij de rand" niet meer. */
-.on-read #pcms-main { padding-bottom: 0; }
-
-/* PROXIMITY, geen mandatory. Een bericht dat langer is dan het scherm moet je
-   rustig kunnen doorlezen; mandatory zou je bij elke pauze terugtrekken naar
-   een grens. Zo snapt hij alleen als je in de buurt van een grens bent.
-
-   OP <html>, en dat is geen smaakkwestie: snappen doet de SCROLLCONTAINER, en
-   dat is hier het document -- .read-stream heeft overflow: visible en scrollt
-   zelf niet. Op .read-stream stond de regel er wel, maar deed hij niets. */
-html:has(body.on-read) { scroll-snap-type: y proximity; }
-
-/* De browser NIET ook laten compenseren. Chrome en Firefox schuiven bij
-   invoegen bóven het beeld de scrollpositie zelf mee (scroll anchoring); samen
-   met onze eigen correctie in mod/read.js is dat twee keer, en dan springt de
-   tekst precies één bericht weg. Onze eigen correctie moet blijven, want Safari
-   (en dus iOS) kent scroll anchoring helemaal niet. */
-html:has(body.on-read), .on-read .read-stream, .on-read .read-post { overflow-anchor: none; }
-.on-read .read-post {
-  scroll-snap-align: start;
-  scroll-snap-stop: normal;
-  min-height: 100svh;
-  max-width: 46rem;
-  margin: 0 auto;
-  padding: 2rem 1.2rem 4rem;
-  box-sizing: border-box;
-}
-/* Een lijn tussen twee berichten: zonder grens is een stroom een lange brij. */
-.on-read .read-post + .read-post { border-top: 1px solid color-mix(in srgb, currentColor 12%, transparent); }
-
-/* De titel is een link, maar mag er niet als een link uitzien: dit is een
-   leesscherm, geen index. Onderstrepen pas als je hem aanwijst. */
-.on-read .read-title a { color: inherit; text-decoration: none; }
-.on-read .read-title a:hover,
-.on-read .read-title a:focus-visible { text-decoration: underline; }
-
-/* De aankondiging onderaan: waar de tik je heen brengt. */
-.on-read .read-foot { margin-top: 2rem; }
-.on-read .read-open {
-  display: inline-block; font-size: .9rem; opacity: .75;
-  text-decoration: none; border-bottom: 1px solid currentColor; padding-bottom: 1px;
-}
-.on-read .read-open:hover, .on-read .read-open:focus-visible { opacity: 1; }
-
-.on-read .read-head { padding-bottom: .5rem; }
-.on-read .read-title { font-size: clamp(1.6rem, 4vw, 2.4rem); line-height: 1.15; margin: 0 0 .3rem; }
-.on-read .read-when { font-size: .85rem; opacity: .6; margin: 0; }
-
-/* Bezig / mislukt: de lezer hoort te merken dat er iets gebeurt, en vooral dat
-   er NIETS gebeurde als het misging. */
-.on-read .read-loading { text-align: center; padding: 1.2rem; opacity: .6; font-size: .9rem; }
-.on-read .read-end  { text-align: center; padding: 2rem 1rem 3rem; opacity: .5; font-size: .9rem; }
-
-.on-read .read-fallback { display: flex; gap: 1rem; padding: 1rem 1.2rem; }
-
-@media (prefers-reduced-motion: reduce) {
-  .on-read #pcms-chrome, .on-read .bottom-tab { transition: none; }
-  html:has(body.on-read) { scroll-snap-type: none; }
-}
-</style>
