Index: AGENTS.md
===================================================================
--- AGENTS.md	(revision 85b51bfed40ba560eccbc20fd7df36c861e6618b)
+++ AGENTS.md	(revision 87696ce368ae084de890aa4e682f4294c7825feb)
@@ -36,4 +36,22 @@
 - `apt-get` - use `-y` flag
 - `brew` - use `HOMEBREW_NO_AUTO_UPDATE=1` env var
+
+## Conventions & Patterns
+
+- **Bump `MOD_V` whenever you change anything in `src/assets/js/mod/`.** It sits
+  at the top of the module loader in `src/views/shell.ejs` and is the
+  cache-buster for every page module. `/assets` is served `max-age=1y` outside
+  development, so without a bump a browser that visited before keeps running the
+  old module for a year — meaning a fix reaches everyone *except* the people who
+  already have the bug. Same discipline as `audio-player.js?v=N` a few hundred
+  lines up. One number for the whole directory: bumping too often costs one
+  download, bumping too rarely costs a bugfix that never arrives.
+
+- **Comments and commit messages in Dutch, identifiers in English.** The modules
+  in `assets/js/mod` read `setIcon`, `uploadOne`, `applyAccent`; the comments
+  around them are Dutch prose. Both halves matter — a Dutch identifier in an
+  English file is the same wrong note as an English comment in a Dutch one. This
+  extends to anything long-lived and outward-facing: URL paths and CSS class
+  names are English (`/read`, `.read-end`), never a Dutch verb form.
 
 <!-- BEGIN BEADS INTEGRATION v:1 profile:minimal hash:7510c1e2 -->
Index: CLAUDE.md
===================================================================
--- CLAUDE.md	(revision 85b51bfed40ba560eccbc20fd7df36c861e6618b)
+++ CLAUDE.md	(revision 87696ce368ae084de890aa4e682f4294c7825feb)
@@ -72,3 +72,17 @@
 ## Conventions & Patterns
 
-_Add your project-specific conventions here_
+- **Bump `MOD_V` whenever you change anything in `src/assets/js/mod/`.** It sits
+  at the top of the module loader in `src/views/shell.ejs` and is the
+  cache-buster for every page module. `/assets` is served `max-age=1y` outside
+  development, so without a bump a browser that visited before keeps running the
+  old module for a year — meaning a fix reaches everyone *except* the people who
+  already have the bug. Same discipline as `audio-player.js?v=N` a few hundred
+  lines up. One number for the whole directory: bumping too often costs one
+  download, bumping too rarely costs a bugfix that never arrives.
+
+- **Comments and commit messages in Dutch, identifiers in English.** The modules
+  in `assets/js/mod` read `setIcon`, `uploadOne`, `applyAccent`; the comments
+  around them are Dutch prose. Both halves matter — a Dutch identifier in an
+  English file is the same wrong note as an English comment in a Dutch one. This
+  extends to anything long-lived and outward-facing: URL paths and CSS class
+  names are English (`/read`, `.read-end`), never a Dutch verb form.
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision 85b51bfed40ba560eccbc20fd7df36c861e6618b)
+++ src/views/shell.ejs	(revision 87696ce368ae084de890aa4e682f4294c7825feb)
@@ -496,4 +496,13 @@
   window.__modBoot = true;
 
+  // ?v=N — cache-buster voor ALLE modules in assets/js/mod, net als bij
+  // audio-player.js hierboven. BUMP BIJ ELKE WIJZIGING IN DIE MAP. Zonder
+  // query staat /assets op max-age=1y, en dan blijft een browser die de
+  // pagina eerder bezocht een jaar lang de oude module draaien: een
+  // reparatie bereikt precies de bezoekers die hem al hebben.
+  // 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 = 1;
+
   // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
   // die `init` exporteert draait die bij ELKE paginawissel waarop hij actief
@@ -514,5 +523,5 @@
       if (loaded[name]) { start(name, loaded[name]); return; }
       loaded[name] = 1;
-      import('/assets/js/mod/' + name + '.js').then(function (m) {
+      import('/assets/js/mod/' + name + '.js?v=' + MOD_V).then(function (m) {
         loaded[name] = m;
         start(name, m);
