Index: src/assets/js/mod/admin-epk.js
===================================================================
--- src/assets/js/mod/admin-epk.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/admin-epk.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -8,4 +8,9 @@
 // er nu staat) en tegen een tweede aanroep te kunnen.
 
+// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
+// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
+export function init() { run(); }
+
+function run() {
 (function () {
   var box = document.querySelector('.epk-track-pick');
@@ -20,2 +25,3 @@
   sync();
 })();
+}
Index: src/assets/js/mod/admin-help.js
===================================================================
--- src/assets/js/mod/admin-help.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/admin-help.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -8,4 +8,9 @@
 // er nu staat) en tegen een tweede aanroep te kunnen.
 
+// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
+// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
+export function init() { run(); }
+
+function run() {
 (function () {
   var q = document.getElementById('hb-q');
@@ -29,2 +34,3 @@
   q.addEventListener('input', run);
 })();
+}
Index: src/assets/js/mod/admin-paid.js
===================================================================
--- src/assets/js/mod/admin-paid.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/admin-paid.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -8,4 +8,9 @@
 // er nu staat) en tegen een tweede aanroep te kunnen.
 
+// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
+// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
+export function init() { run(); }
+
+function run() {
 (function () {
   var field = document.getElementById('pd-redirect');
@@ -20,2 +25,3 @@
   });
 })();
+}
Index: src/assets/js/mod/admin-push.js
===================================================================
--- src/assets/js/mod/admin-push.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/admin-push.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -8,4 +8,9 @@
 // er nu staat) en tegen een tweede aanroep te kunnen.
 
+// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
+// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
+export function init() { run(); }
+
+function run() {
 (function () {
   var cfg = JSON.parse(document.getElementById('np-data').textContent);
@@ -109,2 +114,3 @@
   });
 })();
+}
Index: src/assets/js/mod/admin-settings.js
===================================================================
--- src/assets/js/mod/admin-settings.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/admin-settings.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -8,4 +8,9 @@
 // er nu staat) en tegen een tweede aanroep te kunnen.
 
+// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
+// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
+export function init() { run(); }
+
+function run() {
     (function () {
       var f = document.getElementById('mode-form');
@@ -18,3 +23,3 @@
       });
     })();
-    
+}
Index: src/assets/js/mod/admin-site-edit.js
===================================================================
--- src/assets/js/mod/admin-site-edit.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/admin-site-edit.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -8,4 +8,9 @@
 // er nu staat) en tegen een tweede aanroep te kunnen.
 
+// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
+// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
+export function init() { run(); }
+
+function run() {
     (function(){
       if (window.__themePreviewWired) return; window.__themePreviewWired = true;
@@ -129,2 +134,3 @@
   }
 })();
+}
Index: src/assets/js/mod/auth-register.js
===================================================================
--- src/assets/js/mod/auth-register.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/auth-register.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -8,4 +8,9 @@
 // er nu staat) en tegen een tweede aanroep te kunnen.
 
+// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
+// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
+export function init() { run(); }
+
+function run() {
 (function () {
   var u = document.getElementById('setup-username'), out = document.getElementById('setup-handle');
@@ -18,2 +23,3 @@
   upd();
 })();
+}
Index: src/assets/js/mod/authorize-interaction.js
===================================================================
--- src/assets/js/mod/authorize-interaction.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/authorize-interaction.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -8,7 +8,13 @@
 // er nu staat) en tegen een tweede aanroep te kunnen.
 
+// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
+// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
+export function init() { run(); }
+
+function run() {
     (function () {
-      if (window.__fediBmWired) return; window.__fediBmWired = true;
-      var a = document.getElementById('fedi-bm-btn'); if (!a) return;
+      // Element-vlag, geen window-vlag: na een swap is de knop een NIEUW element
+      // en moet hij opnieuw bedraad; een window-vlag zou dat voorgoed blokkeren.
+      var a = document.getElementById('fedi-bm-btn'); if (!a || a.__wired) return; a.__wired = true;
       a.setAttribute('href', "javascript:void(window.open('" + location.origin + "/authorize_interaction?uri='+encodeURIComponent(window.location.href)))");
       a.addEventListener('click', function (e) { e.preventDefault(); a.classList.add('nudge'); setTimeout(function(){ a.classList.remove('nudge'); }, 600); });
@@ -60,2 +66,3 @@
   });
 })();
