Index: src/routes/admin-audio.js
===================================================================
--- src/routes/admin-audio.js	(revision 1794facfb2038892f72a7971dc25ad2d2e1faef5)
+++ src/routes/admin-audio.js	(revision 6be57b4716118bcb1264cfea3f073b10963be2bf)
@@ -91,8 +91,11 @@
   }));
 
+  const base = (process.env.PUBLIC_BASE_URL || ('https://' + (req.get('host') || ''))).replace(/\/$/, '');
+  const embedUrl = base + (res.locals.siteUrlBase || '') + '/embed';
   renderPage(req, res, 'pages/admin-audio', {
     pageTitle: 'Audio tracks',
     bodyClass: 'on-admin',
     tracks,
+    embedUrl,
     error: req.query.error || null,
     success: req.query.success || null,
Index: src/routes/embed.js
===================================================================
--- src/routes/embed.js	(revision 6be57b4716118bcb1264cfea3f073b10963be2bf)
+++ src/routes/embed.js	(revision 6be57b4716118bcb1264cfea3f073b10963be2bf)
@@ -0,0 +1,41 @@
+/**
+ * Embedbare player (premium feature #7).
+ *
+ *   GET /embed   -> een zelfstandige, compacte audiospeler-pagina (geen shell),
+ *                   bedoeld om op EXTERNE sites in een <iframe> te zetten.
+ *
+ * De pagina wordt door ons (klonkt-origin) geserveerd, dus de audio-requests vanuit
+ * het iframe blijven same-origin → de /audio/stream-gate laat ze door, ook al staat
+ * het iframe op een vreemde site. We overrulen alleen Helmet's frameguard +
+ * frame-ancestors zodat externe sites mógen inbedden. Hub: /user/:slug/embed.
+ */
+
+import express from 'express';
+import { premiumUnlocked } from '../services/PatreonService.js';
+
+const router = express.Router();
+
+router.get('/embed', (req, res, next) => {
+  if (!premiumUnlocked()) return next();
+  const site = res.locals.site;
+  if (!site) return next();
+
+  // Inbedden op externe sites toestaan (overrule de globale frameguard/CSP).
+  res.removeHeader('X-Frame-Options');
+  res.setHeader(
+    'Content-Security-Policy',
+    "default-src 'self'; media-src 'self' blob: https:; img-src 'self' data: https:; style-src 'unsafe-inline'; script-src 'unsafe-inline' 'self'; frame-ancestors *",
+  );
+
+  const tracks = (res.locals.audioTracks || []).map((t) => ({
+    id: t.id, title: t.title, artist: t.artist, duration: t.duration, url: t.media_url,
+  })).filter((t) => t.url);
+
+  res.render('pages/embed-player', {
+    site,
+    embedTracks: tracks,
+    siteUrlBase: res.locals.siteUrlBase || '',
+  });
+});
+
+export default router;
