Index: src/routes/circle.js
===================================================================
--- src/routes/circle.js	(revision 366c13c2c490f6a154586f546de8750b9d6d5978)
+++ src/routes/circle.js	(revision 2f50c533f5a3f95640b17e833ac1bb7bc0207ac1)
@@ -32,4 +32,13 @@
   return String(html || '').replace(/<[^>]+>/g, ' ').replace(/&[a-z#0-9]+;/gi, ' ').replace(/\s+/g, ' ').trim();
 }
+// Tidy a plain-text snippet for use as a card title: drop a leading "RE: <url>" (the
+// quote/reply prefix Misskey/Akkoma and some reply federation prepend) and any other
+// leading bare URL, so the title shows the actual prose, not link noise.
+function tidySnippet(text) {
+  return String(text || '')
+    .replace(/^RE:\s*https?:\/\/\S+\s*/i, '')
+    .replace(/^https?:\/\/\S+\s*/i, '')
+    .trim();
+}
 
 router.get('/cirkel', (req, res, next) => {
@@ -38,5 +47,5 @@
 
   const posts = ActivityPubService.getCirkelPosts(site.slug, 80).map((r) => {
-    const text = htmlToText(r.content);
+    const text = tidySnippet(htmlToText(r.content));
     // Show ONLY the title (the bold first line a Klonkt note carries), not the whole
     // body. Title-less notes (e.g. plain Mastodon) fall back to a short text snippet.
