Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 484adf8ccf46e039e63d59739649349e39fc0115)
+++ src/services/ActivityPubService.js	(revision 3384e9568740c62ed4f832fb8c0a77e7e7006915)
@@ -1056,10 +1056,12 @@
 export function getCirkelPosts(slug, limit) {
   try {
+    // Cirkel = posts from featured (auto_boost) accounts + posts you boosted
+    // (t.boosted), mixed by date. One row per note in ap_timeline → no duplicates.
     if (!_cirkelPosts) _cirkelPosts = db.prepare(`
       SELECT t.id, t.author_uri, t.author_name, t.author_handle, t.author_icon, t.author_url,
              t.content, t.url, t.published, t.media_json
       FROM ap_timeline t
-      JOIN ap_following f ON f.slug = t.slug AND f.actor_uri = t.author_uri AND f.auto_boost = 1
-      WHERE t.slug = ?
+      LEFT JOIN ap_following f ON f.slug = t.slug AND f.actor_uri = t.author_uri
+      WHERE t.slug = ? AND (f.auto_boost = 1 OR t.boosted = 1)
       ORDER BY COALESCE(t.published, t.created_at) DESC, t.rowid DESC
       LIMIT ?`);
@@ -1069,4 +1071,12 @@
 export function getCirkelMembers(slug) {
   try { if (!_cirkelMembers) _cirkelMembers = db.prepare('SELECT name, url, icon FROM ap_following WHERE slug = ? AND auto_boost = 1 ORDER BY name'); return _cirkelMembers.all(slug); } catch { return []; }
+}
+// Mark a timeline post as boosted so it shows in the Cirkel (mixed by date).
+let _markBoost, _boostedCount;
+export function markBoosted(slug, noteId) {
+  try { if (!_markBoost) _markBoost = db.prepare('UPDATE ap_timeline SET boosted = 1 WHERE slug = ? AND id = ?'); _markBoost.run(slug, noteId); } catch { /* ignore */ }
+}
+export function boostedCount(slug) {
+  try { if (!_boostedCount) _boostedCount = db.prepare('SELECT COUNT(*) AS n FROM ap_timeline WHERE slug = ? AND boosted = 1'); return _boostedCount.get(slug).n; } catch { return 0; }
 }
 
@@ -1346,5 +1356,5 @@
   listOutbox, deliverOutboxDelete,
   webfingerResolve, followActor, resolveRemoteActor, unfollowActor, listFollowing, setAutoBoost, getTimeline, sendInteraction,
-  autoBoostCount, getCirkelPosts, getCirkelMembers, autoMigrateCircles, selfHealTimeline, boostLatestN,
+  autoBoostCount, boostedCount, markBoosted, getCirkelPosts, getCirkelMembers, autoMigrateCircles, selfHealTimeline, boostLatestN,
   getNotifications, listBlocks, isBlockedAny, blockTarget, unblock,
   deliverWithRetry, enqueueDelivery, processDeliveryQueue, startDeliveryWorker,
