Index: src/routes/admin-epk.js
===================================================================
--- src/routes/admin-epk.js	(revision 9d9f3c1e9e57ef71ff065970e57f927f9c586ea5)
+++ src/routes/admin-epk.js	(revision d252ce85b10b874fc4fcc3615b8e733a0289e3eb)
@@ -10,4 +10,5 @@
 
 import express from 'express';
+import db from '../config/database.js';
 import { renderPage } from '../middleware/render.js';
 import { requireGod } from '../middleware/auth.js';
@@ -17,4 +18,6 @@
 const router = express.Router();
 
+const MAX_EPK_TRACKS = 5;
+
 router.get('/', requireGod, (req, res) => {
   const site = res.locals.site;
@@ -23,4 +26,9 @@
     return res.status(403).send('Perskit is een premium-functie.');
   }
+  const allTracks = db.prepare(
+    `SELECT id, title, artist FROM audio_tracks WHERE site_id = ? ORDER BY position ASC, created_at ASC`
+  ).all(site.id);
+  let chosen = [];
+  try { const r = JSON.parse(getSetting('epk_tracks_' + site.id, '') || '[]'); if (Array.isArray(r)) chosen = r; } catch (e) {}
   renderPage(req, res, 'pages/admin-epk', {
     pageTitle: 'Perskit bewerken',
@@ -29,4 +37,7 @@
     epkBio: getSetting('epk_bio_' + site.id, '') || '',
     epkContact: getSetting('epk_contact_' + site.id, '') || '',
+    allTracks,
+    chosenTracks: chosen,
+    maxEpkTracks: MAX_EPK_TRACKS,
     success: req.query.success || null,
   });
@@ -38,4 +49,10 @@
   setSetting('epk_bio_' + site.id, (req.body.epk_bio || '').toString().slice(0, 1000).trim());
   setSetting('epk_contact_' + site.id, (req.body.epk_contact || '').toString().slice(0, 300).trim());
+  // Gekozen nummers: alleen ids van DEZE site, max 5, in de aangeleverde volgorde.
+  let ids = req.body.epk_tracks;
+  if (!Array.isArray(ids)) ids = ids ? [ids] : [];
+  const valid = new Set(db.prepare('SELECT id FROM audio_tracks WHERE site_id = ?').all(site.id).map((r) => r.id));
+  ids = ids.map(String).filter((id) => valid.has(id)).slice(0, MAX_EPK_TRACKS);
+  setSetting('epk_tracks_' + site.id, JSON.stringify(ids));
   res.redirect('/admin/epk?success=' + encodeURIComponent('Perskit opgeslagen'));
 });
Index: src/routes/epk.js
===================================================================
--- src/routes/epk.js	(revision 9d9f3c1e9e57ef71ff065970e57f927f9c586ea5)
+++ src/routes/epk.js	(revision d252ce85b10b874fc4fcc3615b8e733a0289e3eb)
@@ -25,12 +25,30 @@
   if (!site) return next();
 
-  // Top 10 meest beluisterde nummers (op play_count), niet zomaar de eerste paar.
-  const tracks = db.prepare(
-    `SELECT title, artist, duration, cover_url, COALESCE(play_count, 0) AS plays
-       FROM audio_tracks
-      WHERE site_id = ?
-      ORDER BY plays DESC, position ASC, created_at ASC
-      LIMIT 10`
-  ).all(site.id);
+  // Nummers op de perskit: een door de admin GEKOZEN selectie (max 5, in eigen
+  // volgorde) als die is ingesteld; anders automatisch de top 5 meest beluisterde.
+  let chosenIds = [];
+  try {
+    const raw = JSON.parse(getSetting('epk_tracks_' + site.id, '') || '[]');
+    if (Array.isArray(raw)) chosenIds = raw.filter((x) => typeof x === 'string').slice(0, 5);
+  } catch (e) { /* ongeldige JSON → val terug op top */ }
+
+  let tracks;
+  if (chosenIds.length) {
+    const ph = chosenIds.map(() => '?').join(',');
+    const rows = db.prepare(
+      `SELECT id, title, artist, duration, cover_url, COALESCE(play_count, 0) AS plays
+         FROM audio_tracks WHERE site_id = ? AND id IN (${ph})`
+    ).all(site.id, ...chosenIds);
+    const byId = new Map(rows.map((r) => [r.id, r]));
+    tracks = chosenIds.map((id) => byId.get(id)).filter(Boolean);  // behoud gekozen volgorde
+  } else {
+    tracks = db.prepare(
+      `SELECT title, artist, duration, cover_url, COALESCE(play_count, 0) AS plays
+         FROM audio_tracks
+        WHERE site_id = ?
+        ORDER BY plays DESC, position ASC, created_at ASC
+        LIMIT 5`
+    ).all(site.id);
+  }
 
   const posts = db.prepare(
