Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision dd1028af6e9c6676e6c93734784524e86e57a3d6)
+++ src/services/ActivityPubService.js	(revision 065452a3f8936e062c22bd7a85e993c57f1814cb)
@@ -101,5 +101,10 @@
   const aId = actorId(base, site.slug);
   const human = `${base}/${encodeURIComponent(post.slug)}`;
-  const html = post.content || ''; // posts store sanitized HTML
+  // Mastodon ignores a Note's `name`, so put the title INTO the content (bold
+  // first line) — the standard blog→fediverse convention. post.content is
+  // already sanitized HTML; the title is plain text, so escape it.
+  const escTitle = String(post.title || '').replace(/[<>&]/g, (c) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;' }[c]));
+  const titleHtml = post.title ? `<p><strong>${escTitle}</strong></p>` : '';
+  const html = titleHtml + (post.content || '');
   return {
     id,
@@ -107,5 +112,4 @@
     attributedTo: aId,
     content: html,
-    name: post.title || undefined,
     url: human,
     published: new Date(post.published_at || post.created_at || Date.now()).toISOString(),
