Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions .github/workflows/generate-feed.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
name: Generate Feeds

on:
push:
paths:
- "config/default-sources.json"
schedule:
# All feeds (tweets, podcasts, blogs): once daily at 6:17am UTC
- cron: '17 6 * * *'
# All feeds: 07:17 Asia/Shanghai (23:17 UTC on the previous day).
- cron: '17 23 * * *'
workflow_dispatch:
inputs:
mode:
Expand Down
30 changes: 26 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ A daily or weekly digest delivered to your preferred messaging app (Telegram, Di
WhatsApp, etc.) with:

- Summaries of new podcast episodes from top AI podcasts
- Key posts and insights from 26 curated AI builders on X/Twitter
- Key posts and insights from 36 curated AI builders on X/Twitter
- Full articles from official AI company blogs (Anthropic Engineering, Claude Blog)
- Links to all original content
- Available in English, Chinese, or bilingual
Expand Down Expand Up @@ -61,8 +61,18 @@ Edit the files in the `prompts/` folder:
- `summarize-tweets.md` — how X/Twitter posts are summarized
- `summarize-blogs.md` — how blog posts are summarized
- `digest-intro.md` — the overall digest format and tone
- `digest-intro-expanded.md` — expanded digest rules that retain medium-density items
- `translate.md` — how English content is translated to Chinese

To generate the expanded edition explicitly:

```bash
node scripts/prepare-digest.js --expanded
node scripts/deliver.js --file /tmp/fb-digest-expanded.md --expanded
```

The expanded edition is exported as `data/YYYY-MM-DD/digest-expanded.md` by default.

These are plain English instructions, not code. Changes take effect on the next digest.

