Index: src/routes/account.js
===================================================================
--- src/routes/account.js	(revision fa089819894c489333fe1d0f327dae1085a86987)
+++ src/routes/account.js	(revision 85d59728d005dd307a9db1c157384a25c304acf7)
@@ -25,4 +25,5 @@
 import { requireAuth } from '../middleware/auth.js';
 import { googleConfigured } from '../config/google.js';
+import { toWebp } from '../services/ImageWebpService.js';
 
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -190,5 +191,5 @@
     }
 
-    const url = `/media/avatars/${req.file.filename}`;
+    const url = `/media/avatars/${toWebp(req.file)}`;
 
     // Remove the old avatar file (if it lives in our avatar dir)
Index: src/routes/admin-audio.js
===================================================================
--- src/routes/admin-audio.js	(revision fa089819894c489333fe1d0f327dae1085a86987)
+++ src/routes/admin-audio.js	(revision 85d59728d005dd307a9db1c157384a25c304acf7)
@@ -18,4 +18,5 @@
 import db from '../config/database.js';
 import { renderPage } from '../middleware/render.js';
+import { toWebp } from '../services/ImageWebpService.js';
 import { requireGod } from '../middleware/auth.js';
 import { transcodeToMp3 } from '../services/AudioTranscoder.js';
@@ -478,5 +479,5 @@
     }
 
-    const newUrl = `/media/audio-covers/${file.filename}`;
+    const newUrl = `/media/audio-covers/${toWebp(file)}`;
     try {
       db.prepare('UPDATE audio_tracks SET cover_url = ? WHERE id = ? AND site_id = ?')
Index: src/routes/admin-settings.js
===================================================================
--- src/routes/admin-settings.js	(revision fa089819894c489333fe1d0f327dae1085a86987)
+++ src/routes/admin-settings.js	(revision 85d59728d005dd307a9db1c157384a25c304acf7)
@@ -25,4 +25,5 @@
 import { entitlementStatus, premiumUnlocked } from '../services/PatreonService.js';
 import { googleConfigured, redirectUri, currentClientId, clientSecretSet } from '../config/google.js';
+import { toWebp } from '../services/ImageWebpService.js';
 
 const router = express.Router();
@@ -120,5 +121,5 @@
     // Hero: een geüploade afbeelding wint; anders het URL-tekstveld.
     if (req.file) {
-      const newUrl = `/media/hero/${req.file.filename}`;
+      const newUrl = `/media/hero/${toWebp(req.file)}`;
       // Ruim een vorige geüploade hero op (alleen als die uit onze hero-map kwam).
       const old = getSetting('hub_hero_image') || '';
Index: src/routes/admin-sites.js
===================================================================
--- src/routes/admin-sites.js	(revision fa089819894c489333fe1d0f327dae1085a86987)
+++ src/routes/admin-sites.js	(revision 85d59728d005dd307a9db1c157384a25c304acf7)
@@ -25,4 +25,5 @@
 import ThemeService from '../services/ThemeService.js';
 import { listPlatforms, PLATFORMS } from '../services/PlatformIcons.js';
+import { toWebp } from '../services/ImageWebpService.js';
 
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -88,5 +89,5 @@
     res.json({
       ok: true,
-      url: `/media/avatars/${req.file.filename}`,
+      url: `/media/avatars/${toWebp(req.file)}`,
       size: req.file.size,
       mime: req.file.mimetype,
Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision fa089819894c489333fe1d0f327dae1085a86987)
+++ src/routes/posts.js	(revision 85d59728d005dd307a9db1c157384a25c304acf7)
@@ -16,4 +16,5 @@
 import PlaylistService from '../services/PlaylistService.js';
 import { audioUrl } from '../services/AudioStreamService.js';
+import { toWebp } from '../services/ImageWebpService.js';
 
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -55,5 +56,5 @@
     if (err) return res.status(400).json({ error: err.message });
     if (!req.file) return res.status(400).json({ error: 'No file' });
-    const url = '/media/post-images/' + req.file.filename;
+    const url = '/media/post-images/' + toWebp(req.file);
     res.json({ url, size: req.file.size, mime: req.file.mimetype });
   });
