Index: src/routes/admin-audio.js
===================================================================
--- src/routes/admin-audio.js	(revision 64016815dd12ec86d05866d6d71bca783024094d)
+++ src/routes/admin-audio.js	(revision 8ed36de2a9b6b822f55c28663bec1275f43fb70d)
@@ -23,4 +23,5 @@
 import { audioUrl } from '../services/AudioStreamService.js';
 import { mediaDir } from '../config/paths.js';
+import * as ActivityPubService from '../services/ActivityPubService.js';
 
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -301,4 +302,10 @@
   if (!track) return res.redirect('/admin/audio?error=Not+found');
 
+  // Zeg de fediverse dat de track weg is, VOOR de rij verdwijnt -- zelfde
+  // volgorde en zelfde reden als bij een post (posts.js). Zonder dit blijft
+  // elke server die hem indexeerde ernaar wijzen terwijl het object 404 geeft;
+  // op de hub stond daardoor op 21-8 een track met een dode link.
+  ActivityPubService.deliverTrackDelete(site, track.track_id).catch(() => { /* best-effort */ });
+
   db.prepare('DELETE FROM audio_tracks WHERE id = ?').run(track.track_id);
   if (track.media_id) {
@@ -371,5 +378,11 @@
     if (o.media_id) db.prepare('DELETE FROM media WHERE id = ?').run(o.media_id);
   });
-  for (const o of orphans) deleteOne(o);
+  for (const o of orphans) {
+    // Ook hier aankondigen. Een wees is voor ONS een track zonder bestand, maar
+    // voor de buitenwereld was het een gewoon Audio-object dat zij hebben
+    // opgeslagen; stil weggooien laat hun kopie staan.
+    ActivityPubService.deliverTrackDelete(site, o.track_id).catch(() => { /* best-effort */ });
+    deleteOne(o);
+  }
 
   res.json({ ok: true, deleted: orphans.length });
