Index: src/assets/js/audio-player.js
===================================================================
--- src/assets/js/audio-player.js	(revision cb953439d2af4a1bddf4ce4a2027bca908fee2b1)
+++ src/assets/js/audio-player.js	(revision 2eca08338db9aa5243d74819007e9f383e619562)
@@ -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(); });
 
   // ============================================================