## Default Sources
Expand All @@ -75,8 +85,8 @@ These are plain English instructions, not code. Changes take effect on the next
- [The MAD Podcast with Matt Turck](https://www.youtube.com/@DataDrivenNYC)
- [AI & I by Every](https://www.youtube.com/playlist?list=PLuMcoKK9mKgHtW_o9h5sGO2vXrffKHwJL)

### AI Builders on X (26)
[Andrej Karpathy](https://x.com/karpathy), [Swyx](https://x.com/swyx), [Josh Woodward](https://x.com/joshwoodward), [Boris Cherny](https://x.com/bcherny), [Thibault Sottiaux](https://x.com/thsottiaux), [Peter Yang](https://x.com/petergyang), [Nan Yu](https://x.com/thenanyu), [Madhu Guru](https://x.com/realmadhuguru), [Amanda Askell](https://x.com/AmandaAskell), [Cat Wu](https://x.com/_catwu), [Thariq](https://x.com/trq212), [Google Labs](https://x.com/GoogleLabs), [Amjad Masad](https://x.com/amasad), [Guillermo Rauch](https://x.com/rauchg), [Alex Albert](https://x.com/alexalbert__), [Aaron Levie](https://x.com/levie), [Ryo Lu](https://x.com/ryolu_), [Garry Tan](https://x.com/garrytan), [Matt Turck](https://x.com/mattturck), [Zara Zhang](https://x.com/zarazhangrui), [Nikunj Kothari](https://x.com/nikunj), [Peter Steinberger](https://x.com/steipete), [Dan Shipper](https://x.com/danshipper), [Aditya Agarwal](https://x.com/adityaag), [Sam Altman](https://x.com/sama), [Claude](https://x.com/claudeai)
### AI Builders on X (36)
[Andrej Karpathy](https://x.com/karpathy), [Swyx](https://x.com/swyx), [Josh Woodward](https://x.com/joshwoodward), [Boris Cherny](https://x.com/bcherny), [Thibault Sottiaux](https://x.com/thsottiaux), [Kevin Weil](https://x.com/kevinweil), [OpenAI Developers](https://x.com/OpenAIDevs), [Anthropic](https://x.com/AnthropicAI), [Peter Yang](https://x.com/petergyang), [Nan Yu](https://x.com/thenanyu), [Madhu Guru](https://x.com/realmadhuguru), [Amanda Askell](https://x.com/AmandaAskell), [Cat Wu](https://x.com/_catwu), [Thariq](https://x.com/trq212), [Google Labs](https://x.com/GoogleLabs), [Amjad Masad](https://x.com/amasad), [Guillermo Rauch](https://x.com/rauchg), [Alex Albert](https://x.com/alexalbert__), [Aaron Levie](https://x.com/levie), [Ryo Lu](https://x.com/ryolu_), [Garry Tan](https://x.com/garrytan), [Matt Turck](https://x.com/mattturck), [Zara Zhang](https://x.com/zarazhangrui), [Nikunj Kothari](https://x.com/nikunj), [Peter Steinberger](https://x.com/steipete), [Dan Shipper](https://x.com/danshipper), [Aditya Agarwal](https://x.com/adityaag), [Sam Altman](https://x.com/sama), [Claude](https://x.com/claudeai), [Matt Van Horn](https://x.com/mvanhorn), [Simon Willison](https://x.com/simonw), [Harrison Chase](https://x.com/hwchase17), [Cognition](https://x.com/cognition_labs), [Cursor](https://x.com/cursor_ai), [LangChain](https://x.com/LangChainAI), [LlamaIndex](https://x.com/llama_index)

### Official Blogs (2)
- [Anthropic Engineering](https://www.anthropic.com/engineering) — technical deep-dives from the Anthropic team
Expand Down Expand Up @@ -114,7 +124,19 @@ is fetched centrally and updated daily.
(blog articles via web scraping, YouTube transcripts via Supadata, X/Twitter via official API)
2. Your agent fetches the feed — one HTTP request, no API keys
3. Your agent remixes the raw content into a digestible summary using your preferences
4. The digest is delivered to your messaging app (or shown in-chat)
4. The digest is saved as Markdown and delivered to your messaging app (or shown in-chat)

Each delivered digest is exported by default to:

```text
data/YYYY-MM-DD/digest.md
```

Power users can override the export destination when calling the delivery script:

```bash
node scripts/deliver.js --file /tmp/fb-digest.md --output data/2026-05-12
```

See [examples/sample-digest.md](examples/sample-digest.md) for what the output looks like.

Expand Down
30 changes: 26 additions & 4 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
每日或每周推送到你常用的通讯工具(Telegram、Discord、WhatsApp 等),包含:

- 顶级 AI 播客新节目的精华摘要
- 26 位精选 AI 建造者在 X/Twitter 上的关键观点和洞察
- 36 位精选 AI 建造者在 X/Twitter 上的关键观点和洞察
- AI 公司官方博客的完整文章(Anthropic Engineering、Claude Blog)
- 所有原始内容的链接
- 支持英文、中文或双语版本
Expand Down Expand Up @@ -54,8 +54,18 @@ Skill 使用纯文本 prompt 文件来控制内容的摘要方式。你可以通
- `summarize-tweets.md` — X/Twitter 帖子的摘要方式
- `summarize-blogs.md` — 博客文章的摘要方式
- `digest-intro.md` — 整体摘要的格式和语气
- `digest-intro-expanded.md` — 扩展版摘要规则,保留更多中等信息密度动态
- `translate.md` — 英文内容翻译为中文的方式

显式生成扩展版:

```bash
node scripts/prepare-digest.js --expanded
node scripts/deliver.js --file /tmp/fb-digest-expanded.md --expanded
```

扩展版默认保存为 `data/YYYY-MM-DD/digest-expanded.md`。

这些都是纯文本指令,不是代码。修改后下次推送即生效。

## 默认信息源
Expand All @@ -68,8 +78,8 @@ Skill 使用纯文本 prompt 文件来控制内容的摘要方式。你可以通
- [The MAD Podcast with Matt Turck](https://www.youtube.com/@DataDrivenNYC)
- [AI & I by Every](https://www.youtube.com/playlist?list=PLuMcoKK9mKgHtW_o9h5sGO2vXrffKHwJL)

### X 上的 AI 建造者(26位
[Andrej Karpathy](https://x.com/karpathy), [Swyx](https://x.com/swyx), [Josh Woodward](https://x.com/joshwoodward), [Boris Cherny](https://x.com/bcherny), [Thibault Sottiaux](https://x.com/thsottiaux), [Peter Yang](https://x.com/petergyang), [Nan Yu](https://x.com/thenanyu), [Madhu Guru](https://x.com/realmadhuguru), [Amanda Askell](https://x.com/AmandaAskell), [Cat Wu](https://x.com/_catwu), [Thariq](https://x.com/trq212), [Google Labs](https://x.com/GoogleLabs), [Amjad Masad](https://x.com/amasad), [Guillermo Rauch](https://x.com/rauchg), [Alex Albert](https://x.com/alexalbert__), [Aaron Levie](https://x.com/levie), [Ryo Lu](https://x.com/ryolu_), [Garry Tan](https://x.com/garrytan), [Matt Turck](https://x.com/mattturck), [Zara Zhang](https://x.com/zarazhangrui), [Nikunj Kothari](https://x.com/nikunj), [Peter Steinberger](https://x.com/steipete), [Dan Shipper](https://x.com/danshipper), [Aditya Agarwal](https://x.com/adityaag), [Sam Altman](https://x.com/sama), [Claude](https://x.com/claudeai)
### X 上的 AI 建造者(36位
[Andrej Karpathy](https://x.com/karpathy), [Swyx](https://x.com/swyx), [Josh Woodward](https://x.com/joshwoodward), [Boris Cherny](https://x.com/bcherny), [Thibault Sottiaux](https://x.com/thsottiaux), [Kevin Weil](https://x.com/kevinweil), [OpenAI Developers](https://x.com/OpenAIDevs), [Anthropic](https://x.com/AnthropicAI), [Peter Yang](https://x.com/petergyang), [Nan Yu](https://x.com/thenanyu), [Madhu Guru](https://x.com/realmadhuguru), [Amanda Askell](https://x.com/AmandaAskell), [Cat Wu](https://x.com/_catwu), [Thariq](https://x.com/trq212), [Google Labs](https://x.com/GoogleLabs), [Amjad Masad](https://x.com/amasad), [Guillermo Rauch](https://x.com/rauchg), [Alex Albert](https://x.com/alexalbert__), [Aaron Levie](https://x.com/levie), [Ryo Lu](https://x.com/ryolu_), [Garry Tan](https://x.com/garrytan), [Matt Turck](https://x.com/mattturck), [Zara Zhang](https://x.com/zarazhangrui), [Nikunj Kothari](https://x.com/nikunj), [Peter Steinberger](https://x.com/steipete), [Dan Shipper](https://x.com/danshipper), [Aditya Agarwal](https://x.com/adityaag), [Sam Altman](https://x.com/sama), [Claude](https://x.com/claudeai), [Matt Van Horn](https://x.com/mvanhorn), [Simon Willison](https://x.com/simonw), [Harrison Chase](https://x.com/hwchase17), [Cognition](https://x.com/cognition_labs), [Cursor](https://x.com/cursor_ai), [LangChain](https://x.com/LangChainAI), [LlamaIndex](https://x.com/llama_index)

### 官方博客(2个)
- [Anthropic Engineering](https://www.anthropic.com/engineering) — Anthropic 团队的技术深度文章
Expand Down Expand Up @@ -105,7 +115,19 @@ cd ~/.claude/skills/follow-builders/scripts && npm install
1. 中心化 feed 每日更新,抓取所有信息源的最新内容(博客文章通过网页抓取,YouTube 字幕通过 Supadata,X/Twitter 通过官方 API)
2. 你的 agent 获取 feed——一次 HTTP 请求,不需要 API key
3. 你的 agent 根据你的偏好将原始内容重新混编为易消化的摘要
4. 摘要推送到你的通讯工具(或直接在聊天中显示)
4. 摘要保存为 Markdown,并推送到你的通讯工具(或直接在聊天中显示)

每次生成的摘要默认会导出到:

```text
data/YYYY-MM-DD/digest.md
```

高级用户也可以在调用投递脚本时指定导出位置:

```bash
node scripts/deliver.js --file /tmp/fb-digest.md --output data/2026-05-12
```

查看 [examples/sample-digest.md](examples/sample-digest.md) 了解输出示例。

Expand Down
54 changes: 47 additions & 7 deletions SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ Philosophy: follow builders with original opinions, not influencers who regurgit
(X/Twitter posts and YouTube transcripts) is fetched centrally and served via
a public feed. Users only need API keys if they choose Telegram or email delivery.

The central feed is generated from `config/default-sources.json`. GitHub Actions
refreshes it daily at 07:17 Asia/Shanghai and also refreshes it when the central
source registry changes.

## Detecting Platform

Before doing anything, detect which platform you're running on by running:
Expand Down Expand Up @@ -173,6 +177,7 @@ cat > ~/.follow-builders/config.json << 'CFGEOF'
"language": "<en, zh, or bilingual>",
"timezone": "<IANA timezone>",
"frequency": "<daily or weekly>",
"digestMode": "<standard or expanded>",
"deliveryTime": "<HH:MM>",
"weeklyDay": "<day of week, only if weekly>",
"delivery": {
Expand Down Expand Up @@ -321,6 +326,11 @@ You do NOT fetch anything yourself.
cd ${CLAUDE_SKILL_DIR}/scripts && node prepare-digest.js 2>/dev/null
```

Use `node prepare-digest.js --expanded` for the expanded edition, which keeps
more medium-density product, workflow, tool, and early-signal updates. The same
edition can be selected persistently with `"digestMode": "expanded"` in
`~/.follow-builders/config.json`; the default remains `standard`.

The script outputs a single JSON blob with everything you need:
- `config` — user's language and delivery preferences
- `podcasts` — podcast episodes with full transcripts
Expand Down Expand Up @@ -359,6 +369,10 @@ Read the prompts from the `prompts` field in the JSON:

Assemble the digest following `prompts.digest_intro`.

The prepare script has already selected `prompts.digest_intro` for the requested
edition. Follow `config.digestMode` and do not silently switch between standard
and expanded output.

**ABSOLUTE RULES:**
- NEVER invent or fabricate content. Only use what's in the JSON.
- Every piece of content MUST have its URL. No URL = do not include.
Expand Down Expand Up @@ -397,15 +411,31 @@ Read `config.language` from the JSON:

Read `config.delivery.method` from the JSON:

First write the final digest text to `/tmp/fb-digest.md`, then call
`deliver.js`. The delivery script always exports a Markdown copy before sending.
Default export path:

```text
data/YYYY-MM-DD/digest.md
```

Expanded output defaults to `data/YYYY-MM-DD/digest-expanded.md`.

Use `--output <path>` only when the user explicitly asks for a custom export
file or directory. If `<path>` has no file extension, treat it as a directory and
save `digest.md` inside it.

**If "telegram" or "email":**
```bash
echo '<your digest text>' > /tmp/fb-digest.txt
cd ${CLAUDE_SKILL_DIR}/scripts && node deliver.js --file /tmp/fb-digest.txt 2>/dev/null
cd ${CLAUDE_SKILL_DIR}/scripts && node deliver.js --file /tmp/fb-digest.md 2>/dev/null
```
If delivery fails, show the digest in the terminal as fallback.

**If "stdout" (default):**
Just output the digest directly.
```bash
cd ${CLAUDE_SKILL_DIR}/scripts && node deliver.js --file /tmp/fb-digest.md
```
Then show the digest text to the user and mention the saved Markdown path.

---

Expand All @@ -414,16 +444,26 @@ Just output the digest directly.
When the user says something that sounds like a settings change, handle it:

### Source Changes
The source list is managed centrally and cannot be modified by users.
If a user asks to add or remove sources, tell them: "The source list is curated
centrally and updates automatically. If you'd like to suggest a source, you can
open an issue at https://github.com/zarazhangrui/follow-builders."
The central source registry is `config/default-sources.json`. When maintaining
this repository, add or remove sources there, validate the JSON, and commit and
push that file. The GitHub Action then regenerates the central feed; editing only
`~/.follow-builders/config.json` or generated `feed-*.json` does not publish a
source change. For a suggestion without repository access, open an issue at
https://github.com/zarazhangrui/follow-builders.

The registry currently contains 36 X builders, 6 podcasts, and 4 official blogs.

### Schedule Changes
- "Switch to weekly/daily" → Update `frequency` in config.json
- "Change time to X" → Update `deliveryTime` in config.json
- "Change timezone to X" → Update `timezone` in config.json, also update the cron job

### Digest Edition Changes
- "Show the expanded digest" → Run `node prepare-digest.js --expanded` and pass
`--expanded` to `deliver.js` when exporting it
- "Use expanded digest by default" → Set `digestMode` to `expanded` in config.json
- "Use the concise digest" → Set `digestMode` to `standard` or pass `--standard`

### Language Changes
- "Switch to Chinese/English/bilingual" → Update `language` in config.json

Expand Down
6 changes: 6 additions & 0 deletions config/config-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@
"default": "daily",
"description": "How often to deliver the digest"
},
"digestMode": {
"type": "string",
"enum": ["standard", "expanded"],
"default": "standard",
"description": "Digest breadth: standard concise edition or expanded edition with medium-density items"
},
"deliveryTime": {
"type": "string",
"default": "08:00",
Expand Down
Loading