Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision c74565987caf12d910b2fb8dd439042dd0e2f94f)
+++ src/services/ActivityPubService.js	(revision 3289a6433bf12cccc844824d53d4f353853ef2f0)
@@ -352,5 +352,5 @@
     _delLA = db.prepare('DELETE FROM ap_interactions WHERE kind = ? AND post_id = ? AND actor_uri = ?');
     _delReply = db.prepare("DELETE FROM ap_interactions WHERE kind = 'reply' AND object_uri = ?");
-    _listI = db.prepare('SELECT id, kind, object_uri, parent_uri, actor_uri, actor_name, actor_handle, actor_url, actor_icon, content, published, created_at, acted_boost FROM ap_interactions WHERE post_id = ? ORDER BY created_at ASC');
+    _listI = db.prepare('SELECT id, kind, object_uri, parent_uri, actor_uri, actor_name, actor_handle, actor_url, actor_icon, content, published, created_at, acted_boost, acted_like FROM ap_interactions WHERE post_id = ? ORDER BY created_at ASC');
     _getI = db.prepare('SELECT * FROM ap_interactions WHERE id = ?');
     _insO = db.prepare('INSERT INTO ap_outbox (id, site_slug, post_id, post_slug, in_reply_to, to_actor, to_handle, content, created_at) VALUES (?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP)');
@@ -364,4 +364,7 @@
 export function setInteractionBoosted(id, on) {
   db.prepare('UPDATE ap_interactions SET acted_boost = ? WHERE id = ?').run(on ? 1 : 0, id);
+}
+export function setInteractionLiked(id, on) {
+  db.prepare('UPDATE ap_interactions SET acted_like = ? WHERE id = ?').run(on ? 1 : 0, id);
 }
 
@@ -423,5 +426,5 @@
       actor_name: r.actor_name, actor_handle: r.actor_handle, actor_url: r.actor_url,
       actor_icon: r.actor_icon, content: r.content, created_at: r.published || r.created_at,
-      acted_boost: !!r.acted_boost,
+      acted_boost: !!r.acted_boost, acted_like: !!r.acted_like,
       children: [],
     });
@@ -1223,11 +1226,14 @@
   const fanout = (kind === 'boost' || kind === 'unboost'); // also goes to our followers
   let act;
-  if (kind === 'unboost') {
+  if (kind === 'unboost' || kind === 'unlike') {
+    // Undo(Announce) retracts a boost; Undo(Like) un-favourites (matched on actor+object,
+    // no record of the original activity needed — Mastodon honours both).
+    const inner = kind === 'unboost' ? 'Announce' : 'Like';
     act = {
       '@context': 'https://www.w3.org/ns/activitystreams',
       id: `${me}#undo-${Date.now()}-${rid()}`, type: 'Undo', actor: me,
-      to: [PUBLIC], cc: [`${me}/followers`],
-      object: { id: `${me}#announce-${Date.now()}-${rid()}`, type: 'Announce', actor: me, object: targetNoteId },
+      object: { id: `${me}#${inner.toLowerCase()}-${Date.now()}-${rid()}`, type: inner, actor: me, object: targetNoteId },
     };
+    if (kind === 'unboost') { act.to = [PUBLIC]; act.cc = [`${me}/followers`]; }
   } else {
     const type = kind === 'boost' ? 'Announce' : 'Like';
@@ -1331,5 +1337,5 @@
   buildActor, buildNote, buildCreate, buildOutbox, buildFollowers, buildFeatured,
   followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete, deliverUpdate, deliverActorUpdate, resyncFeaturedPins,
-  getInteractions, getInteractionById, setInteractionBoosted, buildReplyNote, getOutboxNote, deliverReply, resolveRemoteNote,
+  getInteractions, getInteractionById, setInteractionBoosted, setInteractionLiked, buildReplyNote, getOutboxNote, deliverReply, resolveRemoteNote,
   listOutbox, deliverOutboxDelete,
   webfingerResolve, followActor, resolveRemoteActor, unfollowActor, listFollowing, setAutoBoost, getTimeline, sendInteraction,
