Build a deduplicated digest from X (Twitter) For You and Following timelines using bird. Outputs a payload for upstream delivery.
This skill uses bird to read X/Twitter timelines and build a high-signal digest. Sources:
Delivery (Telegram, email, etc.) is NOT handled here. Upstream OpenClaw workflows decide how to notify users.
All config is read from: skills.entries["x-timeline-digest"].config
| Name | Type | Default | Description |
|---|---|---|---|
| intervalHours | number | 6 | Interval window in hours |
| fetchLimitForYou | number | 100 | Tweets fetched from For You |
| fetchLimitFollowing | number | 60 | Tweets fetched from Following |
| maxItemsPerDigest | number | 25 | Max tweets in one digest |
| similarityThreshold | number | 0.9 | Near-duplicate similarity threshold |
| statePath | string | ~/.openclaw/state/x-timeline-digest.json | State file path |
Run the digest generator to get a clean, deduplicated JSON payload:
node skills/x-timeline-digest/digest.js
To generate the "Smart Brief" (Categorized, Summarized, Denoised):
node skills/x-timeline-digest/digest.js > digest.jsonread skills/x-timeline-digest/PROMPT.mddigest.json where {{JSON_DATA}} is.Note: The script automatically applies heuristic filtering (removes "gm", ads, short spam) before outputting JSON.
State is persisted to statePath.
{ "lastRunAt": "2026-02-01T00:00:00+08:00", "sentTweetIds": { "123456789": "2026-02-01T00:00:00+08:00" } }
The skill returns one JSON object: { "window": { "start": "2026-02-01T00:00:00+08:00", "end": "2026-02-01T06:00:00+08:00", "intervalHours": 6 }, "counts": { "forYouFetched": 100, "followingFetched": 60, "afterIncremental": 34, "afterDedup": 26, "final": 20 }, "digestText": "中文摘要内容", "items": [ { "id": "123456", "author": "@handle", "createdAt": "2026-02-01T02:15:00+08:00", "text": "tweet text", "url": "https://x.com/handle/status/123456", "sources": ["following"] } ] }