Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 5a93ac05e84fc2017fb741af8a7071f46419619d)
+++ src/routes/posts.js	(revision eb852c5856f54a4e8690534406540d8a33e0bfcc)
@@ -369,4 +369,11 @@
   if (!PermissionsService.canDeletePost(req.session.user, post, site)) {
     return res.status(403).send('No permission');
+  }
+
+  // ActivityPub: tell followers the post is gone (Delete + Tombstone), but only
+  // if it was actually federated (published + not fan-only). Fire before the row
+  // is removed — we still have post.id (= the Note id).
+  if (post.status === 'published' && !post.fan_only) {
+    ActivityPubService.deliverDelete(site, post).catch(() => { /* best-effort */ });
   }
 
Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 5a93ac05e84fc2017fb741af8a7071f46419619d)
+++ src/services/ActivityPubService.js	(revision eb852c5856f54a4e8690534406540d8a33e0bfcc)
@@ -288,7 +288,28 @@
 }
 
+// Tell followers a post is gone (Delete + Tombstone) so it's removed from their feeds.
+export async function deliverDelete(site, post) {
+  const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
+  if (!base || !site || !site.slug || !post || !post.id) return;
+  const followers = fStmts().list.all(site.slug);
+  if (!followers.length) return;
+  const inboxes = [...new Set(followers.map((f) => f.shared_inbox || f.inbox).filter(Boolean))];
+  const keys = getOrCreateKeys(site.slug);
+  const me = actorId(base, site.slug);
+  const nid = noteId(base, post.id);
+  const del = {
+    '@context': 'https://www.w3.org/ns/activitystreams',
+    id: `${nid}#delete-${Date.now()}`,
+    type: 'Delete',
+    actor: me,
+    to: [PUBLIC],
+    object: { id: nid, type: 'Tombstone' },
+  };
+  for (const inbox of inboxes) deliver(inbox, del, `${me}#main-key`, keys.private_pem).catch(() => { /* best-effort */ });
+}
+
 export default {
   getOrCreateKeys, apWants, sendAP, actorId, noteId,
   buildActor, buildNote, buildCreate, buildOutbox, buildFollowers,
-  followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate,
+  followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete,
 };
