Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision fe97cc38d423c6b67d75cc07bab36c9ef2dd4f91)
+++ src/services/ActivityPubService.js	(revision 7f265ceaf13b1424663badd9afaa64fcfab3d0bd)
@@ -1402,5 +1402,7 @@
 // Turn #hashtags in reply text into Mastodon-style hashtag links (clickable + federated).
 function linkHashtags(base, html) {
-  return String(html || '').replace(/(^|[\s>])#([\p{L}\p{M}\p{N}_]+)/gu, (m, pre, tag) =>
+  // Prefix: start / whitespace / '>' / opening bracket — "(#tag" is a tag too. NO quote
+  // chars in this class: a quote precedes attribute values (alt="#…"), which must not match.
+  return String(html || '').replace(/(^|[\s>([{])#([\p{L}\p{M}\p{N}_]+)/gu, (m, pre, tag) =>
     `${pre}<a href="${base}/tag/${encodeURIComponent(tag.toLowerCase())}" class="mention hashtag" rel="tag">#${tag}</a>`);
 }
@@ -1413,5 +1415,5 @@
   for (let i = 0; i < parts.length; i++) {
     if (/^<a\b/i.test(parts[i])) continue; // already a link → leave as-is
-    parts[i] = parts[i].replace(/(^|[\s>])(https?:\/\/[^\s<]+?)([.,;:!?)\]»]*)(?=$|[\s<])/g,
+    parts[i] = parts[i].replace(/(^|[\s>([{])(https?:\/\/[^\s<]+?)([.,;:!?)\]»]*)(?=$|[\s<])/g,
       (m, pre, url, trail) => `${pre}<a href="${url.replace(/"/g, '%22')}" rel="nofollow noopener" target="_blank">${url}</a>${trail}`);
   }
@@ -1485,5 +1487,7 @@
   const inboxes = [];
   const handles = new Set();
-  const re = /(^|[\s>])@([\p{L}\p{M}\p{N}_.-]+@[\p{L}\p{M}\p{N}.-]+)/gu;
+  // Prefix also allows opening brackets — "(@user@host + me)" is a mention too (real-world
+  // miss: a bracketed mention federated as plain text and its target was never notified).
+  const re = /(^|[\s>([{])@([\p{L}\p{M}\p{N}_.-]+@[\p{L}\p{M}\p{N}.-]+)/gu;
   let m;
   while ((m = re.exec(html || ''))) handles.add(m[2]);
@@ -1498,5 +1502,5 @@
     const profileUrl = actorInfo(actor, actorUri).url || actorUri; // human profile page → the link href
     const esc = h.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
-    out = out.replace(new RegExp('(^|[\\s>])@' + esc + '(?![\\p{L}\\p{M}\\p{N}_.-])', 'gu'),
+    out = out.replace(new RegExp('(^|[\\s>([{])@' + esc + '(?![\\p{L}\\p{M}\\p{N}_.-])', 'gu'),
       (full, pre) => `${pre}<a href="${profileUrl}" class="u-url mention" data-actor="${actorUri}">@${h}</a>`);
   }
