Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 5410d4df71323137e60b05a38aa6eb7b4cd6e4e4)
+++ src/routes/posts.js	(revision 5a6a457ca2bf625de84ec03d20f7757480337fde)
@@ -353,4 +353,14 @@
     }
   } catch (e) { /* FTS issues non-fatal */ }
+
+  // ActivityPub: federate when a post BECOMES published (draft/scheduled → published
+  // via the editor). A brand-new published post is handled in the create route.
+  if (finalStatus === 'published' && post.status !== 'published' && !fanOnly) {
+    ActivityPubService.deliverCreate(site, {
+      id: post.id, slug: finalSlug, title: title || finalSlug,
+      content: cleanContent, cover_image_url: cover_image_url || null,
+      published_at: publishedAt, created_at: post.created_at,
+    }).catch(() => { /* best-effort */ });
+  }
 
   res.redirect(`${res.locals.siteUrlBase || ''}/${finalSlug}`);
