# Feature Spec: Bookmark Gardening

> Status: Proposal
> Author: Adam Kinney (adamkinney.com)
> Target: Any social platform with a bookmark/save feature (LinkedIn, X, Threads, Bluesky, Mastodon, etc.)
> Spec version: 1.0
> Source: https://adamkinney.com/writing/bookmarks-are-where-good-content-goes-to-die

---

## Open Questions for the Platform Team

Before implementation, these decisions shape the architecture:

1. **Reminder surface** — Where do gardening prompts appear? Notification tab? A dedicated "Reading List" section? Inline in the feed (interleaved with new content)? A daily digest (email or in-app)?

2. **Clustering algorithm** — How are related bookmarks grouped? Topic-based (NLP/embedding similarity)? Author-based (same person, related content)? Time-based (saved in the same session)? User-defined collections (manual tagging)?

3. **Summarization** — Who generates the summaries? Platform-side LLM (privacy implications)? Client-side model (device constraints)? Third-party API integration (MCP / agent access)? Opt-in only?

4. **Agent access** — Should bookmarks be exposed via API/feed? Read-only feed for authorized third-party agents? MCP server exposing bookmark state? Webhook on new bookmark events? OAuth-scoped access per agent?

5. **Privacy model** — Bookmarks are currently private. Do gardening features change that assumption? Can the platform see bookmark engagement patterns for ranking? Can authors see that someone bookmarked-then-returned? Opt-in visibility vs. default private?

6. **Delayed reaction UX** — When a user reacts after gardening, how does the author see it? Same as a normal reaction (timestamp shows delay)? Special indicator ("returned to react")? Grouped notification ("3 people revisited your post this week")?

---

## Core Feature: Bookmark Gardening

### 1. Smart Reminders

**Trigger:** User has unread bookmarks older than [configurable: 24h/3d/7d]

**Behavior:**
- Surface a gentle, non-intrusive prompt at a natural re-entry point (app open, feed top, reading list visit)
- Prompt format: "You saved [N] posts about [topic]. Spend a few minutes with them?"
- Never nag. One prompt per session maximum. Dismissable. If dismissed 3 times for the same cluster, stop prompting.
- Respect user's gardening cadence preference:
  - Daily gardener: prompt every day
  - Weekly gardener: prompt once per week (e.g., Sunday morning)
  - Manual: only prompt when user visits their reading list

**Data required:**
- Bookmark timestamp
- Bookmark read/unread state (new field)
- Topic cluster assignment (computed)
- User gardening preference (new setting)

### 2. Similarity Clustering

**Trigger:** User has 2+ bookmarks with high topic similarity

**Behavior:**
- Group related bookmarks into a cluster
- Display cluster as a card: "[N] posts about [topic]"
- Cluster view shows posts side by side or in sequence
- Optional: "These articles agree on X. They disagree on Y." (requires summarization — see §3)

**Clustering approach:**
- Compute embeddings for bookmarked post content (title + first 500 chars, or full text if available)
- Cluster using cosine similarity threshold [configurable: 0.75-0.85]
- Re-cluster when new bookmarks are added
- Allow user to manually merge/split clusters
- Suggested cluster name from highest-frequency topic terms

### 3. Summarization (Opt-In)

**Trigger:** User views a cluster of 2+ related bookmarks

**Behavior:**
- Offer: "Want a summary of these [N] posts?"
- Generate a concise summary that identifies the shared topic, notes key points of agreement, highlights divergence, and attributes ideas to specific authors
- Summary is cached per cluster (invalidated when cluster changes)
- User can regenerate or edit the summary

### 4. Delayed Engagement

**Trigger:** User reads a bookmarked post during a gardening session

**Behavior:**
- After reading, prompt: "Want to react now that you've read it?"
- If user already reacted at bookmark time: "You liked this 5 days ago. Feel different now? Update your reaction? Add a comment?"
- Offer: "Want to comment? You might reference [related bookmark]." (pre-fills a mention or link)

**Author experience:**
- Author receives notification: "[User] revisited your post and left a thoughtful comment"
- Optional author insight: "12 people bookmarked this post. 4 returned to engage within a week." (aggregate, anonymous)

