Topic Monitor
by @robbyczgw-cla
Monitor topics of interest and proactively alert when important developments occur. Use when the user wants automated monitoring of specific subjects like pr...
clawhub install topic-monitorπ About This Skill
name: topic-monitor version: 1.5.2 description: Monitor topics of interest and proactively alert when important developments occur. Use when the user wants automated monitoring of specific subjects like product releases, news topics, technology updates, RSS/Atom feeds, or GitHub releases. Supports scheduled web search plus feed polling, boolean topic filters, AI importance scoring with sentiment tracking, smart alerts vs weekly digests, and memory-aware contextual summaries. metadata: {"openclaw":{"requires":{"bins":["python3"],"env":{"TOPIC_MONITOR_TELEGRAM_ID":"optional - Telegram chat ID for alerts","TOPIC_MONITOR_DATA_DIR":"optional - defaults to .data/ in skill dir","WEB_SEARCH_PLUS_PATH":"optional - defaults to relative path"},"note":"All env vars optional. Defaults work out of the box."}}}
Topic Monitor
Monitor topics continuously and alert only when something looks relevant.
Whatβs new in v1.5.0
feedsgithub_repos β https://github.com/{owner}/{repo}/releases.atomrequired_keywords and exclude_keywordspositive, negative, neutral, mixedalert_on_sentiment_shiftQuick start
python3 scripts/quick.py "AI Model Releases"
python3 scripts/quick.py "OpenClaw Releases" --github-repos "openclaw/openclaw"
python3 scripts/quick.py "Security Advisories" --feeds "https://example.com/security.xml"
Then test it:
python3 scripts/monitor.py --dry-run --verbose
Core model
Each topic can mix multiple sources:
queryfeedsgithub_reposAll collected results flow into the same pipeline:
1. gather results 2. deduplicate 3. apply advanced filters 4. score importance 5. classify sentiment 6. alert immediately or save for digest 7. track state and sentiment history
Topic config
Each topic supports these keys:
idnamequerykeywordsfeedsgithub_reposrequired_keywordsexclude_keywordsfrequency β hourly|daily|weeklyimportance_threshold β high|medium|lowchannelscontextalert_onalert_on_sentiment_shiftignore_sourcesboost_sourcesExample config
{
"topics": [
{
"id": "openclaw-news",
"name": "OpenClaw Updates",
"query": "OpenClaw AI assistant update release",
"keywords": ["OpenClaw", "release", "update"],
"feeds": ["https://example.com/blog/rss.xml"],
"github_repos": ["openclaw/openclaw"],
"required_keywords": ["release"],
"exclude_keywords": ["rumor", "affiliate"],
"frequency": "daily",
"importance_threshold": "medium",
"channels": ["telegram"],
"context": "Track product updates and releases",
"alert_on": ["keyword_exact_match", "github_release"],
"alert_on_sentiment_shift": true,
"ignore_sources": [],
"boost_sources": ["github.com"]
}
]
}
Advanced filters
required_keywords
All listed terms must appear in the title/snippet before scoring.
"required_keywords": ["release", "stable"]
exclude_keywords
Any matching term filters the result out before scoring.
"exclude_keywords": ["beta", "rumor", "affiliate"]
This is intentionally simple boolean logic:
RSS/Atom feeds
Direct feeds
python3 scripts/manage_topics.py add "Security Feeds" \
--feeds "https://example.com/rss.xml,https://example.com/atom.xml" \
--keywords "security,CVE,patch"
Feed discovery
Discover feeds from a normal website URL:
python3 scripts/manage_topics.py discover-feed https://example.com/blog
python3 scripts/monitor.py --discover-feed https://example.com/blog
Add a topic and auto-discover feeds in one step:
python3 scripts/manage_topics.py add "Vendor Blog" \
--discover-feeds "https://example.com/blog" \
--keywords "release,announcement"
OPML import
Import feed subscriptions from an OPML file:
python3 scripts/manage_topics.py import-opml feeds.opml
Imported topics default to daily / medium unless you override:
python3 scripts/manage_topics.py import-opml feeds.opml --frequency hourly --importance high
Feed caching
Feed polling uses feedparser and stores per-feed cache data in monitor state:
etaglast-modifiedThat allows efficient conditional requests and avoids reprocessing unchanged feeds.
GitHub release monitoring
Track repo releases with:
"github_repos": ["openclaw/openclaw", "anthropics/claude-code"]
These map to GitHub Atom feeds automatically:
https://github.com/openclaw/openclaw/releases.atomhttps://github.com/anthropics/claude-code/releases.atomCLI example:
python3 scripts/manage_topics.py add "CLI Releases" \
--github-repos "openclaw/openclaw,anthropics/claude-code" \
--keywords "release,version"
GitHub release items are labeled clearly in alerts.
Sentiment analysis
Each scored finding also gets a sentiment label:
positivenegativeneutralmixedAlerts and digest entries include that sentiment.
Sentiment shift alerts
Enable:
"alert_on_sentiment_shift": true
When enabled, a result that changes sentiment versus the topicβs previous sentiment history gets promoted for alerting.
State tracks:
last_sentimentsentiment_historyScripts
scripts/manage_topics.py
# Add topic
python3 scripts/manage_topics.py add "Topic Name" \
--query "search query" \
--keywords "word1,word2" \
--feeds "https://example.com/rss.xml" \
--github-repos "openclaw/openclaw" \
--required-keywords "release" \
--exclude-keywords "beta,rumor"List topics
python3 scripts/manage_topics.py listEdit topic
python3 scripts/manage_topics.py edit topic-id --feeds "https://example.com/rss.xml"Discover feeds
python3 scripts/manage_topics.py discover-feed https://example.com/blogImport OPML
python3 scripts/manage_topics.py import-opml feeds.opmlTest topic
python3 scripts/manage_topics.py test topic-id
scripts/monitor.py
python3 scripts/monitor.py
python3 scripts/monitor.py --dry-run
python3 scripts/monitor.py --topic openclaw-news --verbose
python3 scripts/monitor.py --discover-feed https://example.com/blog
Alert output
Alerts can now include:
Web, Feed, GitHub Release)Installation note
Feed support uses Python feedparser.
Install if needed:
pip3 install feedparser
Troubleshooting
Feeds not showing results
discover-feed against the site URLfeedparserpython3 scripts/monitor.py --dry-run --verboseToo much noise
required_keywordsexclude_keywordsimportance_thresholdMissing GitHub release alerts
owner/repo--verboseNotes
π‘ Examples
python3 scripts/quick.py "AI Model Releases"
python3 scripts/quick.py "OpenClaw Releases" --github-repos "openclaw/openclaw"
python3 scripts/quick.py "Security Advisories" --feeds "https://example.com/security.xml"
Then test it:
python3 scripts/monitor.py --dry-run --verbose