中文 | English
This project is designed to be lightweight and easy to deploy
💡 Click the links below to jump to the corresponding section. Start with "Quick Start" for deployment, see "Configuration Guide" for detailed customization
| 🚀 Quick Start | AI Analysis | ⚙️ Configuration Guide |
| Docker Deployment | MCP Clients | 📝 Changelog |
| 🎯 Core Features | ☕ Support Project | 📚 Related Projects |
💡 Special Note:
- About the List: The table below records supporters from the early stage (Angel Round) of the project. Due to the manual nature of statistics in the early days, there may be omissions or incomplete records. If anyone was missed, it was unintentional, and we ask for your kind understanding.
- Future Plan: To focus limited energy back on code development and feature iteration, this list will no longer be manually maintained as of today.
Whether your name is on the list or not, your every bit of support is the cornerstone that allows TrendRadar to be where it is today. 🙏
Thanks to GitHub for providing free infrastructure, which is the biggest prerequisite for this project to run conveniently with one-click fork.
This project uses the API from newsnow to fetch multi-platform data. Special thanks to the author for providing this service.
After communication, the author indicated no concerns about server pressure, but this is based on their goodwill and trust. Please everyone:
Thanks to the following platforms and individuals for recommendations (in chronological order)
Thanks to financial supporters. Your generosity has transformed into snacks and drinks beside my keyboard, accompanying every iteration of this project
Return of "One-Yuan Appreciation": With the release of v5.0.0, the project enters a new phase. To support growing API costs and caffeine consumption, the "One-Yuan Appreciation" channel is now reopened. Every bit of your kindness translates into Tokens and motivation in the code world. 🚀 Support Now
| Supporter | Amount (CNY) | Date | Note |
|---|---|---|---|
| D*5 | 1.8 * 3 | 2025.11.24 | |
| *鬼 | 1 | 2025.11.17 | |
| *超 | 10 | 2025.11.17 | |
| R*w | 10 | 2025.11.17 | Great agent work! |
| J*o | 1 | 2025.11.17 | Thanks for open source |
| *晨 | 8.88 | 2025.11.16 | Nice project |
| *海 | 1 | 2025.11.15 | |
| *德 | 1.99 | 2025.11.15 | |
| *疏 | 8.8 | 2025.11.14 | Great project |
| M*e | 10 | 2025.11.14 | Open source is not easy |
| **柯 | 1 | 2025.11.14 | |
| *云 | 88 | 2025.11.13 | Good project |
| *W | 6 | 2025.11.13 | |
| *凯 | 1 | 2025.11.13 | |
| 对*. | 1 | 2025.11.13 | Thanks for TrendRadar |
| s*y | 1 | 2025.11.13 | |
| **翔 | 10 | 2025.11.13 | Wish I found it earlier |
| *韦 | 9.9 | 2025.11.13 | TrendRadar is awesome |
| h*p | 5 | 2025.11.12 | Support Chinese open source |
| c*r | 6 | 2025.11.12 | |
| a*n | 5 | 2025.11.12 | |
| 。*c | 1 | 2025.11.12 | Thanks for sharing |
| ... | ... | ... | (More 50+ supporters) |
Sponsorship Open
Seeking quality product partners.
More than features, I value your attitude towards users.
Please share your user community or feedback channels—I want to see how you support your users.
📩 Contact Me
TrendRadar is a completely free and open-source project. Your support fuels the motivation for continuous updates.
A bottle of water or a snack represents your love. Any amount is welcome; even 1 RMB is a gesture of kindness.
Your sponsorship will be used to replenish caffeine for carbon-based lifeforms ☕️ and API Tokens for silicon-based lifeforms 🤖.
| WeChat Pay | Alipay |
|---|---|
If you utilize the core code or draw inspiration from the logic of this project, it would be greatly appreciated if you could acknowledge the source in your README or documentation and include a link to this repository.
This contributes to the sustainable maintenance of the project and the growth of the community. Thank you for your respect and support! ❤️
Friendly Reminder:
This project is for open-source sharing, not a commercial product. A lot of effort went into the documentation; most deployment issues can be answered in 🚀 Quick Start.
Please be patient and polite when asking questions. Treat the author as a friend, not customer service, for better communication efficiency!
| Follow on WeChat |
|---|
![]() |
📌 Check Latest Updates: Original Repository Changelog:
Major Refactor: AI Module Migration to LiteLLM
provider field, now using model: "provider/model_name" formatnum_retries), fallback models (fallback_models)ai.provider → Removed (merged into model)ai.base_url → ai.api_baseAI_PROVIDER environment variable → RemovedAI_BASE_URL environment variable → AI_API_BASEdeepseek/deepseek-chatopenai/gpt-4ogemini/gemini-2.5-flashanthropic/claude-3-5-sonnetSee config.yaml for details
🌐 AI Translation
🔧 Configuration Optimization
✨ AI Analysis Enhancement
🔧 Multi-Model Adaptation
🐛 Bug Fixes
{success, summary, data, error} structureasyncio.to_thread() for sync callsget_latest_rss supports multi-day queries (days param), cross-date URL deduplicationget_trending_topics supports /pattern/ regex syntax and display_namemake_cache_key() function with param sorting + MD5 hash for consistencyDev Anecdote: A salute to a certain 'C' model provider that accompanied me for over two years, only to slap me with
"This organization has been disabled"right after I renewed my subscription.
✨ "Five Major Sections" Content Refactoring
This update refactors the push message structure into five distinct core sections:
✨ AI Smart Analysis Push Feature
only_analysis (AI analysis only), both (push both)config/ai_analysis_prompt.txt/pattern/ regex syntax, solves English substring mismatch issues (e.g., ai matching training) 📖 View Syntax Details=> alias to give complex regex a friendly name, cleaner push notifications (e.g., /\bai\b/ => AI Related)get_latest_rss, search_rss, get_rss_feeds_statussearch_news supports include_rss parameter to search both trending and RSSkeyword (group by keyword) and platform (group by platform) display modesoutput/{type}/{date}.dbsort_by_position_first affects both trending and RSSconfig.yaml reorganized into 7 logical groups (app, report, notification, storage, platforms, rss, advanced) with clearer config pathsMCP Module Update - Optimized toolset, added aggregation & comparison features, merged redundant tools:
aggregate_news tool - Cross-platform news deduplication and aggregationcompare_periods tool - Period comparison analysis (week-over-week/month-over-month)find_similar_news + search_related_news_history → find_related_newsget_trending_topics - Added auto_extract mode for automatic trending extractionband_rank)MCP Module Update:
sync_from_remote: Pull data from remote storage to localget_storage_status: Get storage configuration and statuslist_available_dates: List available dates in local/remote storage🎉 Major Update: Comprehensive Refactoring of Storage and Core Architecture
🎉 Core Feature Enhancements
Multi-Account Push Support
; to separate multiple accounts, e.g., FEISHU_WEBHOOK_URL=url1;url2Configurable Push Content Order
reverse_content_order configuration optionGlobal Filter Keywords
[GLOBAL_FILTER] region marker for filtering unwanted content globally🐳 Docker Dual-Path HTML Generation Optimization
index.html could not sync to host in Docker environmentindex.html (project root): For GitHub Pages accessoutput/index.html: Accessible on host via Docker Volume mount🐳 Docker MCP Image Support
wantcat/trendradar-mcp🌐 Web Server Support
manage.py commands: docker exec -it trendradar python manage.py start_webserverhttp://localhost:8080 (port configurable)📖 Documentation Optimization
🔧 Upgrade Instructions:
main.py, config/config.yaml (Added multi-account push support, existing single-account configuration unaffected).env, docker-compose.yml or set environment variables REVERSE_CONTENT_ORDER, MAX_ACCOUNTS_PER_CHANNEL🔧 Format Optimization
Bark Push Enhancement
Slack Format Precision
<url|text> and bold syntax: *text*Performance Improvement
🔧 Upgrade Instructions:
main.py,config.yamlMCP Module Update:
🎉 Added Slack Push Support
Team Collaboration Push Channel
Multiple Deployment Methods
SLACK_WEBHOOK_URL SecretSLACK_WEBHOOK_URLconfig/config.yaml configuration file📖 Detailed Configuration Tutorial: Quick Start - Slack Push
🔧 Upgrade Instructions:
main.py, config/config.yaml, .github/workflows/crawler.yml🎉 Added Bark Push Support
iOS Exclusive Push Channel
Multiple Deployment Methods
BARK_URL SecretBARK_URLconfig/config.yaml configuration file📖 Detailed Configuration Tutorial: Quick Start - Bark Push
🐛 Bug Fix
ntfy_server_url in config.yaml was ignored (#345)🔧 Upgrade Instructions:
main.py, config/config.yaml, .github/workflows/crawler.yml🎯 New Advanced Customization Features
Keyword Sorting Priority Configuration
Display Count Precise Control
@number syntax to set specific limits📖 Detailed Tutorial: Keyword Configuration - Advanced Settings
🔧 Upgrade Instructions:
main.py, config/config.yaml'float' object has no attribute 'lower' error encountered by some users in GitHub Actions environmentUpgrade Instructions (GitHub Fork Users):
main.pyMCP Module Update:
markdown (WeWork group bot) and text (personal WeChat app)WEWORK_MSG_TYPE environment variable configuration, supporting GitHub Actions, Docker, docker compose and other deployment methodstext mode automatically strips Markdown syntax for clean plain text pushUpgrade Instructions (GitHub Fork Users):
main.py, config/config.yaml.github/workflows/crawler.yml (if using GitHub Actions)enable_crawler, report_mode, push_window, etc.) support override via environment variables, solving config file modification issues for NAS users (see 🐳 Docker Deployment chapter)MCP Module Update:
Major Update - AI Analysis Feature Launched ✨
Core Features:
Analysis Capabilities:
Update Note:
Updates:
Upgrade Note:
Thanks to nidaye996 for discovering the UX issue
Updates:
Upgrade Note:
Updates:
Upgrade Note:
Added ntfy Push Notification
Core Features:
Use Cases:
Upgrade Note:
Fix Description:
Usage Notes:
Upgrade Note:
Usage Notes:
Core Improvements:
Upgrade Note:
Fixed Issues:
Major Refactoring:
config/config.yaml file (main.py I still didn't split, convenient for you to copy and upgrade)daily (daily summary), current (current rankings), incremental (incremental monitoring)Config File Description:
config/config.yaml - Main config file (application settings, crawler config, notification config, platform config, etc.)config/frequency_words.txt - Keyword config (monitoring vocabulary settings)New Feature: Added incremental push (configure FOCUS_NEW_ONLY at top of main.py), this switch only cares about new topics not sustained heat, only sends notification when new content appears.
Fixed Issue: Under certain circumstances, some news containing special symbols caused occasional formatting exceptions.
WeWork and Telegram push messages have length limits, I adopted splitting messages for pushing. Development docs see WeWork and Telegram
Before this version, not only main.py needs copy replacement, crawler.yml also needs you to copy replacement https://github.com/sansan0/TrendRadar/blob/master/.github/workflows/crawler.yml
Thanks to Claude Research for organizing various platform APIs, helping me quickly complete platform adaptation (although code is more redundant~
200 stars⭐ reached, continue celebrating with everyone~
100 stars⭐ reached, writing small feature to celebrate
frequency_words.txt file added required word feature, using + sign
+Tang Monk +Pig
+Tang Monk !Tang Monk reciting sutras
Default monitoring of 11 mainstream platforms, with support for adding custom platforms.
💡 For detailed configuration, see Configuration Guide - Platform Configuration
Supports RSS/Atom feed crawling, keyword-based grouping and statistics (consistent with trending format):
config.yaml💡 RSS uses the same
frequency_words.txtfor keyword filtering as trending
Three Push Modes:
| Mode | Target Users | Push Feature |
|---|---|---|
| Daily Summary (daily) | Managers/Regular Users | Push all matched news of the day (includes previously pushed) |
| Current Rankings (current) | Content Creators | Push current ranking matches (continuously ranked news appear each time) |
| Incremental Monitor (incremental) | Traders/Investors | Push only new content, zero duplication |
💡 Quick Selection Guide:
- Don't want duplicate news → Use
incremental- Want complete ranking trends → Use
current- Need daily summary reports → Use
dailyFor detailed comparison and configuration, see Configuration Guide - Push Mode Details
Additional Features (Optional):
| Feature | Description | Default |
|---|---|---|
| Push Time Window Control | Set push time range (e.g., 09:00-18:00) to avoid non-work hours notifications | Disabled |
| Content Order Configuration | Adjust display order of "Trending Keywords Stats" and "New Trending News" (v3.5.0 new) | Stats first |
| Display Mode Switch | keyword=group by keyword, platform=group by platform (v4.6.0 new) | keyword |
💡 For detailed configuration, see Configuration Guide - Report Configuration and Configuration Guide - Push Window
Set personal keywords (e.g., AI, BYD, Education Policy) to receive only relevant trending news, filtering out noise.
💡 Basic Configuration: Keyword Configuration - Basic Syntax
💡 Advanced Configuration: Keyword Configuration - Advanced Settings
💡 You can also skip filtering and receive all trending news (leave frequency_words.txt empty)
Real-time tracking of news popularity changes helps you understand not just "what's trending" but "how trends evolve."
💡 Push format reference: Configuration Guide - Push Format Reference
No longer controlled by platform algorithms, TrendRadar reorganizes all trending searches
💡 Weight adjustment guide: Configuration Guide - Advanced Configuration
Supports WeWork (+ WeChat push solution), Feishu, DingTalk, Telegram, Email, ntfy, Bark, Slack — messages delivered directly to phone and email.
💡 For detailed configuration, see Configuration Guide - Multi-Account Push Configuration
Translate push content into any language, breaking language barriers — whether reading domestic trends or subscribing to international news via RSS, access everything in your native language
ai_translation.enabled: true and target language in config.yamlai_translation_prompt.txtai config section with AI analysis feature# config.yaml quick enable example
ai_translation:
enabled: true
language: "English" # Target translation language
💡 Translation shares model config with AI analysis — just configure
ai.api_keyonce to use both features
RSS Source References: Here are some RSS feed collections for your reference
⚠️ Some international media content may involve sensitive topics that AI models might refuse to translate. Please filter subscription sources based on your actual needs
Multi-Backend Support:
💡 For storage configuration details, see Configuration Details - Storage Configuration
Use AI models to deeply analyze push content, automatically generate trending insights report
config/ai_analysis_prompt.txt💡 Detailed configuration tutorial: Let AI help me analyze hot topics
Provide complete trending display for specified platforms, unaffected by keyword filtering
💡 Detailed configuration tutorial: Report Configuration - Independent Display
AI conversational analysis system based on MCP (Model Context Protocol), enabling deep data mining with natural language.
💡 Usage Tip: AI features require local news data support
- Project includes test data for immediate feature experience
- Recommend deploying the project yourself to get more real-time data
See AI Analysis for details
After running, the index.html generated in the root directory is the complete news report page.
Deployment: Click Use this template to create your repository, then deploy to Cloudflare Pages or GitHub Pages.
💡 Tip: Enable GitHub Pages for an online URL. Go to Settings → Pages to enable. Preview Effect
⚠️ The GitHub Actions auto-storage feature has been discontinued (this approach caused excessive load on GitHub servers, affecting platform stability).
Transform from "algorithm recommendation captivity" to "actively getting the information you want"
Target Users: Investors, content creators, PR professionals, news-conscious general users
Typical Scenarios: Stock investment monitoring, brand sentiment tracking, industry trend watching, lifestyle news gathering
| Web Effect (Email Push) | Feishu Push Effect | AI Analysis Push Effect |
|---|---|---|
![]() | ![]() | ![]() |
Reminder: You should first check the latest official documentation to ensure the configuration steps are up to date.
👉 Jump to Docker Deployment Tutorial
Click the green [Use this template] button in the upper right corner of this repository → select "Create a new repository".
⚠️ Note:
- Any mention of "Fork" in this document can be understood as "Use this template"
- Using Fork may cause runtime issues, see Issue #606
In your Forked repository, go to Settings > Secrets and variables > Actions > New repository secret
📌 Important Instructions (Please Read Carefully):
WEWORK_WEBHOOK_URL, FEISHU_WEBHOOK_URL, etc.). Do not modify or create new names arbitrarily, or the system will not recognize themConfiguration Example:
As shown above, each row is a configuration item:
WEWORK_WEBHOOK_URL)GitHub Secret Configuration (⚠️ Name must match exactly):
WEWORK_WEBHOOK_URL (Please copy and paste this name, do not type manually to avoid typos)Bot Setup Steps:
This solution is based on WeWork's plugin mechanism. The push style is plain text (no markdown format), but it can push directly to personal WeChat without installing WeWork App.
GitHub Secret Configuration (⚠️ Name must match exactly):
Name: WEWORK_WEBHOOK_URL (Please copy and paste this name, do not type manually)
Secret (Value): Your WeWork app Webhook address
Name: WEWORK_MSG_TYPE (Please copy and paste this name, do not type manually)
Secret (Value): text
Setup Steps:
WEWORK_MSG_TYPE Secret with value text
Notes:
text for plain text, markdown for rich text (default)Note: If AI Analysis is enabled, Feishu push notifications may occasionally (approx. 5% probability) experience a few minutes of delay. This is likely due to the platform's internal compliance auditing for AI-generated content.
GitHub Secret Configuration (⚠️ Name must match exactly):
FEISHU_WEBHOOK_URL (Please copy and paste this name, do not type manually)Two methods available, Method 1 is simpler, Method 2 is more complex (but stable push)
Method 1 discovered and suggested by ziventian, thanks to them. Default is personal push, group push can be configured via #97
Method 1:
For some users, additional operations needed to avoid "System Error". Need to search for the bot on mobile and enable Feishu bot application (suggestion from community, can refer)
Open in PC browser https://botbuilder.feishu.cn/home/my-command
Click "New Bot Command"
Click "Select Trigger", scroll down, click "Webhook Trigger"
Now you'll see "Webhook Address", copy this link to local notepad temporarily, continue with next steps
In "Parameters" put the following content, then click "Done"
{
"message_type": "text",
"content": {
"text": "{{Content}}"
}
}
Click "Select Action" > "Send via Official Bot"
Message title fill "TrendRadar Trending Monitor"
Most critical part, click + button, select "Webhook Trigger", then arrange as shown in image

