Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 2d6a9c360f54275fa0b6256c64c88bf2d5782554)
+++ src/services/ActivityPubService.js	(revision 476d6e7bb1352031dec41407d91c16837efa540b)
@@ -1472,4 +1472,15 @@
 }
 
+// Step 2: the full bake, incl. @mention links. Resolves @user@host via webfinger ONCE (the
+// same resolver the federated copy uses) and bakes the profile links into content_rendered,
+// so page views never do a per-view lookup. Unresolvable handles stay plain text; on any
+// failure it degrades to the sync #hashtag/URL bake. Async (webfinger) → callers run it off
+// the save response so the request never blocks on a slow/dead remote server.
+export async function bakePostContentWithMentions(source) {
+  const withHashUrls = bakePostContent(source);
+  try { const m = await resolveMentionsInText('', withHashUrls); return m.html; }
+  catch { return withHashUrls; }
+}
+
 // Extract the AP Hashtag tag objects from already-linked reply content.
 function hashtagTags(base, content) {
@@ -2471,4 +2482,4 @@
   deliverWithRetry, enqueueDelivery, processDeliveryQueue, startDeliveryWorker,
   getReplyUris, markNotificationsSeen, countUnseenNotifications, hasPlayableAudio,
-  linkifyBody, bakePostContent, listFollowers, removeFollower,
+  linkifyBody, bakePostContent, bakePostContentWithMentions, listFollowers, removeFollower,
 };
