📢 Announcement: After communicating with GitHub officials, "One-Click Fork Deployment" will be restored after compliance adjustments are completed. Please stay tuned for v4.0.0 update
🚀 Deploy in 30 seconds — Say goodbye to endless scrolling, only see the news you truly care about
中文 | English
This project is designed to be lightweight and easy to deploy
⚠️ December 2025 Urgent Notice
Due to a surge in Fork numbers causing excessive load on GitHub servers, GitHub Actions and GitHub Pages deployments are currently restricted. Please read the following instructions carefully to ensure successful deployment.
This is currently the most stable solution, free from GitHub restrictions. Data is stored locally and won't be affected by GitHub policy changes.
To reduce pressure on GitHub servers, please DO NOT directly click the "Fork" button!
Please use the "Use this template" feature instead of Fork:
Why do this?
The new version will use Cloudflare R2 to store news data, ensuring data persistence.
⚠️ Configuration Prerequisites:
According to Cloudflare platform rules, activating R2 requires binding a payment method.
Future Plans:
- Exploring new approach: keep Actions for fetching and pushing, but no longer save data to repository, use external storage instead.
⚠️ Reading Note: Given that the above plans mean Fork deployment mode may return in a new form in the future, and the workload to fully revise documentation is massive, we have temporarily retained the old descriptions.
At the current stage, if "Fork" related expressions still appear in subsequent tutorials, please ignore them or understand them as "Use this template".
👉 Click here to view TrendRadar's latest official documentation
| 🚀 Quick Start | 🤖 AI Analysis | ⚙️ Configuration Guide | 📝 Changelog | ❓ FAQ & Support |
|---|---|---|---|---|
| 🐳 Docker Deployment | 🔌 MCP Clients | 📚 Related Projects | 🪄 Sponsors |
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
"One-yuan appreciation" has been suspended. If you still want to support the author, please visit the official account article and click "Like Author" at the bottom.
| 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) |
Default monitoring of 11 mainstream platforms, with support for adding custom platforms.
💡 For detailed configuration, see Configuration Guide - Platform Configuration
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 |
💡 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 Syntax (5 types):
+: Narrow scope!: Exclude noise@: Control display count (v3.2.0 new)[GLOBAL_FILTER]: Globally exclude specified content (v3.5.0 new)Advanced Features (v3.2.0 new):
Group-based Management:
💡 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.
📌 Multi-Account Push Notes (v3.5.0 New Feature):
; to separate multiple account valuesFEISHU_WEBHOOK_URL Secret value to https://webhook1;https://webhook2AI 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 November 1-15 test data for immediate experience
- Recommend deploying the project yourself to get more real-time data
See AI Analysis for details
One-click GitHub Fork to use, no programming required.
30-second deployment: GitHub Pages (web browsing) supports one-click save as image for easy sharing
1-minute deployment: WeWork (mobile notification)
💡 Tip: Want a real-time updated web version? After forking, go to your repo Settings → Pages and enable GitHub Pages. Preview Effect.
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
| Github Pages Effect (Mobile Adapted, Email Push) | Feishu Push Effect |
|---|---|
![]() | ![]() |
Upgrade Instructions:
main.py in your forked repo with the latest version🎉 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 trend-radar 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
📖 Reminder: Fork users should first check the latest official documentation to ensure the configuration steps are up to date.
Fork this project to your GitHub account
Setup GitHub Secrets (Choose your needed platforms):
In your forked repo, 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 them📌 Multi-Account Push Notes (v3.5.0 New Feature):
; to separate multiple account valuesFEISHU_WEBHOOK_URL Secret value to https://webhook1;https://webhook2Multi-Account Configuration Examples:
| Name | Secret (Value) Example |
|---|---|
FEISHU_WEBHOOK_URL | https://webhook1;https://webhook2;https://webhook3 |
TELEGRAM_BOT_TOKEN | token1;token2 |
TELEGRAM_CHAT_ID | chatid1;chatid2 |
NTFY_TOPIC | topic1;topic2 |
NTFY_TOKEN | ;token2 (1st has no token, use empty string as placeholder) |
Configuration 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)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": {
"total_titles": "{{Content}}",
"timestamp": "{{Content}}",
"report_type": "{{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": {
"total_titles": "{{Content}}",
"timestamp": "{{Content}}",
"report_type": "{{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 2GitHub 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 |
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)
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:
💡 Beginner Quick Start Tip:
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.
Manual Test News Push:
💡 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:
Enter your project's Actions page
Find "Hot News Crawler" and click in
Click "Run workflow" button on the right to run
Wait about 1 minute, messages will be pushed to your configured platform
⏱️ Testing Tips:
- 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
Configuration Notes (Optional):
💡 Default configuration works normally, only adjust if you need personalization, understand these three 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
🎉 Deployment Success! Share Your Experience
Congratulations on completing TrendRadar configuration! You can now start tracking trending news.
💬 Join our community to share your experience~
👉 Follow our WeChat Official Account「硅基茶水间」(Silicon Tea Room), your likes and comments are the driving force for continuous updates!
For detailed communication methods, please check → FAQ & Support
🤖 Want Smarter Analysis? Try AI-Enhanced Features (Optional)
Basic configuration already meets daily needs, but if you want:
👉 Learn More: AI Analysis — Unlock hidden capabilities and make trend tracking more efficient!
📖 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:
- 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 five 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) |
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)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"
Docker Environment Variable: REPORT_MODE=incremental
| 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: weight section in config/config.yaml
weight:
rank_weight: 0.6 # Ranking weight
frequency_weight: 0.3 # Frequency weight
hotness_weight: 0.1 # Hotness weight
Current default configuration is balanced.
Real-Time Trending Type:
weight:
rank_weight: 0.8 # Mainly focus on ranking
frequency_weight: 0.1 # Less concern about continuity
hotness_weight: 0.1
Target Users: Content creators, marketers, users wanting to quickly understand current hot topics
In-Depth Topic Type:
weight:
rank_weight: 0.4 # Moderate ranking focus
frequency_weight: 0.5 # Emphasize sustained heat within the day
hotness_weight: 0.1
Target Users: Investors, researchers, journalists, users needing deep trend analysis
Core 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/
# 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 └── docker/ ├── .env └── docker compose.yml
Config File Description:
config/config.yaml - Application main config (report mode, push settings, etc.)config/frequency_words.txt - Keyword config (set your interested trending keywords).env - Environment variable config (webhook URLs and 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_CRAWLER | crawler.enable_crawler | true / false | Enable crawler |
ENABLE_NOTIFICATION | notification.enable_notification | true / false | Enable notification |
REPORT_MODE | report.mode | daily / incremental / current | Report mode |
MAX_ACCOUNTS_PER_CHANNEL | notification.max_accounts_per_channel | 3 | Maximum accounts per channel |
PUSH_WINDOW_ENABLED | notification.push_window.enabled | true / false | Push time window switch |
PUSH_WINDOW_START | notification.push_window.time_range.start | 08:00 | Push start time |
PUSH_WINDOW_END | notification.push_window.time_range.end | 22:00 | Push end time |
ENABLE_WEBSERVER | - | true / false | Auto-start web server |
WEBSERVER_PORT | - | 8080 | Web server port (default 8080) |
FEISHU_WEBHOOK_URL | notification.webhooks.feishu_url | https://... | Feishu Webhook (supports multi-account, use ; separator) |
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 (trend-radar + trend-radar-mcp)
docker compose up -d
Option B: Start News Push Service Only
# Start trend-radar only (scheduled crawling and push)
docker compose pull trend-radar
docker compose up -d trend-radar
Option C: Start MCP AI Analysis Service Only
# Start trend-radar-mcp only (AI analysis interface)
docker compose pull trend-radar-mcp
docker compose up -d trend-radar-mcp
💡 Tips:
- Most users only need to start
trend-radarfor news push functionality- Only start
trend-radar-mcpwhen using Claude/ChatGPT for AI dialogue analysis- Both services are independent and can be flexibly combined
Check Running Status:
# View news push service logs
docker logs -f trend-radar
# View MCP AI analysis service logs
docker logs -f trend-radar-mcp
# View all container status
docker ps | grep trend-radar
# Stop specific service
docker compose stop trend-radar # Stop push service
docker compose stop trend-radar-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 trend-radar
docker compose up -d trend-radar
# Option C: Build and start MCP AI analysis service only
docker compose build trend-radar-mcp
docker compose up -d trend-radar-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 trend-radar python manage.py status
# Manually execute crawler once
docker exec -it trend-radar python manage.py run
# View real-time logs
docker exec -it trend-radar python manage.py logs
# Display current config
docker exec -it trend-radar python manage.py config
# Display output files
docker exec -it trend-radar python manage.py files
# Web server management (for browser access to generated reports)
docker exec -it trend-radar python manage.py start_webserver # Start web server
docker exec -it trend-radar python manage.py stop_webserver # Stop web server
docker exec -it trend-radar python manage.py webserver_status # Check web server status
# View help info
docker exec -it trend-radar python manage.py help
# Restart container
docker restart trend-radar
# Stop container
docker stop trend-radar
# Remove container (keep data)
docker rm trend-radar
💡 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/YYYY年MM月DD日/html/当日汇总.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 trend-radar python manage.py start_webserver
# 2. Access in browser
http://localhost:8080 # Access latest report (default index.html)
http://localhost:8080/2025年xx月xx日/ # Access reports for specific date
http://localhost:8080/2025年xx月xx日/html/ # Browse all HTML files for that 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/2025年xx月xx日/html/当日汇总.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 trend-radar
# View container logs
docker logs --tail 100 trend-radar
# Enter container for debugging
docker exec -it trend-radar /bin/bash
# Verify config files
docker exec -it trend-radar 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:
# Download latest docker compose.yml (includes MCP service config)
wget https://raw.githubusercontent.com/sansan0/TrendRadar/master/docker/docker compose.yml
# Start all services
docker compose up -d
# Check running status
docker ps | grep trend-radar
Start MCP Service Separately:
docker run -d --name trend-radar-mcp \ -p 127.0.0.1:3333:3333 \ -v ./config:/app/config:ro \ -v ./output:/app/output:ro \ -e TZ=Asia/Shanghai \ wantcat/trendradar-mcp:latest
Verify Service:
# Check if MCP service is running properly
curl http://127.0.0.1:3333/mcp
# View MCP service logs
docker logs -f trend-radar-mcp
Configure in AI Clients:
After MCP service starts, configure in Claude Desktop, Cherry Studio, Cursor, etc.:
{
"mcpServers": {
"trendradar": {
"url": "http://127.0.0.1:3333/mcp",
"description": "TrendRadar News Trending Analysis"
}
}
}
💡 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 section in config/config.yaml
report:
mode: "daily" # Push mode
rank_threshold: 5 # Ranking highlight threshold
sort_by_position_first: false # Sorting priority
max_news_per_keyword: 0 # Maximum display count per keyword
reverse_content_order: false # Content order configuration
| Config Item | Type | Default | Description |
|---|---|---|---|
mode | string | daily | Push mode, options: daily/incremental/current, see Push Mode Details |
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 |
reverse_content_order | bool | false | Content order: false=trending keywords stats first, true=new trending news first |
Controls display order of two content sections in push messages and HTML reports:
| Config Value | Display Order |
|---|---|
false (default) | ① Trending Keywords Stats → ② New Trending News |
true | ① New Trending News → ② Trending Keywords Stats |
Use Cases:
false (default): Suitable for users focusing on keyword match results, view categorized stats firsttrue: Suitable for users focusing on latest updates, prioritize viewing new trending topicsDocker Environment Variable:
REVERSE_CONTENT_ORDER=true
Example 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
Configuration Location: notification.push_window section in config/config.yaml
notification:
push_window:
enabled: false # Whether to enable
time_range:
start: "20:00" # Start time (Beijing time)
end: "22:00" # End time (Beijing time)
once_per_day: true # Push only once per day
push_record_retention_days: 7 # Push record retention days
| Config Item | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Whether to enable push time window control |
time_range.start | string | "20:00" | Push window start time (Beijing time, HH:MM format) |
time_range.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 |
push_record_retention_days | int | 7 | Push record retention days (used to determine if already pushed) |
| 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
PUSH_WINDOW_RETENTION_DAYS=7
Scenario: Push once between 8-10 PM daily
notification:
push_window:
enabled: true
time_range:
start: "20:00"
end: "22:00"
once_per_day: true
push_record_retention_days: 7
Scenario: Push every hour during working hours
notification:
push_window:
enabled: true
time_range:
start: "09:00"
end: "18:00"
once_per_day: false
push_record_retention_days: 7
Configuration Location: schedule section in .github/workflows/crawler.yml
on:
schedule:
- cron: "0 * * * *" # Run every hour
Cron is a time-based job scheduler format, consisting of 5 parts: minute hour day month weekday
┌───────────── minute (0-59) │ ┌───────────── hour (0-23) │ │ ┌───────────── day (1-31) │ │ │ ┌───────────── month (1-12) │ │ │ │ ┌───────────── weekday (0-6, 0=Sunday) │ │ │ │ │ * * * * *
| Desired Effect | Cron Expression | Description |
|---|---|---|
| Every hour | 0 * * * * | Run at minute 0 of every hour (default) |
| Every 30 minutes | */30 * * * * | Run every 30 minutes |
| Daily at 8 AM | 0 0 * * * | UTC 0:00 = Beijing 8:00 AM |
| Working hours | */30 0-14 * * * | Beijing 8:00-22:00, every 30 minutes |
| 3 times daily | 0 0,6,12 * * * | Beijing 8:00, 14:00, 20:00 |
⚠️ Time Zone Note: GitHub Actions uses UTC time, Beijing time needs to subtract 8 hours
- Want Beijing 8:00 AM run → Set UTC 0:00
- Want Beijing 8:00 PM run → Set UTC 12:00
⚠️ Frequency Limit: GitHub has a limit on Actions execution count per account
- Recommendation: Don't set intervals shorter than 30 minutes
- Reason: Too frequent may be considered abuse, facing account ban risk
- Reality: GitHub Actions execution time has inherent deviation, setting too precise is meaningless
.github/workflows/crawler.yml filecron: "0 * * * *"Configuration Location: notification section in config/config.yaml
GitHub Fork Users: DO NOT configure push information in
config.yaml!
- Risk:
config.yamlwill be committed to public Git repositories. Configuring push information (Webhook URLs, Tokens, etc.) will expose sensitive data- Recommended Methods:
- GitHub Actions Users → Use GitHub Secrets environment variables
- Docker Users → Use
.envfile configuration (.envis in.gitignoreand won't be committed)- Local Development Users: Can configure in
config.yaml(ensure it won't be pushed to public repositories)
| Channel | Configuration Item | Pairing Required | Description |
|---|---|---|---|
| Feishu | feishu_url | No | Multiple webhook URLs |
| DingTalk | dingtalk_url | No | Multiple webhook URLs |
| WeWork | wework_url | No | Multiple webhook URLs |
| Telegram | telegram_bot_token + telegram_chat_id | ✅ Yes | Token and chat_id quantities must match |
| ntfy | ntfy_topic + ntfy_token | ✅ Yes | Topic and token quantities must match (token optional) |
| Bark | bark_url | No | Multiple push URLs |
| Slack | slack_webhook_url | No | Multiple webhook URLs |
email_to | - | Already supports multiple recipients (comma-separated), no modification needed |
Configuration Location: GitHub Repo → Settings → Secrets and variables → Actions → Repository secrets
Basic Configuration Example:
# Multi-account quantity limit
MAX_ACCOUNTS_PER_CHANNEL=3
# Feishu multi-account (3 groups)
FEISHU_WEBHOOK_URL=https://hook1.feishu.cn/xxx;https://hook2.feishu.cn/yyy;https://hook3.feishu.cn/zzz
# DingTalk multi-account (2 groups)
DINGTALK_WEBHOOK_URL=https://oapi.dingtalk.com/xxx;https://oapi.dingtalk.com/yyy
# WeWork multi-account (2 groups)
WEWORK_WEBHOOK_URL=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx;https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=yyy
# Bark multi-account (2 devices)
BARK_URL=https://api.day.app/key1;https://api.day.app/key2
# Slack multi-account (2 channels)
SLACK_WEBHOOK_URL=https://hooks.slack.com/xxx;https://hooks.slack.com/yyy
Paired Configuration Examples (Telegram and ntfy):
# ✅ Correct: 2 tokens correspond to 2 chat_ids
TELEGRAM_BOT_TOKEN=123456:AAA-BBB;789012:CCC-DDD
TELEGRAM_CHAT_ID=-100111;-100222
# ❌ Incorrect: quantities don't match, push will be skipped
TELEGRAM_BOT_TOKEN=token1;token2;token3
TELEGRAM_CHAT_ID=id1;id2
Note: The quantities of token and chat_id must match exactly, otherwise the channel push will be skipped.
# ✅ Correct: 3 topics, only the 2nd needs a token
NTFY_TOPIC=topic1;topic2;topic3
NTFY_TOKEN=;token_for_topic2;
# ✅ Correct: 2 topics both need tokens
NTFY_TOPIC=topic1;topic2
NTFY_TOKEN=token1;token2
# ❌ Incorrect: topic and token quantities don't match
NTFY_TOPIC=topic1;topic2
NTFY_TOKEN=token1;token2;token3
Notes:
topic and token must matchConfiguration Location: docker/.env file in project root directory
Basic Configuration Example:
# Multi-account quantity limit
MAX_ACCOUNTS_PER_CHANNEL=3
# Feishu multi-account (3 groups)
FEISHU_WEBHOOK_URL=https://hook1.feishu.cn/xxx;https://hook2.feishu.cn/yyy;https://hook3.feishu.cn/zzz
# DingTalk multi-account (2 groups)
DINGTALK_WEBHOOK_URL=https://oapi.dingtalk.com/xxx;https://oapi.dingtalk.com/yyy
# WeWork multi-account (2 groups)
WEWORK_WEBHOOK_URL=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx;https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=yyy
# Bark multi-account (2 devices)
BARK_URL=https://api.day.app/key1;https://api.day.app/key2
# Slack multi-account (2 channels)
SLACK_WEBHOOK_URL=https://hooks.slack.com/xxx;https://hooks.slack.com/yyy
Paired Configuration Examples (Telegram and ntfy):
# ✅ Correct: 2 tokens correspond to 2 chat_ids
TELEGRAM_BOT_TOKEN=123456:AAA-BBB;789012:CCC-DDD
TELEGRAM_CHAT_ID=-100111;-100222
# ❌ Incorrect: quantities don't match, push will be skipped
TELEGRAM_BOT_TOKEN=token1;token2;token3
TELEGRAM_CHAT_ID=id1;id2
Note: The quantities of token and chat_id must match exactly, otherwise the channel push will be skipped.
# ✅ Correct: 3 topics, only the 2nd needs a token
NTFY_TOPIC=topic1;topic2;topic3
NTFY_TOKEN=;token_for_topic2;
# ✅ Correct: 2 topics both need tokens
NTFY_TOPIC=topic1;topic2
NTFY_TOKEN=token1;token2
# ❌ Incorrect: topic and token quantities don't match
NTFY_TOPIC=topic1;topic2
NTFY_TOKEN=token1;token2;token3
Notes:
topic and token must matchThe system will automatically truncate to the configured maximum quantity and output warning logs. You can adjust the limit via max_accounts_per_channel.
⚠️ Special Note for GitHub Actions Users:
max_accounts_per_channel: 3 or lower valuesYes. Each account sends independently, total time = number of accounts × single account send time. Recommend controlling the number of accounts.
If you are doing local development and will not push code to public repositories, you can configure directly in config/config.yaml:
notification:
enable_notification: true
max_accounts_per_channel: 3
webhooks:
feishu_url: "https://hook1.feishu.cn/xxx;https://hook2.feishu.cn/yyy"
telegram_bot_token: "token1;token2"
telegram_chat_id: "id1;id2"
⚠️ Important Reminder:
config/config.yaml is in .gitignore (if you will commit code)TrendRadar 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 news data from November 1-15, 2025 by default 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 FAQ & Support), 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\\TrendRadarEdit Claude Desktop's MCP config file:
Windows:
%APPDATA%\Claude\claude_desktop_config.json
Mac:
~/Library/Application Support/Claude/claude_desktop_config.json
Config Content:
{
"mcpServers": {
"trendradar": {
"command": "uv",
"args": [
"--directory",
"/path/to/TrendRadar",
"run",
"python",
"-m",
"mcp_server.server"
],
"env": {},
"disabled": false,
"alwaysAllow": []
}
}
}
Start 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
# 1. Start HTTP service
# Windows: start-http.bat
# Mac/Linux: ./start-http.sh
# 2. Add MCP server
claude mcp add --transport http trendradar http://localhost:3333/mcp
# 3. Verify connection (ensure service started)
claude mcp list
# Query news
claude "Search today's Zhihu trending news, top 10"
# Trend analysis
claude "Analyze 'artificial intelligence' topic popularity trend for the past week"
# Data comparison
claude "Compare Zhihu and Weibo platform attention on 'Bitcoin'"
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\\...If you want to support this project, you can search Tencent Charity on WeChat and donate to Education Support Programs as you wish
Thanks to those who participated in the one-yuan donation! You are listed in the Acknowledgments at the top. Your support gives more motivation to open source maintenance. Personal donation QR code has been removed.
| WeChat Official Account |
|---|
![]() |
302.AI is a pay-as-you-go enterprise-level AI resource platform Providing the latest and most comprehensive AI models and APIs on the market, plus various ready-to-use online AI applications
Tip: Cherry Studio has natively integrated 302.AI, you can see the complete model list after configuration.
Q: How long does $1 free credit last? A: Depends on usage frequency and model selection, can run multiple test sessions.
Q: What after free credit runs out? A: You can top up as needed, pay-as-you-go. Major AI model prices are now relatively affordable.
Tracking so many trending topics daily, writing reports, replying messages making your wrists tired?
Try「FlashSpeak」AI Voice Input - Speak instead of type, 4x faster ⚡
On-device Model • Lightning Fast • Absolute Privacy • Mac/Win Support
From reading trends to content output, double your efficiency 👇
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