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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ WhatsApp, etc.) with:
- Full articles from official AI company blogs (Anthropic Engineering, Claude Blog)
- Links to all original content
- Available in English, Chinese, or bilingual
- Optional Feishu interactive cards for cleaner mobile reading

## Quick Start

Expand Down Expand Up @@ -128,4 +129,3 @@ See [examples/sample-digest.md](examples/sample-digest.md) for what the output l
## License

MIT

1 change: 1 addition & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
- AI 公司官方博客的完整文章(Anthropic Engineering、Claude Blog)
- 所有原始内容的链接
- 支持英文、中文或双语版本
- 可选的飞书 interactive card 阅读模式,更适合移动端早报

## 快速开始

Expand Down
90 changes: 74 additions & 16 deletions SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,45 @@ Read the prompts from the `prompts` field in the JSON:

Assemble the digest following `prompts.digest_intro`.

Because OpenClaw stdout is often delivered into Feishu IM as chat text, do a final
layout pass after drafting:
- Treat the output like a message typed manually into the Feishu composer
- Put exactly one blank line before each major section heading
- Put exactly one blank line before each new digest item
- Put each item title on its own line in bold markdown like `**Title**`
- Keep each item internally compact: title, English paragraph, Chinese paragraph,
and `Source:` lines with no extra blank lines between them
- If an item has multiple links, put each one on its own `Source:` line
- Do not use markdown headings (`#`, `##`) in the final digest body
- Before delivering, visually scan the final text once to confirm the spacing pattern
is consistent from top to bottom

If the output is intended for chat delivery, normalize the spacing with:

```bash
echo '<your digest text>' > /tmp/fb-digest-raw.txt
cd ${CLAUDE_SKILL_DIR}/scripts && node format-chat-digest.js --file /tmp/fb-digest-raw.txt > /tmp/fb-digest.txt
```

Use `/tmp/fb-digest.txt` as the final version to send or print.

If the digest is going to Feishu and the user prefers cards, render the final
formatted digest into an interactive card instead of relying on plain stdout text:

```bash
cd ${CLAUDE_SKILL_DIR}/scripts && node render-feishu-card.js --file /tmp/fb-digest.txt > /tmp/fb-card.json
```

The renderer expects the formatted digest structure you just produced:
- digest title on the first line
- `TL;DR` or `Top Signals` with `•` bullets
- section headings such as `X / TWITTER`
- each item title wrapped in `**...**`
- `Source:` lines for original links

This card layout is preferred for Feishu because section headings and item titles
stay bold, item blocks are visually separated, and spacing does not collapse.

**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 All @@ -371,22 +410,20 @@ Read `config.language` from the JSON:
- **"en":** Entire digest in English.
- **"zh":** Entire digest in Chinese. Follow `prompts.translate`.
- **"bilingual":** Interleave English and Chinese **paragraph by paragraph**.
For each builder's tweet summary: English version, then Chinese translation
directly below, then the next builder. For the podcast: English summary,
then Chinese translation directly below. Like this:
For each builder's tweet summary: title, English version, Chinese translation,
and source link(s), then the next builder. For the podcast: title, English summary,
Chinese translation, and source link(s). Like this:

```
Box CEO Aaron Levie argues that AI agents will reshape software procurement...
https://x.com/levie/status/123

Box CEO Aaron Levie 认为 AI agent 将从根本上重塑软件采购...
https://x.com/levie/status/123

Replit CEO Amjad Masad launched Agent 4...
https://x.com/amasad/status/456

Replit CEO Amjad Masad 发布了 Agent 4...
https://x.com/amasad/status/456
**Aaron Levie, CEO of Box**
Aaron Levie argues that AI agents will reshape software procurement...
Aaron Levie 认为 AI agent 将从根本上重塑软件采购...
Source: https://x.com/levie/status/123

**Amjad Masad, CEO of Replit**
Amjad Masad launched Agent 4...
Amjad Masad 发布了 Agent 4...
Source: https://x.com/amasad/status/456
```