FEISHU_WEBHOOK_URLMethod 2:
Open in PC browser https://botbuilder.feishu.cn/home/my-app
Click "New Bot Application"
After entering the created application, click "Process Design" > "Create Process" > "Select Trigger"
Scroll down, click "Webhook Trigger"
Now you'll see "Webhook Address", copy this link to local notepad temporarily, continue with next steps
In "Parameters" put the following content, then click "Done"
{
"message_type": "text",
"content": {
"text": "{{Content}}"
}
}
Click "Select Action" > "Send Feishu Message", check "Group Message", then click the input box below, click "Groups I Manage" (if no group, you can create one in Feishu app)
Message title fill "TrendRadar Trending Monitor"
Most critical part, click + button, select "Webhook Trigger", then arrange as shown in image

FEISHU_WEBHOOK_URLGitHub Secret Configuration (⚠️ Name must match exactly):
DINGTALK_WEBHOOK_URL (Please copy and paste this name, do not type manually)Bot Setup Steps:
Create Bot (PC Only):
Configure Bot:
Complete Setup:
DINGTALK_WEBHOOK_URLNote: Mobile can only receive messages, cannot create new bots.
GitHub Secret Configuration (⚠️ Name must match exactly):
Name: TELEGRAM_BOT_TOKEN (Please copy and paste this name, do not type manually)
Secret (Value): Your Telegram Bot Token
Name: TELEGRAM_CHAT_ID (Please copy and paste this name, do not type manually)
Secret (Value): Your Telegram Chat ID
Note: Telegram requires two Secrets, please click "New repository secret" button twice to add them separately
Bot Setup Steps:
Create Bot:
@BotFather in Telegram (note case, has blue verification checkmark, shows ~37849827 monthly users, this is official, beware of fake accounts)/newbot command to create new bot123456789:AAHfiqksKZ8WmR2zSjiQ7_v4TMAKdiHm9T0)Get Chat ID:
Method 1: Via Official API
https://api.telegram.org/bot<Your Bot Token>/getUpdates"chat":{"id":number} in returned JSONMethod 2: Using Third-Party Tool
@userinfobot and send /startConfigure to GitHub:
TELEGRAM_BOT_TOKEN: Fill in Bot Token from step 1TELEGRAM_CHAT_ID: Fill in Chat ID from step 2⚠️ Important Configuration Dependency: Email push requires HTML report file. Make sure
storage.formats.htmlis set totrueinconfig/config.yaml:storage: formats: sqlite: true txt: false html: true # Must be enabled, otherwise email push will failIf set to
false, email push will report error:Error: HTML file does not exist or not provided: None
GitHub Secret Configuration (⚠️ Name must match exactly):
Name: EMAIL_FROM (Please copy and paste this name, do not type manually)
Secret (Value): Sender email address
Name: EMAIL_PASSWORD (Please copy and paste this name, do not type manually)
Secret (Value): Email password or authorization code
Name: EMAIL_TO (Please copy and paste this name, do not type manually)
Secret (Value): Recipient email address (multiple separated by comma, or can be same as EMAIL_FROM to send to yourself)
Name: EMAIL_SMTP_SERVER (Optional, please copy and paste this name)
Secret (Value): SMTP server address (leave empty for auto-detection)
Name: EMAIL_SMTP_PORT (Optional, please copy and paste this name)
Secret (Value): SMTP port (leave empty for auto-detection)
Note: Email push requires at least 3 required Secrets (EMAIL_FROM, EMAIL_PASSWORD, EMAIL_TO), the last two are optional
Supported Email Providers (Auto-detect SMTP config):
| Provider | Domain | SMTP Server | Port | Encryption |
|---|---|---|---|---|
| Gmail | gmail.com | smtp.gmail.com | 587 | TLS |
| QQ Mail | qq.com | smtp.qq.com | 465 | SSL |
| Outlook | outlook.com | smtp-mail.outlook.com | 587 | TLS |
| Hotmail | hotmail.com | smtp-mail.outlook.com | 587 | TLS |
| Live | live.com | smtp-mail.outlook.com | 587 | TLS |
| 163 Mail | 163.com | smtp.163.com | 465 | SSL |
| 126 Mail | 126.com | smtp.126.com | 465 | SSL |
| Sina Mail | sina.com | smtp.sina.com | 465 | SSL |
| Sohu Mail | sohu.com | smtp.sohu.com | 465 | SSL |
| 189 Mail | 189.cn | smtp.189.cn | 465 | SSL |
| Aliyun Mail | aliyun.com | smtp.aliyun.com | 465 | TLS |
| Yandex Mail | yandex.com | smtp.yandex.com | 465 | TLS |
| iCloud Mail | icloud.com | smtp.mail.me.com | 587 | SSL |
Auto-detect: When using above emails, no need to manually configure
EMAIL_SMTP_SERVERandEMAIL_SMTP_PORT, system auto-detects.Feedback Notice:
- If you successfully test with other email providers, please open an Issue to let us know, we'll add to support list
- If above email configurations are incorrect or unusable, please also open an Issue for feedback to help improve the project
Special Thanks:
- Thanks to @DYZYD for contributing 189 Mail (189.cn) configuration and completing self-send-receive testing (#291)
- Thanks to @longzhenren for contributing Aliyun Mail (aliyun.com) configuration and completing testing (#344)
- Thanks to @ACANX for contributing Yandex Mail (yandex.com) configuration and completing testing (#663)
- Thanks to @Sleepy-Tianhao for contributing iCloud Mail (icloud.com) configuration and completing testing (#728)
Common Email Settings:
EMAIL_PASSWORD fill authorization code, not QQ passwordEMAIL_PASSWORD fill app-specific passwordEMAIL_PASSWORD fill authorization code
Advanced Configuration: If auto-detect fails, manually configure SMTP:
EMAIL_SMTP_SERVER: Like smtp.gmail.comEMAIL_SMTP_PORT: Like 587 (TLS) or 465 (SSL)
Multiple Recipients (note: English comma separator):
Two Usage Methods:
Features:
Quick Start:
Download ntfy App:
Subscribe to Topic (choose a hard-to-guess name):
Suggested format: trendradar-{your initials}-{random numbers} Cannot use Chinese ✅ Good example: trendradar-zs-8492 ❌ Bad example: news, alerts (too easy to guess)
Configure GitHub Secret (⚠️ Name must match exactly):
Name: NTFY_TOPIC (Please copy and paste this name, do not type manually)
Secret (Value): Fill in your subscribed topic name
Name: NTFY_SERVER_URL (Optional, please copy and paste this name)
Secret (Value): Leave empty (default uses ntfy.sh)
Name: NTFY_TOKEN (Optional, please copy and paste this name)
Secret (Value): Leave empty
Note: ntfy requires at least 1 required Secret (NTFY_TOPIC), the last two are optional
Test:
curl -d "Test message" ntfy.sh/your-topic-name
Target Users: Have server, pursue complete privacy, strong technical ability
Advantages:
Docker One-Click Deploy:
docker run -d \ --name ntfy \ -p 80:80 \ -v /var/cache/ntfy:/var/cache/ntfy \ binwiederhier/ntfy \ serve --cache-file /var/cache/ntfy/cache.db
Configure TrendRadar:
NTFY_SERVER_URL: https://ntfy.yourdomain.com
NTFY_TOPIC: trendradar-alerts # Self-hosting can use simple name
NTFY_TOKEN: tk_your_token # Optional: Enable access control
Subscribe in App:
FAQ:
250 messages/day is enough for most users. With 30-minute crawl intervals, about 48 pushes/day, completely sufficient.
If you choose a random, sufficiently long name (like trendradar-zs-8492-news), brute force is nearly impossible:
Recommended Choice:
| User Type | Recommended | Reason |
|---|---|---|
| Regular Users | Method 1 (Free) | Simple, fast, enough |
| Technical Users | Method 2 (Self-Host) | Complete control, unlimited |
| High-Frequency Users | Method 3 (Paid) | Check official website |
Related Links:
GitHub Secret Configuration (⚠️ Name must be exact):
BARK_URL (copy and paste this name, don't type manually)Bark Introduction:
Bark is a free open-source push tool for iOS platform, featuring simplicity, speed, and no ads.
Usage Methods:
Download Bark App:
Get Push URL:
https://api.day.app/your_device_key)BARK_URLSuitable for: Users with servers, pursuing complete privacy, strong technical skills
Docker One-Click Deployment:
docker run -d \ --name bark-server \ -p 8080:8080 \ finab/bark-server
Configure TrendRadar:
BARK_URL: http://your-server-ip:8080/your_device_key
Notes:
Related Links:
GitHub Secret Configuration (⚠️ Name must be exact):
SLACK_WEBHOOK_URL (copy and paste this name, don't type manually)Slack Introduction:
Slack is a team collaboration tool, Incoming Webhooks can push messages to Slack channels.
Setup Steps:
Visit Slack API Page:
Choose Creation Method:
Fill in App Information:
TrendRadar or Hot News Monitor)Navigate to Incoming Webhooks:
Enable Feature:
OFF to ONAdd New Webhook:
Select Target Channel:
#hot-news)Authorize App:
View Generated URL:
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXXCopy URL:
Configure to TrendRadar:
SLACK_WEBHOOK_URLconfig/config.yaml slack_webhook_url fielddocker/.env file as SLACK_WEBHOOK_URL variableNotes:
Message Format Preview:
*[Batch 1/2]* 📊 *Trending Topics Statistics* 🔥 *[1/3] AI ChatGPT* : 2 articles 1. [Baidu Hot] 🆕 ChatGPT-5 Official Release *[1]* - 09:15 (1 time) 2. [Toutiao] AI Chip Stocks Surge *[3]* - [08:30 ~ 10:45] (3 times)
Related Links:
GitHub Secret Configuration (⚠️ Name must be exact):
Name: GENERIC_WEBHOOK_URL (copy and paste this name, don't type manually)
Secret: Your Webhook URL
Name: GENERIC_WEBHOOK_TEMPLATE (optional, copy and paste this name)
Secret: JSON template string, supports {title} and {content} placeholders
Generic Webhook Introduction:
Generic Webhook supports any platform that accepts HTTP POST requests, including but not limited to:
Configuration Examples:
Get Webhook URL:
Configure Template:
{"content": "{content}"}
GitHub Secret Configuration:
GENERIC_WEBHOOK_URL: Discord Webhook URLGENERIC_WEBHOOK_TEMPLATE: {"content": "{content}"}Templates support two placeholders:
{title} - Message title{content} - Message contentTemplate Examples:
# Default format (used when empty)
{"title": "{title}", "content": "{content}"}
# Discord format
{"content": "{content}"}
# Custom format
{"text": "{content}", "username": "TrendRadar"}
Notes:
; separator)⚠️ Note:
- For first deployment, suggest completing GitHub Secrets configuration first (choose one push platform), then jump to [Step 3] to test push success.
- Don't modify
config/config.yamlandfrequency_words.txttemporarily, adjust these configs after push test succeeds as needed.
⚠️ Reminder:
- Complete Step 1-2 first, then test immediately! Test success first, then adjust configuration (Step 4) as needed.
- IMPORTANT: Enter your own forked project, not this project!
How to find your Actions page:
https://github.com/YourUsername/TrendRadar/actionsExample comparison:
https://github.com/sansan0/TrendRadar/actionshttps://github.com/YourUsername/TrendRadar/actionsTesting steps:
⚠️ Note:
- Don't test too frequently to avoid triggering GitHub Actions limits
- After clicking Run workflow, you need to refresh the browser page to see the new run record
The default configuration is ready to use. If you need personalized adjustments, just understand the following files:
| File | Purpose |
|---|---|
config/config.yaml | Main config file: push mode, time window, platform list, hotspot weights, etc. |
config/frequency_words.txt | Keyword file: set your interested keywords, filter push content |
.github/workflows/crawler.yml | Execution frequency: control how often to run (⚠️ modify carefully) |
👉 Detailed Configuration Tutorial: Configuration Guide
v4.0.0 Important Change: Introduced the "Activity Detection" mechanism; GitHub Actions need periodic check-ins to maintain operation.
Actions → Check In → Run workflowYou can also choose NOT to configure remote cloud storage, but then you will be in Lite Mode with some advanced features unavailable.
Two Deployment Modes Comparison:
| Mode | Configuration Required | Features |
|---|---|---|
| Lite Mode | No storage configuration needed | Real-time crawling + Keyword filtering + Multi-channel push |
| Full Mode | Configure remote cloud storage | Lite Mode + New detection + Trend tracking + Incremental push + AI analysis |
Lite Mode Description:
Full Mode Description: Configure remote cloud storage to unlock all features. Continue with the configuration below.
⚠️ Prerequisites for Cloudflare R2 Configuration:
According to Cloudflare platform rules, enabling R2 requires binding a payment method.
GitHub Secret Configuration:
Required Configuration (4 items):
| Name | Secret (Value) Description |
|---|---|
S3_BUCKET_NAME | Bucket name (e.g., trendradar-data) |
S3_ACCESS_KEY_ID | Access key ID |
S3_SECRET_ACCESS_KEY | Access key |
S3_ENDPOINT_URL | S3 API endpoint (e.g., R2: https://<account-id>.r2.cloudflarestorage.com) |
Optional Configuration:
| Name | Secret (Value) Description |
|---|---|
S3_REGION | Region (default auto, some providers may require specification) |
💡 More storage configuration options: See Storage Configuration Details
How to Get Credentials (Using Cloudflare R2 as Example):
R2 in left menu → Click Create Bucket → Enter name (e.g., trendradar-data)Manage R2 API Tokens at top right → Create API TokenObject Read & Write permission → After creation, it will display Access Key ID and Secret Access Keyhttps://<account-id>.r2.cloudflarestorage.com)This is a core feature of v5.0.0, letting AI summarize and analyze news for you. Highly recommended.
Configuration Method:
Add the following to GitHub Secrets (or .env / config.yaml):
AI_API_KEY: Your API Key (Supports DeepSeek, OpenAI, etc.)AI_PROVIDER: Provider name (e.g., deepseek, openai)That's it! No complex deployment needed. You'll see the smart analysis report in the next push.
Congratulations! Now you can start enjoying the efficient information flow brought by TrendRadar.
💬 Many users are sharing their experiences on the official account, we look forward to your insights~
👉 Follow the WeChat Official Account「Silicon Tea Room」, your likes and comments are the motivation for continuous updates.
TrendRadar provides two ways to use AI to meet different needs:
| Feature | ✨ AI Analysis Push (Step 6) | 🧠 AI Smart Analysis |
|---|---|---|
| Mode | Passive Receipt (Daily Report) | Active Conversation (Deep Research) |
| Scenario | "What's big today?" | "Analyze AI industry changes over the past week" |
| Deployment | Minimalist (Just add Key) | Advanced (Requires Local/Docker) |
| Client | Mobile | PC |
👉 Conclusion: Start with AI Analysis Push for daily needs; if you are a data analyst or need deep mining, try MCP Smart Analysis.
📖 Reminder: This chapter provides detailed configuration explanations. Suggest completing Quick Start basic configuration first, then refer to detailed options here as needed.
Configuration Location: platforms section in config/config.yaml
This project's news data comes from newsnow. You can click the website, click [More], to see if there are platforms you want.
For specific additions, visit project source code, based on the file names there, modify the platforms configuration in config/config.yaml file:
platforms:
enabled: true # Enable trending platform crawling
sources:
- id: "toutiao"
name: "Toutiao"
- id: "baidu"
name: "Baidu Hot Search"
- id: "wallstreetcn-hot"
name: "Wallstreetcn"
# Add more platforms...
💡 Shortcut: If you don't know how to read source code, you can copy from others' organized Platform Configuration Summary
⚠️ Note: More platforms is not always better, suggest choosing 10-15 core platforms. Too many platforms will cause information overload and actually reduce user experience.
Configuration Location: config/frequency_words.txt
Configure monitoring keywords in frequency_words.txt with seven syntax types, region markers, and grouping features.
| Syntax Type | Symbol | Purpose | Example | Matching Logic |
|---|---|---|---|---|
| Normal | None | Basic matching | Huawei | Match any one |
| Required | + | Scope limiting | +phone | Must include both |
| Filter | ! | Noise exclusion | !ad | Exclude if included |
| Count Limit | @ | Control display count | @10 | Max 10 news (v3.2.0 new) |
| Global Filter | [GLOBAL_FILTER] | Globally exclude content | See example below | Filter under any circumstances (v3.5.0 new) |
| Regex | /pattern/ | Precise matching | /\bai\b/ | Match using regex (v4.7.0 new) |
| Display Name | => alias | Custom display text | /\bai\b/ => AI Related | Show alias in push/HTML (v4.7.0 new) |
Huawei OPPO Apple
Effect: News containing any one of these words will be captured
Huawei OPPO +phone
Effect: Must include both normal word and required word to be captured
Apple Huawei !fruit !price
Effect: News containing filter words will be excluded, even if it contains keywords
Tesla Musk @5
Effect: Limit maximum news count for this keyword group
Priority: @number > Global config > Unlimited
[GLOBAL_FILTER] advertisement promotion marketing shocking clickbait [WORD_GROUPS] technology AI Huawei HarmonyOS !car
Effect: Filters news containing specified words under any circumstances, with highest priority
Use Cases:
Filter Priority: Global Filter > Group Filter(!) > Group Matching
Region Markers:
[GLOBAL_FILTER]: Global filter region, words are filtered under any circumstances[WORD_GROUPS]: Keyword groups region, maintains existing syntax (!, +, @)Matching Examples:
[GLOBAL_FILTER] advertisement [WORD_GROUPS] technology AI
Important Notes:
! prefix)Normal keywords use substring matching, which is convenient for Chinese but may cause false matches in English. For example, ai would match the ai in training.
Use regex syntax /pattern/ to achieve precise matching:
/(?<![a-z])ai(?![a-z])/ artificial intelligence
Effect: Match using regular expressions, supports all Python regex syntax
Common Regex Patterns:
| Need | Regex | Description |
|---|---|---|
| Word boundary | /\bword\b/ | Match standalone word, e.g., /\bai\b/ matches "AI" but not "training" |
| Non-letter boundary | /(?<![a-z])ai(?![a-z])/ | Looser boundary, suitable for mixed Chinese-English |
| Start match | /^breaking/ | Only match titles starting with "breaking" |
| End match | /release$/ | Only match titles ending with "release" |
| Multiple options | /apple|huawei|xiaomi/ | Match any one (note escaped |) |
Matching Examples:
# Config /(?<![a-z])ai(?![a-z])/ artificial intelligence
Combined Usage:
# Regex + Normal + Filter /\bai\b/ artificial intelligence machine learning !advertisement
Notes:
re.IGNORECASE)/pattern/i syntax (flags are ignored since case-insensitive is always enabled)+), and filter words(!)💡 Can't Write Regex? Let AI Help!
If you're not familiar with regular expressions, just ask ChatGPT / Gemini / DeepSeek to generate one:
I need a Python regex to match the word "ai" but not match "ai" in "training". Please give me the regex in
/pattern/format without extra explanation.
AI will give you something like: /(?<![a-zA-Z])ai(?![a-zA-Z])/
Regex patterns can look unfriendly in push notifications and HTML pages. Use => alias syntax to set a display name:
/(?<![a-zA-Z])ai(?![a-zA-Z])/ => AI Related artificial intelligence
Effect: Push notifications and HTML pages show "AI Related" instead of the complex regex
Syntax Format:
# Regex + Display Name /pattern/ => Display Name /pattern/i => Display Name # Supports flags syntax (flags are ignored) /pattern/=>Display Name # Spaces around => are optional # Normal Word + Display Name deepseek => DeepSeek News
Example:
# Config /(?<![a-zA-Z])ai(?![a-zA-Z])/ => AI Related artificial intelligence
| Original Config | Push/HTML Display |
|---|---|
/(?<![a-z])ai(?![a-z])/ + artificial intelligence | (?<![a-z])ai(?![a-z]) artificial intelligence |
/(?<![a-z])ai(?![a-z])/ => AI Related + artificial intelligence | AI Related |
Notes:
Core Rule: Use empty lines to separate different groups, each group is independently counted
iPhone Huawei OPPO +launch A-shares Shanghai Index Shenzhen Index +fluctuation !prediction World Cup Euro Cup Asian Cup +match
Group 1 - Phone Launches:
Matching Examples:
Group 2 - Stock Market:
Matching Examples:
Group 3 - Football Events:
Matching Examples:
# Step 1: Start with broad keywords for testing Artificial Intelligence AI ChatGPT # Step 2: After finding mismatches, add required words Artificial Intelligence AI ChatGPT +technology # Step 3: After finding noise, add filter words Artificial Intelligence AI ChatGPT +technology !advertisement !training
❌ Not Recommended: Too many words in one group
Huawei OPPO Apple Samsung vivo OnePlus Meizu +phone +launch +sales !fake !repair !second-hand
Recommended: Split into precise groups
Huawei OPPO +new product Apple Samsung +launch phone sales +market
Config Location: config/config.yaml
report:
sort_by_position_first: false # Sorting priority config
| Value | Sorting Rule | Use Case |
|---|---|---|
false (default) | News count ↓ → Config position ↑ | Focus on popularity trends |
true | Config position ↑ → News count ↓ | Focus on personal priority |
Example: Config order A, B, C, news count A(3), B(10), C(5)
false: B(10) → C(5) → A(3)true: A(3) → B(10) → C(5)report:
max_news_per_keyword: 10 # Max 10 per keyword (0=unlimited)
Docker Environment Variables:
SORT_BY_POSITION_FIRST=true
MAX_NEWS_PER_KEYWORD=10
Combined Example:
# config.yaml
report:
sort_by_position_first: true # Config order priority
max_news_per_keyword: 10 # Global default max 10 per keyword
# frequency_words.txt Tesla Musk @20 # Key focus, show 20 (override global) Huawei # Use global config, show 10 BYD @5 # Limit to 5
Final Effect: Display in config order: Tesla(20) → Huawei(10) → BYD(5)
Configuration Location: report.mode in config/config.yaml
report:
mode: "daily" # Options: "daily" | "incremental" | "current"
| Mode | Target Users | Push Timing | Display Content | Typical Use Case |
|---|---|---|---|---|
Daily Summarydaily | 📋 Managers/Regular Users | Scheduled push (default hourly) | All matched news of the day + New news section | Example: Check all important news of the day at 6 PM Feature: See full-day trend, don't miss any hot topic Note: Will include previously pushed news |
Current Rankingscurrent | 📰 Content Creators | Scheduled push (default hourly) | Current ranking matches + New news section | Example: Track "which topics are hottest now" hourly Feature: Real-time understanding of current popularity ranking changes Note: Continuously ranked news appear each time |
Incremental Monitorincremental | 📈 Traders/Investors | Push only when new | Newly appeared frequency word matches | Example: Monitor "Tesla", only notify when new news appears Feature: Zero duplication, only see first-time news Suitable for: High-frequency monitoring, avoid information disturbance |
Assume you monitor "Apple" keyword, execute once per hour:
| Time | daily Mode Push | current Mode Push | incremental Mode Push |
|---|---|---|---|
| 10:00 | News A, News B | News A, News B | News A, News B |
| 11:00 | News A, News B, News C | News B, News C, News D | Only News C |
| 12:00 | News A, News B, News C | News C, News D, News E | Only News D, News E |
Explanation:
daily: Cumulative display of all news of the day (A, B, C all retained)current: Display current ranking news (ranking changed, News D on list, News A off list)incremental: Only push newly appeared news (avoid duplicate disturbance)💡 Encountered this problem? 👉 "Execute once per hour, news output in first execution still appears in next hour execution"
- Reason: You might have selected
daily(Daily Summary) orcurrent(Current Rankings) mode- Solution: Change to
incremental(Incremental Monitor) mode, only push new content
Users who selected
incremental(Incremental Monitor) mode, please note:📌 Incremental mode only pushes when there are new matching news
If you haven't received push notifications for a long time, it may be because:
- No new hot topics matching your keywords in current time period
- Keyword configuration is too strict or too broad
- Too few monitoring platforms
Solutions:
- Solution 1: 👉 Optimize Keyword Configuration - Adjust keyword precision, add or modify monitoring keywords
- Solution 2: Switch push mode - Change to
currentordailymode for scheduled push notifications- Solution 3: 👉 Add More Platforms - Add more news platforms to expand information sources
Configuration Location: advanced.weight section in config/config.yaml
advanced:
weight:
rank: 0.6 # Ranking weight
frequency: 0.3 # Frequency weight
hotness: 0.1 # Hotness weight
Current default configuration is balanced.
Real-Time Trending Type:
advanced:
weight:
rank: 0.8 # Mainly focus on ranking
frequency: 0.1 # Less concern about continuity
hotness: 0.1
Target Users: Content creators, marketers, users wanting to quickly understand current hot topics
In-Depth Topic Type:
advanced:
weight:
rank: 0.4 # Moderate ranking focus
frequency: 0.5 # Emphasize sustained heat within the day
hotness: 0.1
Target Users: Investors, researchers, journalists, users needing deep trend analysis
rank for rankings, frequency for continuityCore idea: Users pursuing speed and timeliness increase ranking weight, users pursuing depth and stability increase frequency weight.
📊 Trending Keywords Stats
🔥 [1/3] AI ChatGPT : 2 items
[Baidu Hot] 🆕 ChatGPT-5 officially launched [1] - 09:15 (1 time)
[Toutiao] AI chip concept stocks surge [3] - [08:30 ~ 10:45] (3 times)
━━━━━━━━━━━━━━━━━━━
📈 [2/3] BYD Tesla : 2 items
[Weibo] 🆕 BYD monthly sales break record [2] - 10:20 (1 time)
[Douyin] Tesla price reduction promotion [4] - [07:45 ~ 09:15] (2 times)
━━━━━━━━━━━━━━━━━━━
📌 [3/3] A-shares Stock Market : 1 item
🆕 New Trending News (Total 2 items)
Baidu Hot (1 item):
Weibo (1 item):
Updated: 2025-01-15 12:30:15
| Format Element | Example | Meaning | Description |
|---|---|---|---|
| 🔥📈📌 | 🔥 [1/3] AI ChatGPT | Popularity Level | 🔥 High (≥10) 📈 Medium (5-9) 📌 Normal (<5) |
| [Number/Total] | [1/3] | Rank Position | Current group rank among all matches |
| Keyword Group | AI ChatGPT | Keyword Group | Group from config, title must contain words |
| : N items | : 2 items | Match Count | Total news matching this group |
| [Platform] | [Baidu Hot] | Source Platform | Platform name of the news |
| 🆕 | 🆕 ChatGPT-5 officially launched | New Mark | First appearance in this round |
| [number] | [1] | High Rank | Rank ≤ threshold, bold red display |
| [number] | [7] | Normal Rank | Rank > threshold, normal display |
| - time | - 09:15 | First Time | Time when news was first discovered |
| [time~time] | [08:30 ~ 10:45] | Duration | Time range from first to last appearance |
| (N times) | (3 times) | Frequency | Total appearances during monitoring |
| New Section | 🆕 New Trending News | New Topic Summary | Separately shows newly appeared topics |
Image Description:
TrendRadar provides two independent Docker images, deploy according to your needs:
| Image Name | Purpose | Description |
|---|---|---|
wantcat/trendradar | News Push Service | Scheduled news crawling, push notifications (Required) |
wantcat/trendradar-mcp | AI Analysis Service | MCP protocol support, AI dialogue analysis (Optional) |
💡 Recommendations:
- Only need push functionality: Deploy
wantcat/trendradarimage only- Need AI analysis: Deploy both images
Create Project Directory and Config:
Method 1-A: Using git clone (Recommended, Simplest)
# Clone project to local
git clone https://github.com/sansan0/TrendRadar.git
cd TrendRadar
Method 1-B: Using wget to download config files
# Create directory structure
mkdir -p trendradar/{config,docker}
cd trendradar
# Download config file templates
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/config.yaml -P config/
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/frequency_words.txt -P config/
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/ai_analysis_prompt.txt -P config/
# Download docker compose config
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/docker/.env -P docker/
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/docker/docker-compose.yml -P docker/
💡 Note: Key directory structure required for Docker deployment:
current directory/ ├── config/ │ ├── config.yaml │ ├── frequency_words.txt │ └── ai_analysis_prompt.txt # AI analysis prompt (v5.0.0 new, optional) └── docker/ ├── .env └── docker-compose.yml
Config File Description:
config/config.yaml - Application main config (report mode, push settings, AI analysis, etc.)config/frequency_words.txt - Keyword config (set your interested trending keywords)config/ai_analysis_prompt.txt - AI prompt config (customize AI analysis role and output format, v5.0.0 new).env - Environment variable config (webhook URLs, API Keys, scheduled tasks)⚙️ Environment Variable Override Mechanism (v3.0.5+)
If you encounter config.yaml modifications not taking effect in NAS or other Docker environments, you can directly override configs via environment variables:
| Environment Variable | Corresponding Config | Example Value | Description |
|---|---|---|---|
ENABLE_WEBSERVER | - | true / false | Auto-start web server |
WEBSERVER_PORT | - | 8080 | Web server port |
FEISHU_WEBHOOK_URL | notification.channels.feishu.webhook_url | https://... | Feishu Webhook (multi-account use ; separator) |
AI_ANALYSIS_ENABLED | ai_analysis.enabled | true / false | Enable AI analysis (v5.0.0 new) |
AI_API_KEY | ai.api_key | sk-xxx... | AI API Key (shared by ai_analysis and ai_translation) |
AI_PROVIDER | ai.provider | deepseek / openai / gemini | AI provider (v5.0.0 new) |
S3_* | storage.remote.* | - | Remote storage config (5 params) |
Config Priority: Environment Variables > config.yaml
Usage Method:
.env file, uncomment and fill in needed configsdocker compose up -dStart Service:
Option A: Start All Services (Push + AI Analysis)
# Pull latest images
docker compose pull
# Start all services (trendradar + trendradar-mcp)
docker compose up -d
Option B: Start News Push Service Only
# Start trendradar only (scheduled crawling and push)
docker compose pull trendradar
docker compose up -d trendradar
Option C: Start MCP AI Analysis Service Only
# Start trendradar-mcp only (AI analysis interface)
docker compose pull trendradar-mcp
docker compose up -d trendradar-mcp
💡 Tips:
- Most users only need to start
trendradarfor news push functionality- Only need to start
trendradar-mcpwhen using ChatGPT/Gemini for AI dialogue analysis- Both services are independent and can be flexibly combined
Check Running Status:
# View news push service logs
docker logs -f trendradar
# View MCP AI analysis service logs
docker logs -f trendradar-mcp
# View all container status
docker ps | grep trendradar
# Stop specific service
docker compose stop trendradar # Stop push service
docker compose stop trendradar-mcp # Stop MCP service
If you need custom code modifications or build your own image:
# Clone project
git clone https://github.com/sansan0/TrendRadar.git
cd TrendRadar
# Modify config files
vim config/config.yaml
vim config/frequency_words.txt
# Use build version docker compose
cd docker
cp docker-compose-build.yml docker-compose.yml
Build and Start Services:
# Option A: Build and start all services
docker compose build
docker compose up -d
# Option B: Build and start news push service only
docker compose build trendradar
docker compose up -d trendradar
# Option C: Build and start MCP AI analysis service only
docker compose build trendradar-mcp
docker compose up -d trendradar-mcp
💡 Architecture Parameter Notes:
- Default builds
amd64architecture images (suitable for most x86_64 servers)- To build
arm64architecture (Apple Silicon, Raspberry Pi, etc.), set environment variable:export DOCKER_ARCH=arm64 docker compose build
# Method 1: Manual update (Crawler + MCP images)
docker pull wantcat/trendradar:latest
docker pull wantcat/trendradar-mcp:latest
docker compose down
docker compose up -d
# Method 2: Using docker compose update
docker compose pull
docker compose up -d
Available Images:
| Image Name | Purpose | Description |
|---|---|---|
wantcat/trendradar | News Push Service | Scheduled news crawling, push notifications |
wantcat/trendradar-mcp | MCP Service | AI analysis features (optional) |
# View running status
docker exec -it trendradar python manage.py status
# Manually execute crawler once
docker exec -it trendradar python manage.py run
# View real-time logs
docker exec -it trendradar python manage.py logs
# Display current config
docker exec -it trendradar python manage.py config
# Display output files
docker exec -it trendradar python manage.py files
# Web server management (for browser access to generated reports)
docker exec -it trendradar python manage.py start_webserver # Start web server
docker exec -it trendradar python manage.py stop_webserver # Stop web server
docker exec -it trendradar python manage.py webserver_status # Check web server status
# View help info
docker exec -it trendradar python manage.py help
# Restart container
docker restart trendradar
# Stop container
docker stop trendradar
# Remove container (keep data)
docker rm trendradar
💡 Web Server Notes:
- After starting, access latest report at
http://localhost:8080- Access historical reports via directory navigation (e.g.,
http://localhost:8080/2025-xx-xx/)- Port can be configured in
.envfile withWEBSERVER_PORTparameter- Auto-start: Set
ENABLE_WEBSERVER=truein.env- Security: Static files only, limited to output directory, localhost binding only
Generated reports and data are saved in ./output directory by default. Data persists even if container is restarted or removed.
📊 Web Report Access Paths:
TrendRadar generates daily summary HTML reports to two locations simultaneously:
| File Location | Access Method | Use Case |
|---|---|---|
output/index.html | Direct host access | Docker Deployment (via Volume mount, visible on host) |
index.html | Root directory access | GitHub Pages (repository root, auto-detected by Pages) |
output/html/YYYY-MM-DD/当日汇总.html | Historical reports | All environments (archived by date) |
Local Access Examples:
# Method 1: Via Web Server (recommended, Docker environment)
# 1. Start web server
docker exec -it trendradar python manage.py start_webserver
# 2. Access in browser
http://localhost:8080 # Access latest report (default index.html)
http://localhost:8080/html/2025-xx-xx/ # Access reports for specific date
# Method 2: Direct file access (local environment)
open ./output/index.html # macOS
start ./output/index.html # Windows
xdg-open ./output/index.html # Linux
# Method 3: Access historical archives
open ./output/html/2025-xx-xx/当日汇总.html
Why two index.html files?
output/index.html: Docker Volume mounted to host, can be opened locallyindex.html: Pushed to repository by GitHub Actions, auto-deployed by GitHub Pages💡 Tip: Both files have identical content, choose either one to access.
# Check container status
docker inspect trendradar
# View container logs
docker logs --tail 100 trendradar
# Enter container for debugging
docker exec -it trendradar /bin/bash
# Verify config files
docker exec -it trendradar ls -la /app/config/
If you need to use AI analysis features, you can deploy the standalone MCP service container.
Architecture Description:
Quick Start:
Use docker compose to start both news push and MCP services:
# Method 1: Clone project (Recommended)
git clone https://github.com/sansan0/TrendRadar.git
cd TrendRadar/docker
docker compose up -d
# Method 2: Download docker-compose.yml separately
mkdir trendradar && cd trendradar
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/docker/docker-compose.yml
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/docker/.env
mkdir -p config output
# Download config files
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/config.yaml -P config/
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/frequency_words.txt -P config/
# Modify volume paths in docker-compose.yml: ../config -> ./config, ../output -> ./output
docker compose up -d
# Check running status
docker ps | grep trendradar
Start MCP Service Separately:
# Linux/Mac
docker run -d --name trendradar-mcp \
-p 127.0.0.1:3333:3333 \
-v $(pwd)/config:/app/config:ro \
-v $(pwd)/output:/app/output:ro \
-e TZ=Asia/Shanghai \
wantcat/trendradar-mcp:latest
# Windows PowerShell
docker run -d --name trendradar-mcp `
-p 127.0.0.1:3333:3333 `
-v ${PWD}/config:/app/config:ro `
-v ${PWD}/output:/app/output:ro `
-e TZ=Asia/Shanghai `
wantcat/trendradar-mcp:latest
⚠️ Note: Ensure
config/andoutput/folders exist in current directory with config files and news data before running.
Verify Service:
# Check MCP service health
curl http://127.0.0.1:3333/mcp
# View MCP service logs
docker logs -f trendradar-mcp
Configure in AI Clients:
After MCP service starts, configure based on your client:
Cherry Studio (Recommended, GUI config):
streamableHttphttp://127.0.0.1:3333/mcpClaude Desktop / Cline (JSON config):
{
"mcpServers": {
"trendradar": {
"url": "http://127.0.0.1:3333/mcp",
"type": "streamableHttp"
}
}
}
💡 Tip: MCP service only listens on local port (127.0.0.1) for security. For remote access, configure reverse proxy and authentication yourself.
Configuration Location: report and display sections in config/config.yaml
report:
mode: "daily" # Push mode
display_mode: "keyword" # Display mode (v4.6.0 new)
rank_threshold: 5 # Ranking highlight threshold
sort_by_position_first: false # Sorting priority
max_news_per_keyword: 0 # Maximum display count per keyword
display:
region_order: # Region display order (v5.2.0 new)
- new_items # New trending section
- hotlist # Hotlist section
- rss # RSS subscription section
- standalone # Independent display section
- ai_analysis # AI analysis section
| Config Item | Type | Default | Description |
|---|---|---|---|
mode | string | daily | Push mode, options: daily/incremental/current, see Push Mode Details |
display_mode | string | keyword | Display mode, options: keyword/platform, see below |
rank_threshold | int | 5 | Ranking highlight threshold, news with rank ≤ this value will be displayed in bold |
sort_by_position_first | bool | false | Sorting priority: false=sort by news count, true=sort by config position |
max_news_per_keyword | int | 0 | Maximum display count per keyword, 0=unlimited |
display.region_order | list | See config above | Adjust list order to control region display positions |
Controls how news is grouped in push messages and HTML reports:
| Mode | Grouping | Title Prefix | Use Case |
|---|---|---|---|
keyword (default) | Group by keyword | [Platform] | Users focusing on specific topics |
platform | Group by platform | [Keyword] | Users focusing on specific platforms |
Example Comparison:
# keyword mode (group by keyword) 📊 Trending Keywords Stats 🔥 [1/3] AI : 12 items 1. [Weibo] OpenAI releases GPT-5 #1-#3 - 08:30 (5 times) 2. [Zhihu] How to view AI replacing programmers #2 - 09:15 (3 times) # platform mode (group by platform) 📊 Trending News Stats 🔥 [1/4] Weibo : 12 items 1. [AI] OpenAI releases GPT-5 #1-#3 - 08:30 (5 times) 2. [Trump] Trump announces major policy #2 - 09:15 (3 times)
Control the display position of each section in push messages by adjusting the order of display.region_order list.
Default Order: New Items → Hotlist → RSS → Standalone → AI Analysis
Custom Example: Want AI analysis at the top?
display:
region_order:
- ai_analysis # Move to first line
- new_items
- hotlist
- rss
- standalone
Note: A region will only be displayed when both conditions are met:
region_orderdisplay.regions is trueExample Scenario: Config order A, B, C, news count A(3), B(10), C(5)
| Config Value | Display Order | Use Case |
|---|---|---|
false (default) | B(10) → C(5) → A(3) | Focus on popularity trends |
true | A(3) → B(10) → C(5) | Focus on personal priority |
Docker Environment Variables:
SORT_BY_POSITION_FIRST=true
MAX_NEWS_PER_KEYWORD=10
Provides full trending list display for specified platforms, unaffected by frequency_words.txt keyword filtering.
Configuration Location: display section in config/config.yaml
display:
regions:
standalone: true # Enable independent display section
standalone:
platforms: ["zhihu", "weibo"] # Trending platform ID list
rss_feeds: ["hacker-news"] # RSS feed ID list
max_items: 20 # Max display count per source (0=unlimited)
Use Cases:
Effect Example:
📋 Independent Display Section (Total 15 items) Zhihu Trending (10 items): 1. [Zhihu] How to view OpenAI releasing Sora? 2. [Zhihu] 2024 postgraduate entrance exam scores released... ... Hacker News (5 items): 1. [Hacker News] Launch HN: TrendRadar... ...
Configuration Location: notification.push_window section in config/config.yaml
notification:
push_window:
enabled: false # Whether to enable
start: "20:00" # Start time (Beijing time)
end: "22:00" # End time (Beijing time)
once_per_day: true # Push only once per day
| Config Item | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Whether to enable push time window control |
start | string | "20:00" | Push window start time (Beijing time, HH:MM format) |
end | string | "22:00" | Push window end time (Beijing time, HH:MM format) |
once_per_day | bool | true | true=push only once per day within window, false=push every execution within window |
| Scenario | Configuration Example |
|---|---|
| Working Hours Push | start: "09:00", end: "18:00", once_per_day: false |
| Evening Summary Push | start: "20:00", end: "22:00", once_per_day: true |
| Lunch Break Push | start: "12:00", end: "13:00", once_per_day: true |
⚠️ GitHub Actions Users Note:
- GitHub Actions execution time is unstable, may have ±15 minutes deviation
- Time range should be at least 2 hours wide
- For precise timed push, recommend Docker deployment on personal server
PUSH_WINDOW_ENABLED=true
PUSH_WINDOW_START=09:00
PUSH_WINDOW_END=18:00
PUSH_WINDOW_ONCE_PER_DAY=false
Scenario: Push once between 8-10 PM daily
notification:
push_window:
enabled: true
start: "20:00"
end: "22:00"
once_per_day: true
Scenario: Push every hour during working hours
notification:
push_window:
enabled: true
start: "09:00"
end: "18:00"
once_per_day: false
Configuration Location: schedule section in .github/workflows/crawler.yml
on:
schedule:
- cron: "0 * * * *" # Run every hour
GitHub Actions uses a time format called "Cron". You don't need to understand it deeply; just copy and replace the code below.
Configuration Location: schedule section in .github/workflows/crawler.yml
| I want... | Copy this line | Note |
|---|---|---|
| Every Hour | - cron: "0 * * * *" | Default, runs at minute 0 |
| Every 30 Mins | - cron: "*/30 * * * *" | Runs every 30 minutes |
| Daily at 8 AM | - cron: "0 0 * * *" | ⚠️ 0 because UTC 0:00 = Beijing 8:00 AM |
| Work Hours (30m) | - cron: "*/30 0-14 * * *" | Beijing 8:00 - 22:00 |
| 3 Times Daily | - cron: "0 0,6,12 * * *" | Beijing 8:00, 14:00, 20:00 |
Time Zone: GitHub servers use UTC time.
Don't run too often: Suggest intervals no shorter than 30 minutes.
.github/workflows/crawler.yml.cron: "..." and replace the content inside quotes with the code above.Configuration Location: notification section in config/config.yaml
DO NOT write passwords/Tokens directly in
config.yaml! If you upload a file containing passwords to GitHub, the whole world can see it.Correct Method:
- GitHub Actions Users: Add in Settings -> Secrets
- Docker Users: Write in
.envfile (this file won't be uploaded)
Simple, just separate multiple addresses with a semicolon ;.
Example: Suppose you have two Feishu groups:
https://.../webhook/aaahttps://.../webhook/bbbConfig value:
https://.../webhook/aaa;https://.../webhook/bbb
| Platform | Method | Note |
|---|---|---|
| Feishu/DingTalk/WeWork | Separate URLs with ; | Just chain them up |
| Bark (iOS) | Separate URLs with ; | Push to multiple iPhones |
| Telegram | Separate Tokens and ChatIDs with ; | ⚠️ Order must match: Token1 ↔ ChatID1 Token2 ↔ ChatID2 |
| ntfy | Separate Topics and Tokens with ; | If a topic needs no token, leave empty:token1;;token3 (middle is empty) |
# Send to 3 Feishu groups
FEISHU_WEBHOOK_URL=https://hook1...;https://hook2...;https://hook3...
# Send to 2 DingTalk groups
DINGTALK_WEBHOOK_URL=https://oapi...;https://oapi...
# Send to 2 Telegram users (Match one-to-one)
TELEGRAM_BOT_TOKEN=tokenA;tokenB
TELEGRAM_CHAT_ID=userA;userB
Tip: Default limit is 3 accounts per platform to prevent abuse. Adjust
MAX_ACCOUNTS_PER_CHANNELif needed.
The system automatically selects the best location for you, so you usually don't need to worry about it:
| Your Environment | Data Location | Description |
|---|---|---|
| Docker / Local | Local Disk | Saved in the output/ folder within the project directory. |
| GitHub Actions | Cloud Storage | Since GitHub Actions environments are destroyed after running, cloud storage (e.g., Cloudflare R2) is required. |
If you run on GitHub Actions, you need a "cloud drive" to save data. For example, Cloudflare R2 (free tier is generous).
Add these 5 variables to GitHub Secrets:
| Variable Name | Value |
|---|---|
STORAGE_BACKEND | remote |
S3_BUCKET_NAME | Your bucket name |
S3_ACCESS_KEY_ID | Your Access Key |
S3_SECRET_ACCESS_KEY | Your Secret Key |
S3_ENDPOINT_URL | Your R2 endpoint URL |
💡 Tutorial: How to apply for R2? See Quick Start - Remote Storage Configuration
By default, we never delete your data. If you want to save space, you can enable "Auto Cleanup".
Config Location: config/config.yaml
storage:
local:
retention_days: 30 # Keep local data for 30 days (0 = forever)
remote:
retention_days: 30 # Keep cloud data for 30 days
If you are overseas or find the push time doesn't match your local time, you can change the timezone.
Config Location: config/config.yaml
app:
timezone: "Asia/Shanghai" # Default is China Standard Time
America/Los_AngelesEurope/LondonAfter enabling this feature, AI acts as a professional analyst. When pushing a batch of news, it will:
Includes: Trending topic summary, public opinion direction, cross-platform correlation, potential impact assessment, etc.
The simplest way is via environment variables (Recommended for GitHub Secrets or .env).
Required Configurations:
| Variable Name | Value | Description |
|---|---|---|
AI_ANALYSIS_ENABLED | true | Enable switch |
AI_API_KEY | sk-xxxxxx | Your API Key |
AI_MODEL | deepseek/deepseek-chat | Model identifier (format: provider/model) |
Supported AI Providers (Based on LiteLLM, supports 100+ providers):
| Provider | AI_MODEL Value | Description |
|---|---|---|
| DeepSeek (Recommended) | deepseek/deepseek-chat | Excellent cost-performance ratio for high-frequency analysis |
| OpenAI | openai/gpt-4oopenai/gpt-4o-mini | GPT-4o series |
| Google Gemini | gemini/gemini-1.5-flashgemini/gemini-1.5-pro | Gemini series |
| Custom API | Any format | Use with AI_API_BASE |
💡 New Feature: Now based on LiteLLM unified interface, supporting 100+ AI providers with simpler configuration and better error handling.
Optional Configurations:
| Variable Name | Default | Description |
|---|---|---|
AI_API_BASE | (auto) | Custom API endpoint (e.g., OneAPI, local models) |
AI_TEMPERATURE | 1.0 | Sampling temperature (0-2, higher = more random) |
AI_MAX_TOKENS | 5000 | Maximum tokens to generate |
AI_TIMEOUT | 120 | Request timeout (seconds) |
AI_NUM_RETRIES | 2 | Number of retries on failure |
If you subscribe to foreign RSS feeds (like Hacker News), AI can translate the content into your native language.
Configuration Location: config/config.yaml
ai_translation:
enabled: true # Enable translation
language: "Chinese" # Target language (Chinese, English, Japanese...)
Think the AI sounds too official? You can modify its prompt to change its style (e.g., "Sarcastic Commentator", "Senior Investment Advisor").
config/ai_analysis_prompt.txtTrendRadar v3.0.0 added MCP (Model Context Protocol) based AI analysis feature, allowing natural language conversations with news data for deep analysis.
Critical: AI features require local news data support
AI analysis does not query real-time online data directly, but analyzes locally accumulated news data (stored in the output folder)
Built-in Test Data: The output directory includes one week of trending news data from December 21-27, 2025 for quick feature testing
Query Limitations:
Getting Latest Data:
Cherry Studio provides GUI config interface, 5-minute quick deployment, complex parts are one-click install.
Illustrated Deployment Tutorial: Now updated to my WeChat Official Account (see Support Project), reply "mcp" to get
Detailed Deployment Tutorial: README-Cherry-Studio.md
Deployment Mode Description:
Detailed Conversation Tutorial: README-MCP-FAQ.md
Question Effect:
💡 Tip: Actually not recommended to ask multiple questions at once. If your chosen AI model cannot even sequentially call as shown below, suggest switching models.
TrendRadar MCP service supports standard Model Context Protocol (MCP), can connect to various AI clients supporting MCP for smart analysis.
Note:
/path/to/TrendRadar with your actual project pathC:\\Users\\YourName\\TrendRadarStart HTTP Service:
# Windows
start-http.bat
# Mac/Linux
./start-http.sh
Configure Cursor:
Project Level Config (Recommended):
Create .cursor/mcp.json in project root:
{
"mcpServers": {
"trendradar": {
"url": "http://localhost:3333/mcp",
"description": "TrendRadar News Trending Aggregation Analysis"
}
}
}
Global Config:
Create ~/.cursor/mcp.json in user directory (same content)
Usage Steps:
Search today's "AI" related newsCreate .cursor/mcp.json:
{
"mcpServers": {
"trendradar": {
"command": "uv",
"args": [
"--directory",
"/path/to/TrendRadar",
"run",
"python",
"-m",
"mcp_server.server"
]
}
}
}
Add in Cline's MCP settings:
HTTP Mode:
{
"trendradar": {
"url": "http://localhost:3333/mcp",
"type": "streamableHttp",
"autoApprove": [],
"disabled": false
}
}
STDIO Mode (Recommended):
{
"trendradar": {
"command": "uv",
"args": [
"--directory",
"/path/to/TrendRadar",
"run",
"python",
"-m",
"mcp_server.server"
],
"type": "stdio",
"disabled": false
}
}
Edit ~/.continue/config.json:
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "uv",
"args": [
"--directory",
"/path/to/TrendRadar",
"run",
"python",
"-m",
"mcp_server.server"
]
}
}
]
}
}
Usage Examples:
Analyze recent 7 days "Tesla" popularity trend Generate today's trending summary report Search "Bitcoin" related news and analyze sentiment
MCP Inspector is the official debug tool for testing MCP connections:
Start TrendRadar HTTP Service:
# Windows
start-http.bat
# Mac/Linux
./start-http.sh
Start MCP Inspector:
npx @modelcontextprotocol/inspector
Connect in Browser:
http://localhost:3333/mcpAny client supporting Model Context Protocol can connect to TrendRadar:
Service Address: http://localhost:3333/mcp
Basic Config Template:
{
"name": "trendradar",
"url": "http://localhost:3333/mcp",
"type": "http",
"description": "News Trending Aggregation Analysis"
}
Basic Config Template:
{
"name": "trendradar",
"command": "uv",
"args": [
"--directory",
"/path/to/TrendRadar",
"run",
"python",
"-m",
"mcp_server.server"
],
"type": "stdio"
}
Notes:
/path/to/TrendRadar with actual project pathC:\\Users\\...Check Steps:
Confirm port 3333 is not occupied:
# Windows
netstat -ano | findstr :3333
# Mac/Linux
lsof -i :3333
Check if project dependencies installed:
# Re-run install script
# Windows: setup-windows.bat or setup-windows-en.bat
# Mac/Linux: ./setup-mac.sh
View detailed error logs:
uv run python -m mcp_server.server --transport http --port 3333
Try custom port:
uv run python -m mcp_server.server --transport http --port 33333
Solutions:
STDIO Mode:
which uv or where uv)HTTP Mode:
http://localhost:3333/mcp)General Checks:
Possible Reasons:
Data Does Not Exist:
Parameter Error:
YYYY-MM-DDzhihu, weibo, etc.Config Issues:
config/config.yaml existsconfig/frequency_words.txt exists4 Related Articles (Chinese):
AI Development:
📍 Chairman Mao's Footprint Map - Interactive dynamic display of complete trajectory 1893-1976. Welcome comrades to contribute data
Bilibili Comment Data Visualization Analysis Software
GPL-3.0 License