What Is TrendRadar by sansan0? A Complete Guide to the Open-Source News Aggregation Tool
TrendRadar is an open-source Python tool that aggregates, filters, and analyzes trending news from 11+ Chinese and international platforms, then delivers personalized reports via multiple notification channels or interactive HTML dashboards.
TrendRadar by sansan0 transforms raw hot-search data from platforms like Zhihu, Bilibili, Weibo, and the Wall Street Journal into concise, actionable intelligence. Whether you need daily digests, real-time alerts, or AI-curated content streams, this modular tool automates the entire pipeline from crawling to delivery.
Core Capabilities of TrendRadar
Multi-Platform News Aggregation
TrendRadar ships with built-in crawlers for 11+ platforms and a plugin-style API for adding custom sources. The crawler layer in trendradar/crawler/fetcher.py handles HTTP requests with configurable proxy support and request throttling via REQUEST_INTERVAL.
# From trendradar/__main__.py — pipeline orchestration
analyzer = NewsAnalyzer(config=ctx.config)
analyzer.run() # Triggers: crawl → analyze → generate HTML → notify
RSS and Atom Feed Support
The trendradar/crawler/rss.py module provides optional RSS/Atom ingestion that shares the same keyword-based filtering logic as hot-search crawlers. Each feed supports max_age_days for freshness filtering and max_items for volume control.
# Example RSS feed configuration structure
new_feed = {
"id": "myblog",
"name": "My Blog",
"url": "https://example.com/rss",
"max_items": 30,
"enabled": True,
"max_age_days": 7
}
Dual Filtering Modes: Keyword and AI-Driven
TrendRadar offers two complementary filtering approaches controlled via config/config.yaml:
| Method | Implementation | Use Case |
|---|---|---|
| Keyword matching | frequency_words.txt groups with required/normal words |
Fast, deterministic filtering by topic |
| AI classification | trendradar/ai/filter.py (AIFilter) with LLM APIs |
Natural-language interest descriptions, semantic understanding |
The keyword engine in trendradar/core/analyzer.py computes news weights using rank, frequency, and hotness contributions via calculate_news_weight().
# Switch to AI-only filtering in config/config.yaml
FILTER:
METHOD: ai
AI_FILTER:
ENABLED: true
INTERESTS_FILE: my_interests.txt
MIN_SCORE: 0.6
BATCH_SIZE: 200
Three Push Modes for Different Schedules
The trendradar/core/scheduler.py module implements three execution modes controlled by config/timeline.yaml:
daily: Full-day summary with complete statisticscurrent: Latest snapshot of hot searchesincremental: Only newly-appearing items since last run
The scheduler guarantees once-per-period execution via storage-backed tracking in ResolvedSchedule.
Rich Notification Channel Support
TrendRadar's trendradar/notification/dispatcher.py builds channel-specific payloads and handles batch splitting for oversized messages. Supported channels include:
- Enterprise WeChat, personal WeChat
- Telegram, Feishu, DingTalk
- Slack, ntfy, Bark
- Email, generic webhooks
The optional AI translator (AITranslator) can translate hot-list content when AI_TRANSLATION.ENABLED is true.
Interactive HTML Reports and Visual Editor
TrendRadar generates a self-contained index.html suitable for GitHub Pages hosting. The report includes:
- Visual configuration editor accessible via "配置编辑器" button
- Direct loading and editing of
config/config.yamlandconfig/timeline.yaml - Real-time preview of platform lists, keyword groups, and schedule templates
Deployment Options for TrendRadar
Docker Container Deployment
The official image wantcat/trendradar supports environment-variable configuration:
docker run -d \
-e TIMEZONE=Asia/Shanghai \
-e USE_PROXY=true \
-v $(pwd)/config:/app/config \
-v $(pwd)/output:/app/output \
wantcat/trendradar
GitHub Actions CI/CD
TrendRadar includes ready-to-use workflows for automated execution without local infrastructure.
Command-Line Options
# Standard full pipeline
python -m trendradar
# Skip crawling, use existing data
python -m trendradar --no-crawl
# Install dependencies
pip install -r requirements.txt
Summary
TrendRadar by sansan0 is a production-ready, extensible news aggregation system with these key strengths:
- Modular architecture: Clean separation between crawling, analysis, AI, scheduling, and notification layers
- Dual filtering: Keyword precision plus AI semantic understanding
- Flexible deployment: Docker, GitHub Actions, or direct Python execution
- Rich output: Interactive HTML, multi-channel notifications, and visual configuration
- Extensible design: Plugin API for new platforms and notification channels
The codebase in sansan0/TrendRadar demonstrates best practices for maintainable Python automation tools, with centralized context management via AppContext and storage-agnostic data persistence.
Frequently Asked Questions
What platforms does TrendRadar support out of the box?
TrendRadar includes built-in crawlers for 11+ platforms including Zhihu, Bilibili, Weibo, 36Kr, Juejin, Wall Street Journal, and others. The PLATFORMS configuration in config/config.yaml controls which sources are active, and the plugin-style API in trendradar/crawler/fetcher.py enables adding custom platforms.
How does the AI filtering work in TrendRadar?
The AI filter in trendradar/ai/filter.py (AIFilter class) classifies news items against natural-language interest descriptions stored in ai_interests.txt. It uses LLM APIs (OpenAI, Gemini, DeepSeek) with configurable MIN_SCORE thresholds and BATCH_SIZE for efficient processing. The system caches results and detects interest file changes via hashing to avoid redundant API calls.
Can TrendRadar run without crawling new data?
Yes. TrendRadar supports a --no-crawl flag (handled in trendradar/__main__.py) that skips the DataFetcher entirely. This mode loads existing data from SQLite storage, regenerates the HTML report, and sends notifications—useful for scheduled re-reports or when data is collected by external systems.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →