Index: src/routes/activitypub.js
===================================================================
--- src/routes/activitypub.js	(revision 97bacf2bd1fa5c118355c94e36492a020d61d024)
+++ src/routes/activitypub.js	(revision cc3cf7dfa8380e09d7fbe9a8e4875036d28eaede)
@@ -162,7 +162,12 @@
       // client renders their images/audio like own outbox posts.
       attachment: AP.timelineAttachments(t.media_json),
-      // FEP-9098 custom emojis: the note's Emoji tags, so the client can
-      // render :shortcode: as an image instead of literal text.
-      tag: AP.timelineEmojis(t.emoji_json),
+      // The note's preserved tags, so the client can render them: FEP-9098
+      // Emoji tags (:shortcode: → image) and FEP-e232 Link tags (quotes /
+      // inline object references). Combined into one `tag` array; omitted
+      // when the note has neither.
+      tag: (() => {
+        const tags = [...(AP.timelineEmojis(t.emoji_json) || []), ...(AP.timelineObjectLinks(t.link_json) || [])];
+        return tags.length ? tags : undefined;
+      })(),
     },
   }));
