Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision e954722546e9cef8a8c5be247b8541f01b9338fd)
+++ src/services/ActivityPubService.js	(revision 80797d752bc2d91ef2348102b517b288a4132afd)
@@ -290,4 +290,10 @@
     if (cov) note.image = { type: 'Image', mediaType: mediaType(cov), url: cov };
   }
+  // Experiment (mirrors PeerTube / schema.org `embedUrl`): point at the GATED player page
+  // (/embed) so a client that honours embedUrl can show an inline player WITHOUT ever
+  // getting the audio file — the anti-steal posture is untouched. `embedUrl` is a real
+  // standard field name (not a Klonkt invention); if Mastodon's apps honour it on a Note we
+  // make it JSON-LD-clean with a context term, otherwise it degrades to the player card.
+  if (playable) note.embedUrl = `${base}/embed?post=${encodeURIComponent(post.slug)}`;
   return note;
 }
