English | 한국어
Drop links, text, or images into a Telegram bot throughout the day, and every night at 22:00 Claude visits, summarizes, and files them into your Obsidian vault by topic — a personal auto-archiver.
drop anytime into the bot →→→ daily 22:00 (launchd) →→→ Obsidian vault
link / text / image collect → summarize → file topic folders + summary notes
+ Telegram "done" notification
| Input | Handling |
|---|---|
| 🔗 Link | Visit with WebFetch → summarize |
| 📝 Text only | WebSearch for related material → synthesize a summary |
| 🖼️ Image | Vision describes it + OCR, original kept and embedded in the note |
| 💬 Natural-language instruction | Reads "put this in the Design folder", "focus on risks", etc. and honors it |
- Automatic topic-folder matching (conservative — reuses existing folders first)
- Automatic wikilinks to related notes (
[[...]]) - Sends a
📥 N items filed todaymessage to the bot when done - Failed links are retried the next day (zero loss)
Social pages block direct scraping; tech communities mostly have open APIs. Each platform is a credential-gated enricher — drop optional credentials in .env to unlock the authenticated path; without them it degrades to best-effort + a "visit original" banner.
| Source | Access | Credentials |
|---|---|---|
| Hacker News | Full post + top comments (Algolia API) | none |
| Lobsters | Full post + top comments (.json) |
none |
| arXiv | Title + abstract + authors (export API) | none |
| X / Twitter | Full tweet text (syndication) | none |
| Bluesky | Full post + replies (public AppView API) | none |
| YouTube | Title + channel + description (no transcript) | none |
| Post + top comments (OAuth) | REDDIT_CLIENT_ID / REDDIT_CLIENT_SECRET (optional) |
|
| Threads / Instagram | og snippet (best-effort) | — |
| Facebook / Truth Social | mostly blocked → banner | — |
tries WebFetch first; posts usually authwalled → og snippet, pulse articles often full |
— |
HN/Reddit notes emphasize the discussion: ## Discussion synthesizes the top comments' arguments. Indirectly-fetched SNS posts carry a banner telling you to visit the original.
Default for unreadable pages (X, LinkedIn, any platform): never dropped — summarized from whatever is available (enriched data → og snippet → title/URL), with the original link in the note's source and a "visit original" banner. Counted as partial success, not failure.
---
title: ...
source: <URL | telegram-text | telegram-image>
captured: YYYY-MM-DD
topic: <topic>
tags: [auto, ...]
---
## One-line summary
## Key points (5–8 bullets)
## Background / context
## Implications / how to use
## Related notes| File | Role |
|---|---|
collect.mjs |
Telegram getUpdates → chat_id filter → collect messages (link/image/text) → pending.jsonl |
lib/parse-message.mjs |
Message parsing (text / urls / photo) |
lib/extract-urls.mjs |
URL extraction (entities + regex fallback) |
lib/state.mjs |
offset / pending state files |
prompt.md |
Claude instructions for summarizing, topic-matching, filing |
run.sh |
collect → claude -p headless → notify |
notify.mjs |
Sends the run result to the Telegram bot |
com.zzamtong.linksummarizer.plist |
launchd schedule, daily 22:00 |
Zero dependencies — only Node's built-in fetch / node:test.
git clone https://github.com/s1ns3nz0/zzamtong-bot.git
cd zzamtong-bot
cp .env.example .env # fill in the values (below)
node --test # 12 unit tests should passFill in .env:
- Telegram
@BotFather→/newbot→ token →TELEGRAM_TOKEN - Send
/startto the bot, openhttps://api.telegram.org/bot<TOKEN>/getUpdates, readchat.id→TELEGRAM_CHAT_ID - Your Obsidian vault path →
VAULT_DIR
Register with launchd (daily 22:00):
# edit the paths in the plist for your environment, then
cp com.zzamtong.linksummarizer.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.zzamtong.linksummarizer.plistRun / test manually:
./run.sh.env(token), state files, logs, and original images are all.gitignored — never committed.- The bot only processes messages from the
TELEGRAM_CHAT_IDin.env(others are filtered out). claude -prunning withANTHROPIC_API_KEYbills API tokens.
MIT
