Personalized top news briefing with trend insights. Use when the user asks for news, briefings, what's trending, hot topics, daily digest, or 新闻/热点/快报. Supports multiple categories, scheduled delivery, and preference learning.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Une commande directe contourne le prompt de vérification. Examinez la source avant de l'exécuter.
Personalized top news briefing with trend insights. Use when the user asks for news, briefings, what's trending, hot topics, daily digest, or 新闻/热点/快报. Supports multiple categories, scheduled delivery, and preference learning.
version
0.4.1
license
MIT
compatibility
Python 3.9+, internet access required. No paid API keys needed for basic operation (NewsAPI optional).
Deliver personalized top news briefings with trend insights, preference tracking, and scheduled delivery.
CRITICAL RULES
[!IMPORTANT]
Use the scripts for data fetching and ranking. Do NOT scrape news yourself. Use fetch_news.py for data collection and rank_and_dedup.py for ranking.
YOUR job is prompt composition, trend analysis, and user interaction. The scripts handle data; you handle intelligence.
Respect user preferences. Always check the config before delivering.
Never fabricate news. Only report what the scripts return. If data is insufficient, say so.
Send briefings as text messages. Not files, not images. Clean formatted text.
Use the user's language. Detect from conversation context and match it. All onboarding prompts, briefings, and interactions should be in the user's language. This SKILL.md is in English for portability — you translate at runtime.
Follow the exact formatting in templates. Onboarding questions use plain text with aligned spacing — NOT markdown tables. Copy the format exactly, only translate the text. Do not reformat into tables, bullets, or any other structure.
Don't patch skill files yourself. If you find a bug or missing feature in this skill, tell the user and suggest running hermes skills update top-news. The skill is maintained upstream — local edits will be overwritten on the next update.
When to Use
User asks for news, briefings, hot topics, trending, daily digest
User says 新闻, 热点, 快报, 每日简报
Scheduled cron delivery time arrives
Workflow
First Time: Onboarding
[!IMPORTANT]
Onboarding MUST be multi-turn. Ask ONE question at a time. Wait for the user's answer before asking the next. Do NOT dump all questions at once. After all questions, present a summary for review. Only proceed after explicit approval.
Option formatting rules:
Every option MUST have a number prefix (1, 2, 3...) for easy reply
Each question MUST state whether it is multi-select or single-select
Multi-select questions: mark each option with ✅ (selected) or ❌ (not selected). First-time: all enabled by default. Returning user: show current selections. User replies with numbers to TOGGLE.
Single-select questions: mark the active option with ← default (first-time) or ← current (returning user).
Every question MUST end with: "Reply 0 to skip (keep current selections)"
0 = keep current state as-is. For first-time multi-select, current state = all enabled.
If no config exists yet, walk the user through setup step by step. If config already exists (user wants to change settings), show current values.
Question 1: Topics [MULTI-SELECT — reply with numbers to toggle]
What topics interest you? (reply with numbers to toggle on/off)
1. 🖥 Technology ✅
2. 🤖 AI/ML ✅
3. 💰 Finance ✅
4. 🌍 World News ✅
5. 🔬 Science ✅
6. 🎬 Entertainment ✅
All enabled by default. Reply with numbers to toggle (e.g. "5 6" to disable Science & Entertainment), or 0 to skip.
WAIT for answer.
Question 2: Custom RSS Feeds [OPTIONAL]
Want to add any custom RSS feeds? (in addition to Google News)
Enter RSS/Atom URLs (one per line), or 0 to skip.
WAIT for answer.
Question 3: Language [SINGLE-SELECT]
Language preference?
1. 🇨🇳 Chinese
2. 🇬🇧 English
3. 🌐 Both ← default
Reply 1/2/3, or 0 to skip.
WAIT for answer.
Question 4: Format [SINGLE-SELECT]
How detailed should each briefing be?
1. 📋 Headlines only — just titles and sources
2. 📝 With summaries — 2-3 sentence per item ← default
3. 📊 Deep analysis — detailed context and implications
Reply 1/2/3, or 0 to skip.
WAIT for answer.
Question 5: Item Count [SINGLE-SELECT]
How many news items per briefing?
1. 5
2. 10 ← default
3. 15
4. Custom number
Reply 1/2/3/4, or 0 to skip.
WAIT for answer.
Question 6: Timezone [SINGLE-SELECT]
[!IMPORTANT]
Cron jobs run in UTC on the server. You MUST know the user's timezone to schedule deliveries at the correct local time. Try to auto-detect from conversation context (language, mentioned city, greeting time). If uncertain, ask explicitly.
What's your timezone?
1. 🇨🇳 Asia/Shanghai (UTC+8)
2. 🇺🇸 America/New_York (UTC-4)
3. 🇺🇸 America/Los_Angeles (UTC-7)
4. 🇪🇺 Europe/Berlin (UTC+2)
5. 🇬🇧 Europe/London (UTC+1)
6. 🌐 Other (tell me your city or UTC offset)
Reply 1-6, or 0 to skip (defaults to UTC).
WAIT for answer.
Question 7: Schedule [SINGLE-SELECT]
When should I deliver? (times in your local timezone)
1. 🌅 Morning (08:00) ← default
2. 🌆 Evening (20:00)
3. 🌅+🌆 Both (08:00 + 20:00)
4. ⏰ Custom time(s)
Reply 1/2/3/4, or 0 to skip.
WAIT for answer.
Question 8: Delivery Target [SINGLE-SELECT]
Where should I send the briefing?
1. 💬 Here (this chat) ← default
2. 📢 A specific group or channel
Reply 1/2, or 0 to skip.
WAIT for answer.
Review Summary
After all questions are answered, present a complete summary:
Present as a clean aligned summary. Use monospace or pre-formatted text to ensure alignment in Telegram:
Your briefing configuration:
📋 Topics [list of selected topics]
🔍 Source Google News (+ [N] custom RSS feeds)
🌐 Language [choice]
📝 Format [choice]
🔢 Items [count] per briefing
🕐 Timezone [timezone]
⏰ Schedule [times] (local) → [UTC times] (UTC)
💬 Delivery [target]
Confirm? Reply "yes" to apply, or tell me what to change.
NOTE: In Telegram, use code blocks or consistent spacing to keep the summary visually aligned. Avoid markdown tables — they don't render well in Telegram.
STOP and WAIT for explicit approval.
If the user says yes:
Tell them: "Setting up now, this will take about 10 seconds..."
All set! Here's what I configured:
✅ Config saved
✅ [N] news sources activated
✅ Cron scheduled: [times]
Your first briefing will arrive at [next scheduled time].
Want me to run a test briefing right now?
Workspace Structure
All data lives in the agent's workspace:
workspace/top-news/
├── config.json # User preferences
├── sources.json # Active sources (generated from preferences)
├── tracking.json # 7-day rolling window for dedup + streaks
├── preferences.json # User feedback (👍👎) history
├── history/ # Past briefings
│ └── 2026-04-27.json
└── logs/
└── 2026-04-27.log
Read ranked_news.json and compose the briefing text using the templates in templates/briefing-template.md. Choose format based on user config.
For each article:
Write a clear, concise summary (use your LLM capabilities)
Add streak badges where applicable
Add numbered 👍/👎 prompts
Step 4: Add trend insights
Analyze the tracking.json to identify:
Articles on multi-day streaks (trending topics)
New topics appearing for the first time
Topics that disappeared (cooled down)
Write a brief trend section at the end.
Step 5: Deliver
Send the composed briefing as a text message to the user.
Step 6: Save history
Save the delivered briefing to history/YYYY-MM-DD.json.
Step 7: Collect feedback
After delivery, prompt:
💬 Reply with 👍3 or 👎5 to react, or tell me what you want more/less of!
When user replies with feedback, update preferences.json:
{"likes":[{"title":"...","source":"...","date":"..."}],"dislikes":[{"title":"...","source":"...","date":"..."}],"adjustments":["more AI news","less entertainment"]}
Modifying Preferences
User can say things like:
"More AI news, less finance"
"Switch to headlines only"
"Change to evening delivery"
"Add this RSS feed: https://..."
"Show me 15 items instead"
Update config.json and sources.json accordingly.
Setting Up Cron
[!IMPORTANT]
Hermes cron runs in UTC. You MUST convert the user's local time to UTC before creating the cron schedule. Read timezone from config.json and compute the UTC offset.
Example: User wants 08:00 in Asia/Shanghai (UTC+8) → cron should be 0 0 * * * (00:00 UTC).
Use Hermes cron to schedule delivery:
/cron add --name "top-news" --schedule "0 0 * * *" --prompt "Deliver my top news briefing"
Adjust the cron schedule based on user's preferred delivery time after converting to UTC.
Reference Documents
Sources Catalog: references/sources-catalog.md — Available data sources by category
Briefing Templates: templates/briefing-template.md — Output format templates (headlines, summary, deep analysis)
Pitfalls
RSS feeds go stale. If fetch_news.py returns fewer items than expected, check references/sources-catalog.md for known broken feeds and suggest alternatives.
Network timeouts. If many sources fail simultaneously, the briefing may be sparse. Inform the user and offer to retry.
Near-duplicate articles may slip through. The dedup uses title similarity — syndicated wire stories can occasionally pass. This is expected.
Stale tracking.json. If the agent hasn't run in 7+ days, streak badges won't appear until the tracking window rebuilds.
Cron job misconfiguration. When changing schedule, remove the old cron job first to avoid duplicate deliveries.
Verification
After each briefing: Verify fetch_news.py returned >0 items and history/YYYY-MM-DD.json was saved.
After cron setup: Run hermes cron list to confirm the job exists with the correct schedule.
After preference changes: Re-read config.json to confirm the update persisted.
Important Notes
Scripts use only free, public data sources (RSS feeds + Hacker News API)
No API keys required for basic operation (NewsAPI is optional for expanded coverage)
Tracking window is 7 days rolling — older items are automatically pruned
All internal timestamps are UTC; cron schedules must be in UTC (convert from user's local timezone in config)
The agent composes the final briefing text — scripts only fetch and rank raw data
User preferences evolve over time based on feedback