Index: src/assets/js/audio-player.js
===================================================================
--- src/assets/js/audio-player.js	(revision 515cf1a67cad06eb3a51a911df89d992e16275ac)
+++ src/assets/js/audio-player.js	(revision 73cffc30d25c5479bab9b91cc9ff40f0c028eb73)
@@ -560,10 +560,19 @@
   attachSeek(sheetSeek);
 
-  audio.volume = 0.8;
+  // Volume + mute persist across sessions/pages via localStorage.
+  const VOL_KEY = 'pcmsVolume', MUTE_KEY = 'pcmsMuted';
+  const saveVol = () => { try { localStorage.setItem(VOL_KEY, String(audio.volume)); localStorage.setItem(MUTE_KEY, audio.muted ? '1' : '0'); } catch (e) { /* private mode */ } };
+  let _initVol = parseFloat(localStorage.getItem(VOL_KEY));
+  if (!isFinite(_initVol) || _initVol < 0 || _initVol > 1) _initVol = 0.8;
+  audio.volume = _initVol;
+  volumeSlider.value = Math.round(_initVol * 100);
+  if (localStorage.getItem(MUTE_KEY) === '1') audio.muted = true;
+  root.classList.toggle('is-muted', audio.muted || audio.volume === 0);
   volumeSlider.addEventListener('input', () => {
     audio.volume = volumeSlider.value / 100;
     if (volumeSlider.value > 0) audio.muted = false;
-  });
-  muteBtn.addEventListener('click', () => { audio.muted = !audio.muted; });
+    saveVol();
+  });
+  muteBtn.addEventListener('click', () => { audio.muted = !audio.muted; saveVol(); });
 
   // ============================================================
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision 515cf1a67cad06eb3a51a911df89d992e16275ac)
+++ src/views/shell.ejs	(revision 73cffc30d25c5479bab9b91cc9ff40f0c028eb73)
@@ -382,5 +382,5 @@
      ?v=N — cache-buster: bump bij elke audio-player.js wijziging zodat
      Cloudflare (max-age=1y) niet de oude versie blijft serveren. -->
-<script src="/assets/js/audio-player.js?v=30"></script>
+<script src="/assets/js/audio-player.js?v=31"></script>
 <!-- Eigen custom media-embeds (YouTube/SoundCloud/Spotify) via de echte
      player-API's + gedeelde mutual-exclusion registry met de site-speler. -->
