Index: src/routes/activitypub.js
===================================================================
--- src/routes/activitypub.js	(revision 6fd0e20cf8f015658ff3a7c4a2acd4c1102e2877)
+++ src/routes/activitypub.js	(revision 46a30f032f67041dd4baca6f51995e41ee1f23f6)
@@ -174,4 +174,17 @@
       // note has no quote or the quoted post could not be resolved.
       'shaer:quote': AP.timelineQuote(t.quote_json),
+      // The post author's display info (name / @handle / avatar), so every card
+      // gets a byline header like the quote card. attributedTo stays the bare
+      // actor URI; this is the resolved presentation Klonkt already stored.
+      'shaer:author': (t.author_name || t.author_handle || t.author_icon) ? {
+        name: t.author_name || undefined, handle: t.author_handle || undefined,
+        icon: t.author_icon || undefined, url: t.author_url || undefined,
+      } : undefined,
+      // When a followed account boosted this, who did ("X boosted"). Omitted for
+      // ordinary posts.
+      'shaer:booster': (t.reblog_name || t.reblog_handle || t.reblog_icon) ? {
+        name: t.reblog_name || undefined, handle: t.reblog_handle || undefined,
+        icon: t.reblog_icon || undefined,
+      } : undefined,
     },
   }));
