no-more-fomo

Use when user says 'fomo', 'digest', 'daily', 'AI news', 'today's papers', 'what's new in AI', 'catch up', or on a scheduled daily cron trigger.

No More FOMO

Daily AI intelligence briefing: Twitter KOLs + AI lab blogs + tech podcasts + HackerNews.

IMPORTANT: Primary digest is always in English. After generating the English version, automatically translate to Chinese and save as YYYY-MM-DD-zh.md (skip with --en-only). Both versions get HTML rendering. Speaker names, model names, and technical terms stay in original form in both versions.

When to Use

  • User asks about today's AI papers, news, or trending research
  • Morning routine check-in on new releases
  • Scheduled daily cron trigger

When NOT to use: Searching for a specific paper (use WebFetch or arxiv directly).

Prerequisites

  • xreach (npm i -g xreach-cli) — Twitter/X data. Requires auth: xreach auth
  • curl — RSS feeds and HN API (standard on all systems)
  • Jina Reader — free, no auth needed (https://r.jina.ai/URL)
  • baoyu-youtube-transcript (optional) — podcast transcript download with chapters and speaker detection. Path: ~/.claude/plugins/ljg-skills/.agents/skills/baoyu-youtube-transcript. If not installed, falls back to yt-dlp.
  • bun (optional) — runtime for youtube-transcript scripts. Required only if youtube-transcript is installed.
  • yt-dlp — podcast YouTube subtitles (fallback if youtube-transcript unavailable)

Sources

Twitter — Tier 1: KOLs (Default, always fetched)

HandleWhoFocusCount
@_akhaliqAKPapers, models, tools — highest signal/volume-n 50
@karpathyAndrej KarpathyDeep insights, tutorials, AI commentary-n 20
@doteyBaoyuChinese AI community, translations, commentary-n 30
@bchernyBoris ChernyClaude Code core dev, coding agents-n 20
@oran_geOrangeAIAI research, tools, commentary-n 20
@trq212ThariqClaude Code core dev-n 20
@swyxswyxLatent Space host, AI engineering ecosystem-n 20
@emollickEthan MollickWharton professor, AI adoption & impact-n 20
@drjimfanJim FanNVIDIA robotics/embodied AI research-n 20
@simonwSimon WillisonLLM tooling, Datasette creator, pragmatic builder-n 20
@hardmaruDavid HaSakana AI CEO, creative AI research-n 20
@ylecunYann LeCunMeta/NYU, AI theory debates, high signal-n 20
@cursor_aiCursorAI-native code editor-n 15
@AnthropicAIAnthropicClaude, safety research-n 15
@OpenAIOpenAIGPT, API, product launches-n 15
@GoogleDeepMindGoogle DeepMindModels, research papers-n 15

Twitter — Tier 2: More Companies & Tools (on-demand via --full)

HandleWhoFocus
@xaixAIGrok, compute infrastructure
@WindsurfAIWindsurfAI coding (Codeium)
@cognitionCognitionDevin, autonomous coding agent
@replitReplitAI-native IDE & deployment
@huggingfaceHugging FaceOpen-source models & datasets
@llama_indexLlamaIndexRAG, AI agents for documents

Users can also add any handle via arguments: /no-more-fomo @someone

AI Lab Blogs

SourceURLMethod
DeepMindhttps://deepmind.google/blog/rss.xmlJina Reader
Anthropichttps://www.anthropic.com/research + https://www.anthropic.com/newsJina Reader (no RSS)
OpenAIhttps://openai.com/blog/rss.xmlJina Reader

Tech Podcasts (RSS)

PodcastRSS FeedTranscript SourceFocus
No Priorshttps://rss.art19.com/no-priors-aiYouTube subsAI/ML/startups — top researcher interviews
Latent Spacehttps://api.substack.com/feed/podcast/1084089.rssSubstack post (embedded)AI engineering deep dives
Dwarkesh Podcasthttps://apple.dwarkesh-podcast.workers.dev/feed.rssSubstack post (embedded)Long-form interviews with AI leaders
Training Data (Sequoia)https://feeds.megaphone.fm/trainingdataYouTube subsAI/tech from Sequoia Capital

Transcript retrieval (Phase 2 — automatic, no flag needed):

Phase 2 automatically processes new podcast episodes. Primary method uses youtube-transcript:

# Step 1: Find YouTube URL for the episode
# Preferred: extract youtube.com URL from RSS <enclosure> or <link>
# Fallback: search YouTube
yt-dlp --flat-playlist "ytsearch1:PODCAST_NAME EPISODE_TITLE" --print url
# Step 2: Download transcript with chapters and speaker detection
bun ~/.claude/plugins/ljg-skills/.agents/skills/baoyu-youtube-transcript/scripts/main.ts VIDEO_URL \
  --chapters --speakers \
  --languages en,zh \
  --output-dir ~/no-more-fomo/.cache/pods

Fallback chain (if youtube-transcript fails or is not installed):

  1. yt-dlp --write-auto-sub --sub-lang en --skip-download — auto-generated subtitles
  2. curl -s "https://r.jina.ai/POST_URL" — Substack transcript (Latent Space, Dwarkesh)
  3. Keep basic episode entry (title + description only)

Substack-based podcasts (Latent Space, Dwarkesh) embed full transcripts in posts and can be fetched directly via Jina Reader as a fallback.

arxiv Papers (Topic-filtered)

Default topics (customizable via config):

Topicarxiv QueryCategories
AI Agentsabs:"AI agent" OR abs:"LLM agent"cs.AI, cs.CL
Large Language Modelsabs:"large language model" OR abs:LLMcs.CL, cs.AI

arxiv API — fetch papers from last 24h matching user topics:

curl -s "https://export.arxiv.org/api/query?search_query=cat:cs.AI+AND+abs:AI+agent&sortBy=submittedDate&sortOrder=descending&max_results=10"

HuggingFace Daily Papers — community-upvoted trending papers (no topic filter, but quality signal):

curl -s "https://huggingface.co/api/daily_papers?limit=20"

Filter: upvotes >= 3 (configurable via min_hf_upvotes).

Merge logic: Deduplicate by arxiv ID across both sources. If a paper appears in both arxiv topic search AND HF daily, mark it as high-signal.

HackerNews

Two parallel searches via HN Algolia API, filtered to last 24h:

  1. ai agent — agent-specific stories
  2. LLM OR GPT OR Claude OR Gemini — broader AI coverage

User Config (Optional)

Users can customize sources by creating ~/.no-more-fomo/config.yaml. The skill merges this with defaults — users only specify what they want to change.

Before fetching, always check if config exists:

cat ~/.no-more-fomo/config.yaml 2>/dev/null

Config format:

# ~/.no-more-fomo/config.yaml

twitter:
  add:                          # Extra accounts to follow
    - handle: "@elonmusk"
      count: 15
    - handle: "@sama"
      count: 15
  remove:                       # Accounts to skip from defaults
    - "@ylecun"
    - "@hardmaru"

papers:
  topics:                       # arxiv topic searches (default: ai agent + llm)
    - query: "AI agent"
      categories: ["cs.AI", "cs.CL"]
    - query: "large language model"
      categories: ["cs.CL", "cs.AI"]
    # Add your own:
    # - query: "world model"
    #   categories: ["cs.AI", "cs.CV"]
    # - query: "diffusion transformer"
    #   categories: ["cs.CV"]
  hf_daily: true                # Also pull HuggingFace trending papers
  min_hf_upvotes: 3             # Quality threshold for HF papers

podcasts:
  add:
    - name: "Lex Fridman"
      rss: "https://lexfridman.com/feed/podcast/"
      transcript: youtube       # youtube | substack | none
    - name: "80000 Hours"
      rss: "https://feeds.feedburner.com/80000HoursPodcast"
      transcript: none
  remove:
    - "Training Data"           # Match by podcast name
  depth: full                   # full | none (default: full)
                                #   full = TLDR + chapters + speaker quotes
                                #   none = title + description only (skip Phase 2 podcasts)
  max_episodes: 3               # Max episodes per podcast to deep-process (default: 3)
  cache_dir: ~/no-more-fomo/.cache/pods  # Transcript cache directory

blogs:
  add:
    - name: "Meta AI"
      url: "https://ai.meta.com/blog/"
  remove: []

hn:
  extra_queries:                # Additional HN search terms
    - "robotics"
    - "computer vision"

discovery:
  enabled: true                 # Enable s.jina.ai discovery layer (default: true)
  max_per_topic: 3              # Max discoveries per topic (default: 3)

topic_search:
  enabled: true                 # Enable xreach search supplementation (default: true)
  min_mentions: 2               # Entity must be mentioned N+ times to trigger search (default: 2)
  max_topics: 5                 # Max topics to search (default: 5)

language: zh                    # zh | en — output language (default: zh)

Merge rules:

  • add items are appended to defaults
  • remove items are excluded from defaults (match by handle or name)
  • If no config file exists, use all defaults as-is
  • Unspecified sections keep their defaults

Process

1. Fetch All Sources (PARALLEL)

Launch ALL fetches in parallel. Use separate Bash tool calls. First read ~/.no-more-fomo/config.yaml if it exists, then merge with defaults to determine the final source list.

CRITICAL — Filter at fetch time to minimize context usage. Pipe xreach output through jq to keep only relevant tweets. This reduces ~30KB/account to ~2KB/account.

xreach JSON structure (IMPORTANT — verified):

  • Top-level keys: items, cursor, hasMore (NOT data.items)
  • Each item: {id, text, createdAt, likeCount, retweetCount, isQuote, isRetweet, isReply, user, media, ...}
  • NO entities.urls field — URLs appear as t.co links within text
  • id — tweet ID string, used to construct tweet URL: https://x.com/HANDLE/status/ID
  • createdAt — format: "Tue Mar 24 16:56:24 +0000 2026"
# Template for each account — extracts id for tweet links, filters to last 24h:
CUTOFF=$(date -u -v-24H +"%Y-%m-%dT%H:%M:%S" 2>/dev/null || date -u -d "24 hours ago" +"%Y-%m-%dT%H:%M:%S")
xreach tweets @HANDLE --json -n N | jq --arg cutoff "$CUTOFF" '[.items[] | select(.isRetweet==false or .isQuote==true) | select(.createdAt | strptime("%a %b %d %H:%M:%S %z %Y") | strftime("%Y-%m-%dT%H:%M:%S") > $cutoff) | {id,text: .text[:300],createdAt,likeCount,retweetCount,isQuote}]'

Constructing tweet links: For every tweet used in the digest, construct the link as [tweet](https://x.com/HANDLE/status/ID). This is the primary reference link for Twitter-sourced items.

Twitter — Tier 1 (always, batch accounts to reduce tool calls):

# Set 24h cutoff ONCE before all batches (macOS + Linux compatible)
CUTOFF=$(date -u -v-24H +"%Y-%m-%dT%H:%M:%S" 2>/dev/null || date -u -d "24 hours ago" +"%Y-%m-%dT%H:%M:%S")
# Batch 1: High volume
xreach tweets @_akhaliq --json -n 50 | jq --arg cutoff "$CUTOFF" '[.items[] | select(.isRetweet==false or .isQuote==true) | select(.createdAt | strptime("%a %b %d %H:%M:%S %z %Y") | strftime("%Y-%m-%dT%H:%M:%S") > $cutoff) | {id,text: .text[:300],createdAt,likeCount,retweetCount,isQuote}]'
xreach tweets @dotey --json -n 30 | jq --arg cutoff "$CUTOFF" '[.items[] | select(.isRetweet==false or .isQuote==true) | select(.createdAt | strptime("%a %b %d %H:%M:%S %z %Y") | strftime("%Y-%m-%dT%H:%M:%S") > $cutoff) | {id,text: .text[:300],createdAt,likeCount,retweetCount,isQuote}]'
# Batch 2: KOLs
for h in karpathy bcherny oran_ge trq212 swyx emollick; do echo "---$h---"; xreach tweets @$h --json -n 20 | jq -c --arg cutoff "$CUTOFF" "[.items[] | select(.isRetweet==false or .isQuote==true) | select(.createdAt | strptime(\"%a %b %d %H:%M:%S %z %Y\") | strftime(\"%Y-%m-%dT%H:%M:%S\") > \$cutoff) | {id,text: .text[:300],createdAt,likeCount,isQuote}]"; done
# Batch 3: More KOLs
for h in drjimfan simonw hardmaru ylecun; do echo "---$h---"; xreach tweets @$h --json -n 20 | jq -c --arg cutoff "$CUTOFF" "[.items[] | select(.isRetweet==false or .isQuote==true) | select(.createdAt | strptime(\"%a %b %d %H:%M:%S %z %Y\") | strftime(\"%Y-%m-%dT%H:%M:%S\") > \$cutoff) | {id,text: .text[:300],createdAt,likeCount,isQuote}]"; done
# Batch 4: Company accounts (may hit rate limits — retry after 10s if needed)
for h in cursor_ai AnthropicAI OpenAI GoogleDeepMind; do echo "---$h---"; xreach tweets @$h --json -n 15 | jq -c --arg cutoff "$CUTOFF" "[.items[] | select(.isRetweet==false or .isQuote==true) | select(.createdAt | strptime(\"%a %b %d %H:%M:%S %z %Y\") | strftime(\"%Y-%m-%dT%H:%M:%S\") > \$cutoff) | {id,text: .text[:300],createdAt,likeCount,isQuote}]"; done

Twitter — Tier 2 (only with --full flag):

for h in xai WindsurfAI cognition replit huggingface llama_index; do echo "---$h---"; xreach tweets @$h --json -n 15 | jq -c --arg cutoff "$CUTOFF" "[.items[] | select(.isRetweet==false or .isQuote==true) | select(.createdAt | strptime(\"%a %b %d %H:%M:%S %z %Y\") | strftime(\"%Y-%m-%dT%H:%M:%S\") > \$cutoff) | {id,text: .text[:300],createdAt,likeCount,isQuote}]"; done
# + any extra @handles from arguments, same jq filter

Rate limiting: xreach may return "Rate limit exceeded" instead of JSON after ~15 accounts in quick succession. If this happens, wait 10 seconds and retry. Company accounts (Tier 1 Batch 4) are most likely to be affected.

AI Lab Blogs (one call per source):

curl -s "https://r.jina.ai/https://deepmind.google/blog/rss.xml"
curl -s "https://r.jina.ai/https://www.anthropic.com/news"
curl -s "https://r.jina.ai/https://openai.com/blog/rss.xml"

Podcasts (one call per feed):

curl -s "https://r.jina.ai/https://rss.art19.com/no-priors-ai"
curl -s "https://r.jina.ai/https://api.substack.com/feed/podcast/1084089.rss"
curl -s "https://r.jina.ai/https://apple.dwarkesh-podcast.workers.dev/feed.rss"
curl -s "https://r.jina.ai/https://feeds.megaphone.fm/trainingdata"

arxiv Papers (one call per topic from config, default: ai agent + llm):

# For each topic, build query from categories + keywords
curl -s "https://export.arxiv.org/api/query?search_query=(cat:cs.AI+OR+cat:cs.CL)+AND+abs:%22AI+agent%22&sortBy=submittedDate&sortOrder=descending&max_results=10"
curl -s "https://export.arxiv.org/api/query?search_query=(cat:cs.CL+OR+cat:cs.AI)+AND+abs:%22large+language+model%22&sortBy=submittedDate&sortOrder=descending&max_results=10"

HuggingFace Daily Papers:

curl -s "https://huggingface.co/api/daily_papers?limit=20"

Filter to upvotes >= 3 (or min_hf_upvotes from config). Extract: title, arxiv ID, upvotes.

HackerNews:

YESTERDAY=$(python3 -c "import time; print(int(time.time()) - 86400)")
curl -s "https://hn.algolia.com/api/v1/search?query=ai+agent&tags=story&numericFilters=created_at_i%3E$YESTERDAY&hitsPerPage=20"
YESTERDAY=$(python3 -c "import time; print(int(time.time()) - 86400)")
curl -s "https://hn.algolia.com/api/v1/search?query=LLM+OR+GPT+OR+Claude+OR+Gemini&tags=story&numericFilters=created_at_i%3E$YESTERDAY&hitsPerPage=15"

2. Parse & Extract

xreach JSON structure is documented above in Step 1. Key reminders:

  • Items are at .items[] (NOT .data.items[])
  • There is NO entities.urls field — URLs are t.co links inside text
  • Use id field to construct tweet links: https://x.com/HANDLE/status/ID

URL extraction from tweet text: Tweets contain t.co shortened URLs. To get real URLs:

  1. Regex extract https://t.co/\w+ from text
  2. Resolve via curl -sI URL | grep -i location
  3. Or: if the tweet mentions a known paper/repo, search for the URL directly

Every digest item MUST have at least one clickable link. For Twitter-sourced items without embedded URLs, use the tweet link [tweet](https://x.com/HANDLE/status/ID) as the minimum reference.

3. Filter

Twitter:

  • Filter to last 24h
  • Include original tweets and quote tweets with commentary
  • Exclude pure retweets (isRetweet: true without isQuote: true) and reply threads
  • Quality: likeCount > 100 for @_akhaliq, > 50 for others (lower on weekends)
  • Dedup vs previous day: If ~/no-more-fomo/YYYY-MM-(DD-1).md exists, scan it for titles. Skip any item whose title/name already appeared in the previous digest.

Blogs: Only posts from last 7 days. Skip non-technical posts (hiring, events).

Podcasts: Only episodes from last 7 days. Extract: title, date, description (200 chars), link.

HN: points > 20. Deduplicate against Twitter (same URL = merge, note both sources).

4. Enrich (IMPORTANT — this is what makes the digest useful)

After filtering, collect all unique URLs from tweets, blogs, and HN. Then enrich in parallel:

arxiv papers — fetch abstract:

curl -s "https://r.jina.ai/https://arxiv.org/abs/PAPER_ID" | head -80

Extract: title, authors (first 3), abstract (first 2 sentences). This is the primary value of the digest — users need to know what the paper actually does, not just its title.

GitHub repos — fetch description:

curl -s "https://api.github.com/repos/OWNER/REPO" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('description',''), '|', d.get('stargazers_count',0), 'stars')"

HuggingFace models — fetch model card summary:

curl -s "https://r.jina.ai/https://huggingface.co/MODEL_ID" | head -40

Blog posts (from Lab Updates) — already fetched in Step 1, extract first paragraph as summary.

Podcast transcripts — basic metadata extracted in Phase 1 (title, date, description, link). Full transcript processing (TLDR, chapters, speaker quotes) happens in Phase 2 below. Phase 1 writes a placeholder: > ⏳ 深度摘要生成中...

Parallelism: Launch all enrichment fetches in parallel. Typically 5-15 URLs to enrich.

What "enriched" looks like:

Before (bad)After (good)
`FASTER — paper@_akhaliq
**Nemotron-Cascade 2** — Nvidia 发布`Nemotron-Cascade 2 — Nvidia 的级联推理模型,小模型处理简单 query、大模型处理复杂 query,推理成本降低 3x
`OpenCode — 开源 AI coding agentHN 673 pts`

5. Categorize

Section titles follow language config. The table below shows both versions:

Section (zh)Section (en)Content
模型与发布Models & ReleasesNew models, checkpoints, fine-tunes, API launches
工具与演示Tools & DemosLibraries, frameworks, demos, open-source tools
AI AgentsAI AgentsAgent frameworks, benchmarks, real-world agent stories
实验室动态Lab UpdatesDeepMind / Anthropic / OpenAI blog highlights
播客PodcastsNew episodes from tracked shows (last 7 days)
HN 讨论HN ThreadsTop HN discussions on AI/agents (with comment count)
行业动态IndustryCompany announcements, funding, policy, safety
HF 热门论文HF Trending PapersHuggingFace community-upvoted papers (bottom, Part 1)
arxiv: [主题]arxiv: [Topic]Per-topic arxiv search results (bottom, Part 2)
发现DiscoveryPhase 2: s.jina.ai web search results (bottom, Part 3)

6. Format & Output

The template below uses zh section titles (default). When language: en, use the English equivalents from the Categorize table above.

# No More FOMO Digest — YYYY-MM-DD

## 今日要点
1. **[Title]** — [1 sentence summary] | [link](URL)
2. **[Title]** — [1 sentence summary] | [link](URL)
3. **[Title]** — [1 sentence summary] | [link](URL)

## 模型与发布
- **[Name]** — [what it is, key capability, how it compares to previous] | [HF](URL) [paper](URL) | @source | Likes: N

## 工具与演示
- **[Name]** — [what it does, why it matters, key differentiator] (N stars) | [github](URL) | @source | Likes: N

## AI Agents
- **[Title]** — [what it does, architecture insight if available, why notable] | [link](URL) | @source | Likes: N

## 实验室动态
- **[DeepMind]** [Title] — [1-paragraph summary of the blog post] | [link](URL)
- **[Anthropic]** [Title] — [1-paragraph summary] | [link](URL)
- **[OpenAI]** [Title] — [1-paragraph summary] | [link](URL)

## 播客 (Last 7 Days)
- **[Show Name]** [Episode Title] — [guest name & role] | [link](URL)
  > ⏳ 深度摘要生成中...

## HN 讨论
- **[Title]** — [points] pts, [comments] comments | [url](URL) | [HN](URL)
  > [1-2 sentences: what it is + why HN cares]

## 行业动态
- **[Topic]** — [what happened, who's involved, why it matters] | @source | Likes: N

---

## HF 热门论文
Community-upvoted papers from [HuggingFace Daily Papers](https://huggingface.co/papers). Sorted by upvotes, no topic filter — shows what the broader ML community finds interesting today.

- **[Title]** (N upvotes) — [1-2 sentence summary] | [arxiv](URL) [HF](https://huggingface.co/papers/ID)

## arxiv: AI Agents
Recent papers matching `"AI agent" OR "LLM agent"` in cs.AI, cs.CL. Customize topics in `~/.no-more-fomo/config.yaml`.

- **[Title]** — [2-3 sentence summary from abstract] | [arxiv](URL) | categories

## arxiv: Large Language Models
Recent papers matching `"large language model"` in cs.CL, cs.AI.

- **[Title]** — [2-3 sentence summary from abstract] | [arxiv](URL) | categories

## 发现 (Beyond arxiv/HN)
来自全网搜索的技术内容,未被 KOL 推文或 HN 覆盖。

- **[类型]** [Title] — [summary in configured language] | [link](URL)

---
Sources: Tier1-KOLs(N) [Tier2-Companies(N)] Labs(N) Podcasts(N/深度N) HN(N) HF-Trending(N) arxiv(N) 社区补充(N) 发现(N)
Total: N items

Save to ~/no-more-fomo/YYYY-MM-DD.md (create directory if needed).

6.5. Save Phase 1 Digest & Extract Hot Topics

Save the digest file immediately: ~/no-more-fomo/YYYY-MM-DD.md

Before proceeding to Phase 2, scan all digest entries and extract high-frequency entities:

  • Paper names mentioned by 2+ different sources
  • Model names mentioned by 2+ KOLs
  • Tool/repo names discussed in both Twitter and HN
  • Collect 3-5 hot topics (pass to Phase 2 Topic Search)

Podcast entries at this point have the placeholder ⏳ 深度摘要生成中... — these will be filled in Phase 2.

7. Relevance Check

If user has CLAUDE.md or memory files with project keywords, tag matching items with [RELEVANT].

8. Summary to User

Print concise summary:

  • Top 3 highlights with links
  • Count per section
  • New podcast episodes (always mention)
  • Any [RELEVANT] items called out

Phase 2: Deep Layer (same session, after Phase 1)

Phase 2 runs in the same Claude Code session immediately after Phase 1 saves the digest. Skip Phase 2 entirely if --quick flag is set.

Phase 2 Step A: Parallel Network Requests

Launch ALL of the following as parallel Bash tool calls:

Podcast transcripts (if podcasts.depth is full, which is the default): For each new episode found in Phase 1 (up to max_episodes per podcast, default 3): For each episode, check cache first: if ~/no-more-fomo/.cache/pods/{channel}/{episode}/summary.md exists, skip download. Otherwise:

bun ~/.claude/plugins/ljg-skills/.agents/skills/baoyu-youtube-transcript/scripts/main.ts VIDEO_URL \
  --chapters --speakers --languages en,zh \
  --output-dir ~/no-more-fomo/.cache/pods

Topic Search (if topic_search.enabled, default true): For each hot topic extracted in step 6.5 (max 5):

xreach search "TOPIC_NAME" --type top -n 15 --json

Discovery (if discovery.enabled, default true): For each topic in papers.topics config (max 3):

curl -s "https://s.jina.ai/latest%20TOPIC%20research%202026"

Phase 2 Step B: AI Processing (Serial)

Podcast structured summaries — for each episode with downloaded transcript:

  1. Read the generated .md file from ~/no-more-fomo/.cache/pods/{channel}/{title}/transcript.md
  2. If --speakers was used, reference the speaker identification prompt at: ~/.claude/plugins/ljg-skills/.agents/skills/baoyu-youtube-transcript/prompts/speaker-transcript.md
  3. Identify speakers (host vs guest) from video metadata (title, channel, description)
  4. Generate structured summary in the configured language (default zh):
**TLDR:** [3 sentences: core thesis, most surprising insight, practical takeaway]

**章节:**
- *[Chapter Title]* — [1-2 sentence summary of this chapter]
- *[Chapter Title]* — [1-2 sentence summary]

**关键引用:**
> **[Speaker Name]:** "[Translated quote]" [HH:MM:SS]
> **[Speaker Name]:** "[Translated quote]" [HH:MM:SS]
  1. Cache the summary to ~/no-more-fomo/.cache/pods/{channel}/{title}/summary.md

Speaker names stay in original form (English). Technical terms stay in original form. Select 2-3 quotes that are most insightful or surprising.

Topic Search analysis — for each xreach search result set:

  • Filter: likeCount > 200, exclude tweets from KOLs already in the digest (deduplicate by handle)
  • If >80% overlap with existing KOL tweets, skip this topic
  • Extract 2-3 external perspectives (disagreements, supplementary info, user feedback)
  • Format as a > 社区热议: blockquote appended to the matching digest entry

Discovery filtering — for each s.jina.ai result set:

  • Deduplicate: remove any URL already in the digest
  • Filter: only keep technical content (papers, blog posts, conference pages — not news aggregators or SEO)
  • Keep max 3 per topic, format as:
- **[类型]** [Title] — [1-2 sentence summary in configured language] | [link](URL)

Where 类型 is one of: 博客, 会议, 报告, 教程

Phase 2 Step C: Update Digest File

Read ~/no-more-fomo/YYYY-MM-DD.md and apply updates:

  1. Podcasts: Find each ⏳ 深度摘要生成中... placeholder → replace with the structured summary (TLDR + chapters + quotes). If transcript failed, replace placeholder with basic description from RSS.

  2. Topic Search: Find matching entries by title → append > 社区热议: blockquote after the entry.

  3. Discovery: Find the --- line immediately above the Sources: line → insert before it:

## 发现 (Beyond arxiv/HN)
来自全网搜索的技术内容,未被 KOL 推文或 HN 覆盖。

[discovery entries here]

Only add this section if there are discovery results. If empty, skip.

  1. Update Sources line to include Phase 2 counts:
Sources: Tier1-KOLs(N) [Tier2-Companies(N)] Labs(N) Podcasts(N/深度N) HN(N) HF-Trending(N) arxiv(N) 社区补充(N) 发现(N)

社区补充 and 发现 only appear if Phase 2 produced results for them.

Phase 2 Step D: Generate HTML

Skip this step if --no-save or --no-html flag is set.

Run the render script (uses bun, <1 second):

bun /path/to/no-more-fomo/scripts/render.js ~/no-more-fomo/YYYY-MM-DD.md

This automatically:

  1. Reads template/digest.html and the .md file
  2. Parses markdown sections → HTML fragments (with escaping, badges, links)
  3. Replaces {{PLACEHOLDER}} markers → writes YYYY-MM-DD.html
  4. Scans all .html files → regenerates index.html with date cards

HTML features:

  • Three view layouts: newspaper (default), sidebar, grid — CSS-only toggle
  • Light/dark theme with system preference detection
  • 中/EN button navigates between YYYY-MM-DD.htmlYYYY-MM-DD-zh.html (page redirect, not just UI label swap)
  • ← 归档 back link to index.html
  • render.js supports both English AND Chinese section headings (Top Highlights/今日要点, Sources:/来源:, Total:/总计: etc.)

For --quick mode: Run this step at the end of Phase 1. The render script works with whatever content is in the .md file at that point.

Phase 2 Step E: Generate Chinese Translation

Skip this step if --no-save flag is set or if the digest is already in Chinese (language: zh).

After the English digest is saved, translate it to Chinese:

  1. Read ~/no-more-fomo/YYYY-MM-DD.md (English version, already in memory)
  2. Translate all content to Chinese:
    • Section titles → use the zh titles from Categorize table
    • Item descriptions and summaries → translate to Chinese
    • Speaker names, model names, tool names, arxiv IDs → keep original
    • Links → keep as-is
    • Engagement metrics (likes, points) → keep as-is
  3. Write to ~/no-more-fomo/YYYY-MM-DD-zh.md
  4. Run render script for the Chinese version:
bun /path/to/no-more-fomo/scripts/render.js ~/no-more-fomo/YYYY-MM-DD-zh.md

Default behavior: Always generate both English and Chinese versions. The English version is the primary (generated first), the Chinese version is a translation pass.

Skip translation with --en-only flag.

Arguments

ArgumentEffect
(none)Phase 1 (all default sources) + Phase 2 (deep processing)
--fullAlso fetch Tier 2 company/product accounts
--quickPhase 1 only — skip Phase 2 deep processing
--transcripts(deprecated) Phase 2 does this by default now
@handleAdd extra Twitter accounts (repeatable)
--twitter-onlySkip blogs, podcasts, and HN. Topic Search + Discovery still run.
--hn-onlySkip Twitter, blogs, and podcasts. Topic Search + Discovery still run.
--podcasts-onlyOnly podcast feeds + Phase 2 podcast deep processing
--no-savePrint results, don't save to file
--no-htmlOnly generate .md, skip HTML output
--en-onlySkip Chinese translation (only English digest)
--query "term"Add custom HN search query

Flag combinations:

ComboBehavior
--quickPhase 1 only
--quick --fullPhase 1 + Tier 2, no Phase 2
--twitter-only / --hn-onlySkip podcasts in Phase 2 (no podcast data), but Topic Search + Discovery still run
--podcasts-onlyRSS + Phase 2 deep summaries
--podcasts-only --quickRSS only, no deep summaries
--twitter-only --quickPhase 1 Twitter only
--no-html.md only, no HTML generation
--quick --no-htmlPhase 1 .md only, no Phase 2, no HTML

Common Mistakes

MistakeFix
Including all retweetsOnly quote tweets with commentary
Sequential fetchingALL fetches must be parallel
Using .data.items[] for xreachCorrect path is .items[] — there is no .data wrapper
Using .entities.urls for xreachThis field does not exist. Construct tweet links from .id: https://x.com/HANDLE/status/ID
Items without reference linksEvery item MUST have at least one clickable [link](URL) — arxiv, github, blog, HF, HN, or tweet link. Items with only @handle and no URL are NOT acceptable. For Twitter-only items, [tweet](https://x.com/HANDLE/status/ID) is the minimum.
Highlights without links**每条今日要点 MUST end with `
Chinese digest missing highlightsrender.js matches both Top Highlights and 今日要点. Also matches Sources:/来源: and Total:/总计: for footer.
Ignoring dedupSame URL from Twitter + HN = one entry
Stale blog/podcast postsBlogs: 7 days, Podcasts: 7 days
Empty section hiddenShow "No new episodes this week"
xreach rate limitingCompany accounts often hit rate limits. Retry after 10s. Don't batch all 16 accounts in parallel — use 4 batches of 4.
Repeating yesterday's headlinesBefore generating the digest, read the previous day's .md file (if it exists) and exclude any item that already appeared. The jq time filter catches most cases, but always cross-check highlights.

Scheduling

Claude Code Cloud (recommended)

Go to preview.claude.ai/codeScheduled+ New scheduled task:

FieldValue
Nameno-more-fomo
Promptrun /no-more-fomo and save the digest
FrequencyDaily
Time09:00 AM

Runs on cloud infra — no local machine needed.

Local fallback (crontab)

# Add to crontab
0 9 * * * claude -p "run /no-more-fomo and save the digest" --allowedTools "Bash,Read,Write,Glob" --output-format stream-json >> /tmp/no-more-fomo.log 2>&1

Fallback

  • xreach fails: curl -s "https://r.jina.ai/https://twitter.com/HANDLE"
  • HN API fails: curl -s "https://r.jina.ai/https://news.ycombinator.com"
  • Podcast RSS fails: curl -s "https://r.jina.ai/PODCAST_WEBSITE"