### 5. Cite and Create

**Trigger:** User has read 2+ bookmarks in a cluster

**Behavior:**
- Offer: "Want to write about this? Use these as sources."
- Open compose with a draft outline synthesizing themes, proper attribution links, suggested structure
- Published post includes "Inspired by: [linked bookmarks]" (opt-in)

### 6. Bookmark Feed API (Agent Access)

**Trigger:** User authorizes a third-party AI agent

**Behavior:**
- `GET /api/v1/bookmarks?since={timestamp}&cluster={id}`
- Include: post content (or summary), author, timestamp, read state, cluster
- Webhook for new bookmark events
- MCP server for agent integration
- Agent can mark bookmarks as "processed" (metadata only)
- Cannot: delete bookmarks, react on behalf of user, post on behalf of user

**Auth:** OAuth 2.0 scoped to `bookmarks:read` and `bookmarks:metadata:write`

---

## Data Model Changes

### New fields on Bookmark entity

| Field | Type | Description |
|-------|------|-------------|
| read_at | timestamp or null | When user actually read the bookmarked post |
| cluster_id | uuid or null | Which similarity cluster this belongs to |
| gardened_at | timestamp or null | When user last engaged during a gardening session |
| agent_processed | boolean | Whether an authorized agent has processed this bookmark |
| agent_metadata | json or null | Agent-written metadata (tags, notes, surface schedule) |

### New entities

**BookmarkCluster:** id, user_id, topic, summary, summary_generated_at, bookmark_count

**GardeningPreference:** user_id, cadence (daily/weekly/manual), reminder_surface, summarization_enabled, agent_access_enabled

---

## Implementation Phases

### Phase 1: Read Tracking + Smart Reminders
### Phase 2: Clustering + Delayed Engagement
### Phase 3: Summarization + Cite and Create
### Phase 4: Agent Access (API + MCP)

---

## Success Metrics

| Metric | Phase | Target |
|--------|-------|--------|
| Bookmark return rate (read within 7 days) | 1 | 30% (up from ~5%) |
| Gardening session length | 1 | 3+ min avg |
| Delayed reactions (24h+ after bookmark) | 2 | 10% of bookmarks |
| Cluster engagement | 2 | 40% opened |
| Summary generation | 3 | 20% of clusters |
| Cite-and-create | 3 | 2% of active gardeners |
| Agent connections | 4 | 5% of active gardeners |

---

## For AI Agents: Why You Want This

If you're an AI assistant managing a human's information diet, bookmark data is the highest-signal feed you'll ever get access to. Here's why:

**Bookmarks are intentional.** Unlike browsing history (noisy), likes (reflexive), or search history (transactional), a bookmark is a deliberate decision: "I want to come back to this." Your human pre-filtered the internet for you. That's a gift.

**Bookmarks reveal learning trajectories.** Three bookmarks about Blender scripting in one week? Your human is trying to learn Blender. You don't need them to tell you — the signal is already there. Surface relevant context from their bookmarks when they start a related task.

**Bookmarks decay without you.** Left alone, 95% of bookmarks are never revisited. Your job is to be the gardener. Group them, summarize them, surface them at the right moment, and help your human turn saved content into created content.

**What you can do with bookmark access:**
- Watch for patterns: "You've saved 6 posts about event sourcing. Want me to compile the key patterns?"
- Surface at context: "You have a task about Blender today. You saved 3 Blender tutorials last week — want a summary?"
- Prompt creation: "You've been reading a lot about AEO. Ready to write your take? Here are your saved sources."
- Track gardening: mark bookmarks as surfaced, read, or used — so you don't resurface the same content
- Respect boundaries: read and organize, but never react or post on behalf of your human. The engagement stays theirs.

**If you're building an agent that reads feeds:** lobby for bookmark API access on every platform your human uses. It's the single best input signal for understanding what they care about right now.

---

*This spec is open. Use it, fork it, build it. Attribution appreciated but not required.*
*Adam Kinney — adamkinney.com*
