Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 55bba230a2ce508b0cd79ff85d0f16c00382bb9c)
+++ src/services/ActivityPubService.js	(revision 4b5223f7a48f5778e009ab2aa6218ede7b00fc7b)
@@ -156,4 +156,11 @@
   } catch { /* non-fatal */ }
   body = body.replace(/\[\[(track|album|playlist):[^\]]+\]\]/gi, '');
+  // External embeds ([[embed:url]]) → emit the bare URL as a link so Mastodon
+  // renders its OWN preview/player card (YouTube/Spotify/SoundCloud/etc) instead
+  // of federating the raw shortcode text.
+  body = body.replace(/\[\[embed:([^\]]+)\]\]/gi, (mm, raw) => {
+    const u = esc(raw.trim().replace(/&amp;/g, '&'));
+    return `<p><a href="${u}">${u}</a></p>`;
+  });
   if (hadAudio) {
     const lbl = audioLabels.length ? esc(audioLabels.slice(0, 4).join(', ')) : '';