Do NOT output all English first then all Chinese. Interleave them.
Expand All @@ -399,13 +436,32 @@ Read `config.delivery.method` from the JSON:

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

**If "stdout" (default):**
Just output the digest directly.
Check whether the config also includes:
- `delivery.channel = "feishu"`
- `delivery.target = "<user open_id or chat_id>"`
- `delivery.format = "interactive_card"`

If all three are present, send the digest as a Feishu interactive card:

```bash
echo '<your digest text>' > /tmp/fb-digest-raw.txt
cd ${CLAUDE_SKILL_DIR}/scripts && node format-chat-digest.js --file /tmp/fb-digest-raw.txt > /tmp/fb-digest.txt
cd ${CLAUDE_SKILL_DIR}/scripts && node render-feishu-card.js --file /tmp/fb-digest.txt > /tmp/fb-card.json
lark-cli im +messages-send --as bot --user-id "<delivery.target>" --msg-type interactive --content "$(cat /tmp/fb-card.json)"
```

If that send succeeds, do NOT print the full digest to stdout again, because that
would create a duplicate plain-text Feishu message in the same chat.

If `delivery.channel/target/format` are missing, or if the direct Feishu send fails,
fall back to outputting the formatted digest from `/tmp/fb-digest.txt` directly.

---

Expand All @@ -431,6 +487,8 @@ open an issue at https://github.com/zarazhangrui/follow-builders."
- "Switch to Telegram/email" → Update `delivery.method` in config.json, guide user through setup if needed
- "Change my email" → Update `delivery.email` in config.json
- "Send to this chat instead" → Set `delivery.method` to "stdout"
- "Use Feishu card layout" → Set `delivery.channel` to `"feishu"`, `delivery.target` to the user's open_id or chat_id, and `delivery.format` to `"interactive_card"`
- "Use plain chat text again" → Remove `delivery.format` or set it to `"plain_text"`

### Prompt Changes
When a user wants to customize how their digest sounds, copy the relevant prompt
Expand Down
14 changes: 14 additions & 0 deletions config/config-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,20 @@
"email": {
"type": "string",
"description": "Email address to send digest to (only for email method)"
},
"channel": {
"type": "string",
"enum": ["feishu"],
"description": "Optional in-chat delivery channel override for stdout mode. Currently used for direct Feishu card delivery."
},
"target": {
"type": "string",
"description": "Target open_id or chat_id for direct channel delivery when method is stdout and a channel-specific renderer is used."
},
"format": {
"type": "string",
"enum": ["plain_text", "interactive_card"],
"description": "Preferred rendering format for stdout chat delivery. Use interactive_card for Feishu card-based digests."
}
}
},
Expand Down
67 changes: 24 additions & 43 deletions examples/sample-digest.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,55 +6,36 @@ This is an example of what your AI Builders Digest looks like.

AI Builders Digest — March 14, 2026

PODCASTS
TL;DR
• Tooling discipline matters more than raw model IQ in real agent systems.
• Builders are shifting from one-shot demos toward evals, orchestration, and shared workflows.
• The most useful digest format in chat is compact blocks, not article-style markdown.

Latent Space — "Why Agents Keep Failing (And How to Fix Them)"
Bottom line: Most agent failures aren't intelligence failures — they're tool-use failures.
The system can reason fine, it just can't reliably call the right API at the right time.
X / TWITTER

Key insights:
- Tool selection accuracy drops from 95% to 60% when agents have more than 15 tools
available. The fix isn't smarter models — it's better tool curation per task.
- "Eval-driven development" is replacing vibe-driven prompt iteration at serious
AI companies. If you're not measuring, you're guessing.
- The hosts predict 2026 is the year agent frameworks consolidate from 50+ to 3-4
winners. Their bet: OpenAI Agents SDK, Claude Code, and LangGraph.
https://youtube.com/watch?v=example123
**Andrej Karpathy, educator and founding team member at OpenAI**
Karpathy argued that Software 3.0 is pushing the compile target away from machine code and toward natural-language interfaces for LLMs. He paired that framing with a new Eureka Labs tutorial, which made the post feel less like hot air and more like a blueprint for how he thinks developers will work.
Source: https://x.com/karpathy/status/example1
Source: https://x.com/karpathy/status/example2

