Index: src/assets/js/mod/news.js
===================================================================
--- src/assets/js/mod/news.js	(revision 72d8effdf53546d3adac9fdbd366a46a551be787)
+++ src/assets/js/mod/news.js	(revision 3e1aab1d0ca77fdf994b3cd2daa1b48e94c68d1b)
@@ -6,12 +6,4 @@
 
 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 () {
@@ -85,5 +77,15 @@
 /* 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. */
-wireGifVideos();
+(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 });
+  });
+})();
 
 /* Like/Boost toggle in place — POST via fetch, flip the button, stay on the page (no reload, no banner). */
@@ -111,21 +113,5 @@
 // actually overflows. Runs on every /news render (full load + htmx swap); a per-element flag
 // prevents double-wiring.
-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(){
+(function(){
   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){
@@ -141,8 +127,3 @@
     }
   });
-}
-
-// 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(); });
+})();
