agentsclimarketplace

Personal content resurface

Skill build-with-dhiraj/ai-workflow-framework-portability-kit/Skills/personal-content-resurface

Decide which saved personal content (saved YouTube videos, Instagram reels, WhatsApp self-messaged links/files, LinkedIn saved posts) should re-surface today, based on time-since-last-surface plus relevance to the user's current context. Returns a ranked list with reasons. Teaches three algorithms (SM-2, FSRS, custom context-aware hybrid) — the implementer picks at build time. Decision math only, not surfacing UX. Use when the user asks "what should I re-look at today", "resurface saved content", "spaced repetition for my saved stuff", "Connecting Dots prioritization", "second brain re-surfacing", "what saved content matters right now", "personalized content scheduling", or any variant of "I save things and never re-look at them — what should I look at now?"From its SKILL.md

Install
npx -y skills add build-with-dhiraj/ai-workflow-framework-portability-kit --skill personal-content-resurface

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

4.9 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it

Personal-content re-surface decision math

What this skill does

Given (a) a corpus of saved personal content, (b) a static user profile, and (c) the user's recent activity, decide which N items to re-surface today and why. Output is a ranked list with one-line reasons. Does NOT define the UX (push notif vs daily digest vs dashboard widget) — that lives in product code.

Inputs

SignalShapeSource
Corpus item{id, source, captured_at, text/embedding, tags, last_surfaced_at, surface_count, useful_score}Obsidian vault, Pinecone, or Supabase — whatever the store is
Static user profile{interests[], role, current_projects[], stated_priorities[]}User-authored, lives in Obsidian or app DB
Dynamic recent activity{queries_this_week[], content_consumed_this_week[], current_focus_topic}Activity log of last 7 days

Output

[
  { "item_id": "yt_abc123", "score": 0.87, "reason": "topic match with current focus + 14d since last surface" },
  { "item_id": "wa_xyz", "score": 0.81, "reason": "high useful_score + 60d dormant" }
]

Rank descending. Cap at N (default 5). Each item carries a one-line reason for transparency.

Three algorithms — pick at build time

1. SM-2 (classic Anki) — day-1, no personalization needed

Decay-only. Each item has interval and ease_factor. When marked useful, interval grows. Re-surface when now > last_surfaced_at + interval. Zero LLM in the loop. Cheapest compute.

Use when: MVP day-1, corpus <100 items, no feedback signal yet.

2. FSRS (Free Spaced Repetition Scheduler) — modern, accurate

Three latent variables per item: difficulty, stability, retrievability. Updates via maximum-likelihood estimation. Outperforms SM-2 in benchmarks.

Use when: corpus >500 items AND ≥30 useful/not-useful events accumulated to train the model.

3. Custom context-aware hybrid — the Connecting-Dots moat

score = 0.5 × time_decay + 0.3 × relevance_to_recent_activity + 0.2 × static_profile_match
  • time_decay: forgetting curve, sigmoid over days-since-surface
  • relevance_to_recent_activity: cosine sim between item embedding and embedding of last 7d activity
  • static_profile_match: cosine sim between item embedding and embedding of user profile

Use when: corpus >100 items AND user has authored a meaningful profile. The recommended path for Connecting Dots specifically — pure spaced-rep misses the "this is suddenly relevant" signal that recent activity unlocks.

See references/algorithms.md for exact formulas, half-life tuning, and edge cases.

Decision matrix

StageCorpusFeedback eventsAlgorithm
MVP day 1<1000SM-2
MVP weeks 2–4100–500<30Custom hybrid (no FSRS training data yet)
Mature500+30+FSRS + hybrid signal — ensemble

Common pitfalls

  • Cold start: day-1 has no feedback. Default to SM-2 with ease=2.5, interval=1. Don't attempt FSRS.
  • Recency bias: if only dynamic activity drives the score, old gold gets buried. The time_decay term fights this.
  • Echo chamber: if relevance_to_recent_activity weights too high, the user only sees more-of-the-same. Cap that term at 0.5; force diversity sampling for top-N.
  • Surface fatigue: enforce min_days_between_surface = 7 regardless of score — same item every day is annoying.
  • Feedback bootstrap: cold-start the useful_score to 0.5 (neutral), update on user signal. Never let it drop below 0.1 — that's bandit-style starvation.

What this skill does NOT do

  • Pull content from source platforms — that's baoyu-youtube-transcript, integrate-whatsapp, superpowers-chrome:browsing, etc.
  • Store content — that's obsidian-vault, memory-router, or supabase.
  • Extract entities/topics from content — that's ner-content-pipeline.
  • Render the surface UX — that's product code (Obsidian dashboard, web app, push notif daemon).
  • Build the RAG pipeline that answers queries — that's rag-patterns.

It only answers: "Given everything you have, what should I look at today?"

What ships with it: 1 file

6.0 KB alongside SKILL.md

references/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.