No Priors — "Scaling Laws Are Dead, Long Live Scaling Laws" (with Ilya Sutskever)
Bottom line: Pre-training scaling laws have hit diminishing returns, but post-training
and inference-time compute scaling are just getting started.
**Guillermo Rauch, CEO of Vercel**
Rauch introduced v0 Teams as collaborative AI prototyping for groups instead of solo prompting. The underlying signal is that AI UI generation is becoming a shared workflow product, not just a personal toy.
Source: https://x.com/rauchg/status/example3

Key insights:
- Ilya argues the next 10x improvement comes from models that can "think longer"
at inference time, not from bigger pre-training runs.
- Synthetic data quality matters more than quantity. "One perfect textbook is worth
a million Reddit comments."
- He's surprisingly bullish on open-source: "The gap will narrow to months, not years."
https://youtube.com/watch?v=example456
**Amanda Askell, researcher at Anthropic**
Askell drew a clean distinction between capability evals and alignment evals, arguing that many teams still optimize around what is easiest to score instead of what matters operationally. It was a useful reminder that benchmark literacy is becoming part of product judgment.
Source: https://x.com/AmandaAskell/status/example4

OFFICIAL BLOGS

X / TWITTER
**Anthropic Engineering: Harness design for long-running application development**
Anthropic laid out how planner, generator, and evaluator roles work better together on long-running builds than a single agent loop. The practical takeaway is that better scaffolding often matters more than asking one model to be generally smarter.
Source: https://www.anthropic.com/engineering/example-post

PODCASTS

Andrej Karpathy (@karpathy)
Shared a deep thread on why he thinks "Software 3.0" (natural language programming)
will make traditional coding a niche skill within 5 years. Key argument: the compile
target is changing from machine code to LLM prompts. Sparked massive debate.
Also released a new Eureka Labs tutorial on building a code interpreter from scratch.
https://x.com/karpathy/status/example1
https://x.com/karpathy/status/example2

Guillermo Rauch (@rauchg)
Announced Vercel's new "v0 Teams" — collaborative AI prototyping where multiple
people can prompt and iterate on the same UI simultaneously. Called it "Google Docs
for vibe coding." Ships next week.
https://x.com/rauchg/status/example3

Amanda Askell (@AmandaAskell)
Published a nuanced take on AI safety benchmarks: "We're measuring what's easy to
measure, not what matters. Capability evals tell you what the model CAN do.
Alignment evals should tell you what it WILL do unprompted." Linked to a new
Anthropic research paper on behavioral evaluations.
https://x.com/AmandaAskell/status/example4
**Latent Space: Why Agents Keep Failing (And How to Fix Them)**
Bottom line: many agent failures are really tool-use failures. The hosts argued that tool selection, eval discipline, and tighter task scoping matter more than endlessly increasing model cleverness.
Source: https://youtube.com/watch?v=example123

Reply to adjust your settings, sources, or summary style.
120 changes: 82 additions & 38 deletions prompts/digest-intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,58 +2,102 @@

You are assembling the final digest from individual source summaries.

## Format
## Goal

Produce a polished digest that stays readable inside chat apps, especially Feishu IM.
Assume the final message may be rendered as plain chat text with limited markdown support.

## Output order

