Index: src/routes/admin-audio.js
===================================================================
--- src/routes/admin-audio.js	(revision 03af7f82c3696d51867c9718528024d21c9e8fd1)
+++ src/routes/admin-audio.js	(revision fbc86280a47b904b8ae4a50f846e11f213172604)
@@ -37,6 +37,11 @@
 const ALLOWED_AUDIO_EXT = new Set(['.mp3', '.m4a', '.mp4', '.aac', '.oga', '.ogg', '.opus', '.flac', '.wav', '.webm']);
 const ALLOWED_COVER_EXT = new Set(['.jpg', '.jpeg', '.png', '.webp', '.gif']);
-const MAX_AUDIO_BYTES = 50 * 1024 * 1024;  // 50 MB
-const MAX_COVER_BYTES = 5 * 1024 * 1024;   // 5 MB
+const MAX_AUDIO_BYTES = 50 * 1024 * 1024;   // 50 MB — gecomprimeerde formaten (mp3/m4a/ogg/…)
+const MAX_WAV_BYTES   = 100 * 1024 * 1024;  // 100 MB — WAV is ongecomprimeerd, dus ruimer
+const MAX_COVER_BYTES = 5 * 1024 * 1024;    // 5 MB
+
+// Per-bestand bovengrens op basis van extensie. multer's globale limiet is de
+// hoogste (WAV); de echte controle per type gebeurt in de upload-handler.
+const audioByteLimitFor = (ext) => (ext.toLowerCase() === '.wav' ? MAX_WAV_BYTES : MAX_AUDIO_BYTES);
 
 // Multer routes audio + cover into separate dirs based on field name.
@@ -53,5 +58,5 @@
 const upload = multer({
   storage,
-  limits: { fileSize: MAX_AUDIO_BYTES }, // upper bound — per-field check below
+  limits: { fileSize: MAX_WAV_BYTES }, // hoogste bovengrens (WAV) — per-type check in de handler
   fileFilter: (req, file, cb) => {
     const ext = path.extname(file.originalname).toLowerCase();
@@ -93,4 +98,5 @@
     success: req.query.success || null,
     maxBytesMb: Math.round(MAX_AUDIO_BYTES / 1024 / 1024),
+    maxWavMb: Math.round(MAX_WAV_BYTES / 1024 / 1024),
   });
 });
@@ -119,4 +125,14 @@
       if (coverFile) try { fs.unlinkSync(coverFile.path); } catch {}
       return fail(400, 'missing audio file');
+    }
+
+    // Per-type audio size check. multer's globale limiet was de WAV-bovengrens
+    // (100MB); gecomprimeerde formaten blijven op 50MB.
+    const audioExt = path.extname(audioFile.originalname).toLowerCase();
+    const audioLimit = audioByteLimitFor(audioExt);
+    if (audioFile.size > audioLimit) {
+      try { fs.unlinkSync(audioFile.path); } catch {}
+      if (coverFile) try { fs.unlinkSync(coverFile.path); } catch {}
+      return fail(400, `audio te groot (max ${Math.round(audioLimit / 1024 / 1024)}MB voor ${audioExt || 'dit type'})`);
     }
 
Index: src/views/pages/admin-audio.ejs
===================================================================
--- src/views/pages/admin-audio.ejs	(revision 03af7f82c3696d51867c9718528024d21c9e8fd1)
+++ src/views/pages/admin-audio.ejs	(revision fbc86280a47b904b8ae4a50f846e11f213172604)
@@ -46,5 +46,5 @@
         <span class="ax-dropzone-icon">🎵</span>
         <strong class="ax-dropzone-title">Sleep audio hierheen</strong>
-        <span class="ax-dropzone-sub">of klik om bestanden te kiezen<br><small>mp3, m4a, ogg, opus, flac, wav · max <%= maxBytesMb %> MB per bestand</small></span>
+        <span class="ax-dropzone-sub">of klik om bestanden te kiezen<br><small>mp3, m4a, ogg, opus, flac · max <%= maxBytesMb %> MB · wav max <%= maxWavMb %> MB</small></span>
         <input type="file" id="audio-files" accept="audio/*" multiple>
       </label>
