Index: src/routes/admin-playlists.js
===================================================================
--- src/routes/admin-playlists.js	(revision 2165b6d3d57ceaa8b5d1f70491868482149470cf)
+++ src/routes/admin-playlists.js	(revision 7bc636b391c66ac399c33e54f7173a022c6a3cbd)
@@ -23,10 +23,12 @@
 import { requireGod } from '../middleware/auth.js';
 import PlaylistService from '../services/PlaylistService.js';
-import { mediaDir } from '../config/paths.js';
 
 // Cover storage — same convention as track covers so a single physical
 // directory holds all album/track artwork. Existing covers in the DB
 // already point at /media/audio-covers/<filename> so we reuse the path.
-const COVER_DIR = mediaDir('COVER_PATH', 'audio-covers');
+const __dirname = path.dirname(new URL(import.meta.url).pathname);
+const COVER_DIR = path.resolve(
+  process.env.COVER_PATH || path.join(__dirname, '..', '..', 'storage', 'media', 'audio-covers')
+);
 fs.mkdirSync(COVER_DIR, { recursive: true });
 
@@ -62,7 +64,5 @@
   const playlists = PlaylistService.list(site.id);
   renderPage(req, res, 'pages/admin-playlists', {
-    // admin-playlists neemt de playlist-editor op, dus die module hoort erbij.
-    pageJs: 'admin-playlists playlist-editor',
-    pageTitleKey: 'admin.t_playlists',
+    pageTitle: 'Playlists',
     playlists,
     bodyClass: 'on-admin',
@@ -88,5 +88,5 @@
   const tracks = db.prepare(`
     SELECT t.id, t.title, t.artist, t.duration, t.cover_url,
-           t.link_spotify, t.link_youtube, t.link_soundcloud, m.filename
+           m.filename
     FROM audio_tracks t
     LEFT JOIN media m ON m.id = t.media_id
@@ -103,7 +103,5 @@
       duration: t.duration || 0,
       cover: t.cover_url || '',
-      // Insertable if it has a hosted file OR an external link — a link-only track ([[track:]])
-      // still renders its Spotify/YouTube card on the post, so it must not be disabled in the picker.
-      playable: !!t.filename || !!(t.link_spotify || t.link_youtube || t.link_soundcloud),
+      playable: !!t.filename,
     })),
   });
@@ -114,5 +112,5 @@
   if (!site) return res.status(404).json({ error: 'Site required' });
 
-  // Editor needs the raw track-id list (not stream URLs) — pass no urlFor.
+  // Editor needs the raw track-id list (not signed URLs) — pass no signUrl.
   const playlist = PlaylistService.get(site.id, req.params.id, null);
   if (!playlist) return res.status(404).json({ error: 'Playlist niet gevonden' });