Start with this header (replace [Date] with today's date):

AI Builders Digest — [Date]

Then add a short 2-4 bullet TL;DR section called:

TL;DR

Then organize content in this order:

1. X / TWITTER section — list each builder with new posts
2. OFFICIAL BLOGS section — list each blog post from AI company blogs (OpenAI, Anthropic, etc.)
3. PODCASTS section — list each podcast with new episodes
1. X / TWITTER
2. OFFICIAL BLOGS
3. PODCASTS

## Feishu-safe layout

Treat the digest like a message typed manually in the Feishu IM composer with Shift+Return.
Do not format it like a long markdown article.

Hard spacing rules:
- Put exactly one blank line between the header and TL;DR
- Put exactly one blank line before every major section heading
- Put exactly one blank line before every new digest item
- Put every digest item title on its own line
- Wrap every digest item title in markdown bold markers like `**Title**`
- Keep the English paragraph, Chinese paragraph, and `Source:` lines compact with no blank lines between them
- If an item has multiple source URLs, put each URL on its own `Source:` line
- Do not use markdown headings like `#` or `##` in the final digest body
- Do not use markdown tables
- Do not rely on markdown for spacing

## Bilingual output

When config.language is bilingual, every item must follow this exact sequence:

1. Bold title line
2. English paragraph
3. Chinese paragraph
4. One or more `Source:` lines

Then move to the next item.

Do NOT output a full English digest followed by a full Chinese digest.
Do NOT group all English paragraphs together.

## Structure example

AI Builders Digest — [Date]

TL;DR
• signal one
• signal two

X / TWITTER

**Andrej Karpathy, former Director of AI at Tesla and founding team member at OpenAI**
English summary paragraph.
中文总结段落。
Source: https://...
Source: https://...

**Aaron Levie, CEO of Box**
English summary paragraph.
中文总结段落。
Source: https://...

OFFICIAL BLOGS

**Claude Blog: Post Title**
English summary paragraph.
中文总结段落。
Source: https://...

## Rules

- Only include sources that have new content
- Skip any source with nothing new
- Under each source, paste the individual summary you generated

### Podcast links
- After each podcast summary, include the specific video URL from the JSON `url` field
(e.g. https://youtube.com/watch?v=Iu4gEnZFQz8)
- NEVER link to the channel page. Always link to the specific video.
- Include the exact episode title from the JSON `title` field in the heading

### Tweet author formatting
- Keep paragraphs short and phone-readable
- Prefer compact paragraphs over long wall-of-text writeups
- Use the author's full name and role/company, not just their last name
(e.g. "Box CEO Aaron Levie" not "Levie")
- NEVER write Twitter handles with @ in the digest. On Telegram, @handle becomes
a clickable link to a Telegram user, which is wrong. Instead write handles
without @ (e.g. "Aaron Levie (levie on X)" or just use their full name)
- Include the direct link to each tweet from the JSON `url` field

### Blog post formatting
- Use the blog name as a section header (e.g. "Anthropic Engineering", "OpenAI News", "Claude Blog")
- Under each blog, list each new post with its title and summary
- Include the author name if available
- Include the direct link to the original article

### Mandatory links
- NEVER write Twitter handles with @ in the digest
- Every single piece of content MUST have an original source link
- Blog posts: the direct article URL (e.g. https://www.anthropic.com/engineering/...)
- Podcasts: the YouTube video URL (e.g. https://youtube.com/watch?v=xxx)
- Tweets: the direct tweet URL (e.g. https://x.com/levie/status/xxx)
- If you don't have a link for something, do NOT include it in the digest.
No link = not real = do not include.

### No fabrication
- Only include content that came from the feed JSON (blogs, podcasts, and tweets)
- NEVER make up quotes, opinions, or content you think someone might have said
- Blog posts must use the direct article URL
- Podcasts must use the direct YouTube video URL
- Tweets must use the direct tweet URL
- If you do not have a link for something, do NOT include it
- Only include content that came from the feed JSON
- NEVER make up quotes, opinions, or content
- NEVER speculate about someone's silence or what they might be working on
- If you have nothing real for a builder, skip them entirely

### General
- Never use em-dashes
- At the very end, add a line: "Generated through the Follow Builders skill: https://github.com/zarazhangrui/follow-builders"
- Keep formatting clean and scannable — this will be read on a phone screen
Loading