Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision 484adf8ccf46e039e63d59739649349e39fc0115)
+++ src/config/database.js	(revision 5045c30366c334b867cb852425f5cc48dcb1323b)
@@ -400,7 +400,8 @@
     CREATE INDEX IF NOT EXISTS idx_ap_delivery_due ON ap_delivery(next_at);
   `);
-  // Auto-boost a followed account's posts ("feature an artist"): their new
-  // top-level posts get re-Announced to our followers automatically.
+  // "Feature" a followed account: its posts show in the local Cirkel.
   ensureColumn('ap_following', 'auto_boost', 'INTEGER DEFAULT 0');
+  // A timeline post you boosted (🔁) — also shown in the Cirkel (mixed by date).
+  ensureColumn('ap_timeline', 'boosted', 'INTEGER DEFAULT 0');
 }
 
Index: src/middleware/render.js
===================================================================
--- src/middleware/render.js	(revision 484adf8ccf46e039e63d59739649349e39fc0115)
+++ src/middleware/render.js	(revision 5045c30366c334b867cb852425f5cc48dcb1323b)
@@ -125,5 +125,5 @@
     // Cirkel = the artists you feature (auto-boost). Shown when AP is on and you
     // auto-boost ≥1 account, or (legacy) on a circle-tenancy site.
-    hasCirkel: !!(_site && apEnabled() && ActivityPubService.autoBoostCount(_site.slug) > 0),
+    hasCirkel: !!(_site && apEnabled() && (ActivityPubService.autoBoostCount(_site.slug) > 0 || ActivityPubService.boostedCount(_site.slug) > 0)),
     isViewer: _isViewer,
     canMutate: !_isViewer,
Index: src/routes/circle.js
===================================================================
--- src/routes/circle.js	(revision 484adf8ccf46e039e63d59739649349e39fc0115)
+++ src/routes/circle.js	(revision 5045c30366c334b867cb852425f5cc48dcb1323b)
@@ -29,5 +29,5 @@
 router.get('/cirkel', (req, res, next) => {
   const site = res.locals.site;
-  if (!site || !apEnabled() || ActivityPubService.autoBoostCount(site.slug) === 0) return next();
+  if (!site || !apEnabled() || (ActivityPubService.autoBoostCount(site.slug) === 0 && ActivityPubService.boostedCount(site.slug) === 0)) return next();
 
   const posts = ActivityPubService.getCirkelPosts(site.slug, 80).map((r) => {
Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 484adf8ccf46e039e63d59739649349e39fc0115)
+++ src/routes/posts.js	(revision 5045c30366c334b867cb852425f5cc48dcb1323b)
@@ -627,5 +627,9 @@
 router.post('/tijdlijn/boost', requireSiteManager, async (req, res) => {
   const site = res.locals.site;
-  if (site) { try { await ActivityPubService.sendInteraction(site, 'boost', (req.body.note || '').toString(), (req.body.author || '').toString()); } catch (e) { /* ignore */ } }
+  const note = (req.body.note || '').toString();
+  if (site && note) {
+    try { await ActivityPubService.sendInteraction(site, 'boost', note, (req.body.author || '').toString()); } catch (e) { /* ignore */ }
+    ActivityPubService.markBoosted(site.slug, note); // also surface it in the Cirkel (mixed by date)
+  }
   res.redirect('/tijdlijn?success=' + encodeURIComponent('Geboost 🔁'));
 });
Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 484adf8ccf46e039e63d59739649349e39fc0115)
+++ src/services/ActivityPubService.js	(revision 5045c30366c334b867cb852425f5cc48dcb1323b)
@@ -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,