+}
Index: src/assets/js/mod/download.js
===================================================================
--- src/assets/js/mod/download.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/download.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -7,5 +7,10 @@
 import { pageData } from './lib.js';
 
+// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
+// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
+export function init() { run(); }
+
+function run() {
         // Auto-start de download (zelfde-origin attachment-link).
         setTimeout(function(){ try { window.location.href = (pageData().fileUrl || ''); } catch(e){} }, 600);
-      
+}
Index: src/assets/js/mod/news.js
===================================================================
--- src/assets/js/mod/news.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/news.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -6,4 +6,12 @@
 
 import { pageData } from './lib.js';
+
+// De twee gedelegeerde blokken dragen een window-vlag en zijn bij een tweede
+// init een no-op; de twee SCANNERS (gif-video's, lees-meer) moeten juist wel
+// elke render opnieuw over de verse elementen lopen (shaer-5s1). Element-
+// vlaggen (data-gif-wired, data-rm) houden dubbel bedraden tegen.
+export function init() { run(); }
+
+function run() {
 
   (function () {
@@ -77,15 +85,5 @@
 /* Short feed videos (gif/cover loops like an animated cover) autoplay + loop muted like a GIF;
    longer real videos keep their controls. Decided on the actual duration once metadata loads. */
-(function(){
-  document.querySelectorAll('.tl-media-video').forEach(function(v){
-    if (v.dataset.gifWired) return; v.dataset.gifWired = '1';
-    var decide = function(){
-      if (v.duration && v.duration <= 30) {
-        v.removeAttribute('controls'); v.loop = true; v.muted = true; v.play().catch(function(){});
-      }
-    };
-    if (v.readyState >= 1) decide(); else v.addEventListener('loadedmetadata', decide, { once: true });
-  });
-})();
+wireGifVideos();
 
 /* Like/Boost toggle in place — POST via fetch, flip the button, stay on the page (no reload, no banner). */
@@ -113,5 +111,21 @@
 // actually overflows. Runs on every /news render (full load + htmx swap); a per-element flag
 // prevents double-wiring.
-(function(){
+wireReadMore();
+}
+
+/* Short feed videos: zie de opmerking bij de aanroep in run(). */
+function wireGifVideos(){
+  document.querySelectorAll('.tl-media-video').forEach(function(v){
+    if (v.dataset.gifWired) return; v.dataset.gifWired = '1';
+    var decide = function(){
+      if (v.duration && v.duration <= 30) {
+        v.removeAttribute('controls'); v.loop = true; v.muted = true; v.play().catch(function(){});
+      }
+    };
+    if (v.readyState >= 1) decide(); else v.addEventListener('loadedmetadata', decide, { once: true });
+  });
+}
+
+function wireReadMore(){
   var _d = pageData(); var RM = _d.readMore || 'Lees meer', SL = _d.showLess || 'Toon minder';
   document.querySelectorAll('.tl-content:not(.nsfw-media):not([data-rm])').forEach(function(c){
@@ -127,3 +141,8 @@
     }
   });
-})();
+}
+
+// Paginering: items die de feed later binnenhaalt zouden de scanners missen --
+// init() draait per NAVIGATIE, en een pagineer-swap is er geen. Een keer,
+// gedelegeerd; op andere pagina's vinden de scanners niets en doen ze niets.
+document.body.addEventListener('htmx:afterSettle', function () { wireGifVideos(); wireReadMore(); });
Index: src/assets/js/mod/paid-gate.js
===================================================================
--- src/assets/js/mod/paid-gate.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/paid-gate.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -7,4 +7,9 @@
 import { pageData } from './lib.js';
 
+// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
+// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
+export function init() { run(); }
+
+function run() {
 (function () {
   var _d = pageData();
@@ -60,2 +65,3 @@
   });
 })();
+}
Index: src/assets/js/mod/paid-passkey.js
===================================================================
--- src/assets/js/mod/paid-passkey.js	(revision da84110b6ca109b72d7666682dc52070dbb6b891)
+++ src/assets/js/mod/paid-passkey.js	(revision a8364eebcd86a4ed81e5828536e10f189505da2e)
@@ -7,4 +7,9 @@
 import { pageData } from './lib.js';
 
+// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
+// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
+export function init() { run(); }
+
+function run() {
 (function () {
   var _d = pageData();
@@ -40,2 +45,3 @@
   });
 })();
+}
