Content
align="center" id="trendradar">
<a href="https://github.com/sansan0/TrendRadar" title="TrendRadar">
<img src="/_image/banner.webp" alt="TrendRadar Banner" width="80%">
</a>
The fastest <strong>30 seconds</strong> deployment of hot spot assistant - Goodbye invalid brush screen, only see the news information you really care about
<a href="https://trendshift.io/repositories/14726" target="_blank"><img src="https://trendshift.io/api/badge/repositories/14726" alt="sansan0%2FTrendRadar | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
[](https://github.com/sansan0/TrendRadar/stargazers)
[](https://github.com/sansan0/TrendRadar/network/members)
[](LICENSE)
[](https://github.com/sansan0/TrendRadar)
[](https://github.com/sansan0/TrendRadar)
[](https://github.com/sansan0/TrendRadar)
[](https://github.com/sansan0/TrendRadar)
[](https://work.weixin.qq.com/)
[](https://weixin.qq.com/)
[](https://telegram.org/)
[](#)
[](https://www.feishu.cn/)
[](#)
[](https://github.com/binwiederhier/ntfy)
[](https://github.com/Finb/Bark)
[](https://slack.com/)
[](#)
[](https://github.com/sansan0/TrendRadar)
[](https://sansan0.github.io/TrendRadar)
[](https://hub.docker.com/r/wantcat/trendradar)
[](https://modelcontextprotocol.io/)
[](#)
[](#)
</div>
<div align="center">
**English** | **[English](README-EN.md)**
</div>
> This project aims to be lightweight and easy to deploy
<br>
## 📑 Quick Navigation
> 💡 **Click the link below** to quickly jump to the corresponding section. It is recommended to start with "**Quick Start**" for deployment, and for detailed customization, please refer to "**Configuration Details**".
<div align="center">
| | | |
|:---:|:---:|:---:|
| [🚀 **Quick Start**](#-quick-start) | [AI Intelligent Analysis](#-ai-intelligent-analysis) | [⚙️ **Configuration Details**](#configuration-details) |
| [Docker Deployment](#6-docker-deployment) | [MCP Client](#-mcp-client) | [📝 **Update Log**](#-update-log) |
| [🎯 **Core Features**](#-core-features) | [☕ **Support Projects**](#-support-projects) | [📚 **Project Related**](#-project-related) |
</div>
<br>
- Thanks to the **star**-giving audience, **fork** as you wish, **star** as I wish, and having both is the best support for the open-source spirit.
<details>
<summary>👉 Click to expand: <strong>Acknowledgment List</strong> (Honor List 🔥73+🔥 people)</summary>
### Early Supporters Acknowledgment
> 💡 **Special Note**:
>
> 1. **About the list**: The table below records the supporters from the early stages (angel round) of the project. Due to the tedious manual statistics at that time, **there might be omissions or incomplete records, and any omissions are unintentional and appreciated for your understanding**.
> 2. **Future Plans**: In order to focus limited energy on code and feature iteration, **this list will no longer be manually maintained starting from now**.
> Regardless of whether your name is on the list, every support you provided has been the cornerstone of TrendRadar's progress so far. 🙏
### Infrastructure Support
Thanks to **GitHub** for providing free infrastructure, which is the biggest prerequisite for this project to **fork with one click** and run conveniently.
### Data Support
This project uses the API from the [newsnow](https://github.com/ourongxing/newsnow) project to obtain multi-platform data, and special thanks to the author for providing the service.
After contact, the author expressed no concerns about server pressure, but this is based on his goodwill and trust. Please:
- **Go to the [newsnow project](https://github.com/ourongxing/newsnow) and give it a star** for support.
- When deploying with Docker, please reasonably control the push frequency and avoid overexploitation.
### Promotion and Assistance
> Thanks to the following platforms and individuals for their recommendations (in chronological order)
- [CoolShell](https://mp.weixin.qq.com/s/fvutkJ_NPUelSW9OGK39aA) - Open-source software recommendation platform
- [LinuxDo Community](https://linux.do/) - A gathering place for tech enthusiasts
- [Ruanyifeng's Weekly](https://github.com/ruanyf/weekly) - A weekly newsletter with influence in the tech circle
Audience Support
> Thanks to **those who have financially supported** the project. Your generosity has transformed into snacks and drinks beside the keyboard, accompanying the project through every iteration.
> **Regarding the return of "One Yuan Appreciation"**:
> With the release of version v5.0.0, the project has entered a new phase. To support the growing API costs and caffeine consumption, the "One Yuan Appreciation" channel has reopened. Every bit of your support will be converted into tokens and motivation in the world of code. 🚀 [Support the project](#-support-the-project)
| Donor | Amount | Date | Remarks |
| :-------------------------: | :----: | :----: | :-----------------------: |
| D*5 | 1.8 * 3 | 2025.11.24 | |
| *鬼 | 1 | 2025.11.17 | |
| *超 | 10 | 2025.11.17 | |
| R*w | 10 | 2025.11.17 | This agent is awesome, brother |
| J*o | 1 | 2025.11.17 | Thanks for open-sourcing, wishing you success |
| *晨 | 8.88 | 2025.11.16 | The project is great, I'm studying and learning |
| *海 | 1 | 2025.11.15 | |
| *德 | 1.99 | 2025.11.15 | |
| *疏 | 8.8 | 2025.11.14 | Thanks for open-sourcing, the project is great, supporting |
| M*e | 10 | 2025.11.14 | Open-sourcing is not easy, thanks for your hard work |
| **柯 | 1 | 2025.11.14 | |
| *云 | 88 | 2025.11.13 | Good project, thanks for open-sourcing |
| *W | 6 | 2025.11.13 | |
| *凯 | 1 | 2025.11.13 | |
| 对*. | 1 | 2025.11.13 | Thanks for your TrendRadar |
| s*y | 1 | 2025.11.13 | |
| **翔 | 10 | 2025.11.13 | Good project, it's a pity to know it late, thanks for open-sourcing! |
| *韦 | 9.9 | 2025.11.13 | TrendRadar is awesome, please have a cup of coffee~ |
| h*p | 5 | 2025.11.12 | Supporting China's open-source power, come on! |
| c*r | 6 | 2025.11.12 | |
| a*n | 5 | 2025.11.12 | |
| 。*c | 1 | 2025.11.12 | Thanks for sharing |
| *记 | 1 | 2025.11.11 | |
| *主 | 1 | 2025.11.10 | |
| *了 | 10 | 2025.11.09 | |
| *杰 | 5 | 2025.11.08 | |
| *点 | 8.80 | 2025.11.07 | The development is not easy, supporting |
| Q*Q | 6.66 | 2025.11.07 | Thanks for open-sourcing! |
| C*e | 1 | 2025.11.05 | |
| Peter Fan | 20 | 2025.10.29 | |
| M*n | 1 | 2025.10.27 | Thanks for open-sourcing |
| *许 | 8.88 | 2025.10.23 | Teacher, I'm a newbie, I've been playing with it for a few days and still can't get it, seeking guidance |
| Eason | 1 | 2025.10.22 | I haven't figured it out yet, but you're doing a good job |
| P*n | 1 | 2025.10.20 | |
| *杰 | 1 | 2025.10.19 | |
| *徐 | 1 | 2025.10.18 | |
| *志 | 1 | 2025.10.17 | |
| *😀 | 10 | 2025.10.16 | Appreciate |
| **杰 | 10 | 2025.10.16 | |
| *啸 | 10 | 2025.10.16 | |
| *纪 | 5 | 2025.10.14 | TrendRadar |
| J*d | 1 | 2025.10.14 | Thanks for your tool, it's fun... |
| *H | 1 | 2025.10.14 | |
| 那*O | 10 | 2025.10.13 | |
| *圆 | 1 | 2025.10.13 | |
| P*g | 6 | 2025.10.13 | |
| Ocean | 20 | 2025.10.12 | ...it's really great!!!even a beginner like me can use it directly... |
| **培 | 5.2 | 2025.10.2 | github-yzyf1312:open-source forever |
| *椿 | 3 | 2025.9.23 | Keep trying, it's great |
| *🍍 | 10 | 2025.9.21 | |
| E*f | 1 | 2025.9.20 | |
| *记 | 1 | 2025.9.20 | |
| z*u | 2 | 2025.9.19 | |
| **昊 | 5 | 2025.9.17 | |
| *号 | 1 | 2025.9.15 | |
| T*T | 2 | 2025.9.15 | Appreciate |
| *家 | 10 | 2025.9.10 | |
| *X | 1.11 | 2025.9.3 | |
| *飙 | 20 | 2025.8.31 | From Lao Tong, thanks |
| *下 | 1 | 2025.8.30 | |
| 2*D | 88 | 2025.8.13 Afternoon | |
| 2*D | 1 | 2025.8.13 Morning | |
| S*o | 1 | 2025.8.05 | Supporting |
| *侠 | 10 | 2025.8.04 | |
| x*x | 2 | 2025.8.03 | trendRadar great project appreciate |
| *远 | 1 | 2025.8.01 | |
| *邪 | 5 | 2025.8.01 | |
| *梦 | 0.1 | 2025.7.30 | |
| **龙 | 10 | 2025.7.29 | Supporting |
</details>
<br>
## 🪄 Sponsors
<div align="center">
> **Position available**
</div>
<br>
<a name="-support-the-project"></a>
### ❤️ Appreciate if you like it
> If TrendRadar has helped you capture value, consider giving it a boost to help it continue to evolve
>
> The amount is arbitrary, and even 1 yuan is an encouragement for open-source. Welcome to leave a message when appreciating (´▽`ʃ♡ƪ)
<div align="center">
| WeChat Appreciation | Alipay Appreciation |
|:---:|:---:|
| <img src="https://cdn-1258574687.cos.ap-shanghai.myqcloud.com/img/%2F2025%2F07%2F17%2F2ae0a88d98079f7e876c2b4dc85233c6-9e8025.JPG" width="240" alt="WeChat Appreciation"> | <img src="https://cdn-1258574687.cos.ap-shanghai.myqcloud.com/img/%2F2025%2F07%2F17%2F1ed4f20ab8e35be51f8e84c94e6e239b4-fe4947.JPG" width="240" alt="Alipay Appreciation"> |
</div>
### 🤝 Secondary development and citation
If you use or refer to the ideas or core code of this project in your project, **welcome** to note the source and attach the link to this repository.
This will help with the continued maintenance and development of the project, thank you for your respect and support! ❤️
### 💬 Communication and feedback
- **GitHub Issues**: Suitable for specific technical issues. Please provide complete information (screenshots, error logs, etc.) when asking questions, which helps with quick positioning.
- **Public account communication**: It is recommended to communicate in the comment area under relevant articles. If you need to ask questions in the background, **liking/recommending** the article is the best "doorstep", I can feel this intention in the background (´▽`ʃ♡ƪ).
- **QQ group communication**: Follow the public account and reply " **Communication Group** " to join. Whether you are an AI novice or a hardcore developer, you are welcome here. The group is mainly for mutual assistance and communication, and inspiration collision. Please read the group announcement before joining; when asking questions, describe the problem clearly and attach screenshots, and group friends will help if they have time. Everyone's practical experience is often faster and more comprehensive than I am 🤝
> **Friendly reminder**:
> This project is for open-source sharing, not a commercial product. Treat the author as a friend rather than customer service, and the communication efficiency will be higher!
<div align="center">
|Public Account Follow |
|:---:|
| <img src="_image/weixin.png" width="500" title="硅基茶水间"/> |
</div>
<br>
## 📝 Update Log
> **📌 View the latest updates**: **[Original repository update log](https://github.com/sansan0/TrendRadar?tab=readme-ov-file#-更新日志)** :
- **Tips**: It is recommended to view the [historical updates] and clarify the specific [functional content]
### 2026/03/28 - v6.6.0
- **HTML report browser enhancement**: When opening the report in the browser, it automatically switches to a wide-screen layout. Keyword grouping and independent display areas support quick tab switching, and the search box filters news titles in real-time. The email client still displays the original narrow-screen layout.
- **Dark mode**: One-click switching to a dark theme, automatically remembering preferences, suitable for nighttime reading.
- **One-click copy news**: Hover over the news serial number to copy the title and link, making it easy to share quickly.
- **Export optimization**: The whole page screenshot and segmented screenshot are merged into a drop-down export button. The screenshot automatically restores a clean layout.
- **Shortcut key system**: Supports `W` wide-screen switching, `D` dark mode, `/` search, `?` view shortcut key prompts.
- **Reading progress bar**: The top of the page displays the reading progress in real-time.
### 2026/02/09 - mcp-v4.0.0
- **🔥 AI message direct push to all channels**: Let AI-written content be pushed to 9 channels like Feishu, DingTalk, Telegram, and email with one click. Markdown automatically adapts to each platform's format, eliminating format differences.
- **New formatting strategy guide**: Added `get_channel_format_guide` tool, telling AI what format each channel supports and what limitations it has, making the generated content better formatted.
- **Intelligent batch sending**: Super long messages are automatically split according to each channel's byte limit (Feishu 30KB, DingTalk 20KB, etc.). The configuration is read from config.yaml.
- **Fix channel misdetection**: ntfy is no longer misreported as "configured" due to the default address.
- **Code reuse optimization**: Batch processing functions directly reuse the trendradar core module, eliminating duplicate wheel creation.
<details>
<summary>👉 Click to expand: <strong>Historical updates</strong></summary>
### 2026/03/12 - v6.5.0
- **AI intelligent screening system**: No need to manually set keywords! In `ai_interests.txt`, write down the directions you care about in everyday language (e.g., "I want to see AI and new energy-related news"), AI will automatically extract tags and score each piece of news, only pushing content that is truly relevant to you. If AI screening has issues, it will automatically switch back to keyword matching, and the push will not be interrupted.
- **Different screening methods and focus directions can be set for each time period**: Each time period in Timeline can now be set independently with what method to use for screening and what type of news to look at. For example: In the morning, use "tech keywords" to quickly filter, and in the evening, switch to "financial AI interest description" for in-depth screening - the same system, different content can be viewed at different times.
- **AI analysis range is independent of push**: The data range analyzed by AI can be different from the pushed content. For example, the push only sends new messages (to avoid repeated disturbance), but AI analyzes all the news of the day (to see the complete trend). Each time period can also be set separately for AI analysis mode.
- **AI screening saves money intelligently**: Already analyzed news will not consume duplicate tokens; after the interest description is modified, AI automatically judges the change amplitude - small changes only update affected tags, and large changes require a full reclassification.
- **Multi-file configuration and tag isolation**: Custom keyword files are placed in `config/custom/keyword/`, AI interest files are placed in `config/custom/ai/`, and tags generated by different files are independent and do not interfere with each other.
- **AI translation precise control**: You can control whether the hot list, RSS, and independent display area are translated separately. Areas that are not enabled for display will automatically skip, saving tokens.
- **Remote storage batch upload**: Multiple write operations are accumulated and submitted to the cloud at once, reducing API call times.
- **Limit on the number of news items displayed per group**: Control the maximum number of news items displayed per group through `max_news_per_keyword`, avoiding a single popular topic occupying the entire push.
- **Intelligent detection of time period conflicts**: If two time periods have overlapping time, the system will automatically report an error and remind you to modify it to avoid configuration conflicts leading to unexpected behavior.
- Fix several bugs.
### 2026/02/09 - v6.0.0
> **Breaking Change**: Configuration file upgrade (config.yaml 2.0.0), old `push_window` and `analysis_window` configurations are no longer compatible, please refer to the new config.yaml migration.
- **Unified scheduling system**: Added `timeline.yaml`, using a set of configurations to control 'when to collect / push / AI analyze'.
- **5 preset templates**: `always_on` (24/7, default), `morning_evening` (morning and evening summary), `office_hours` (office hours), `night_owl` (night owl), `custom` (custom); also supports adding your own templates under `presets:`, as long as the key is not repeated, and then fill in your template name in config.yaml.
- **Flexible time period configuration**: Supports workday/weekend differences, cross-midnight time periods, and per-period once deduplication.
- **Visual configuration editor**:
- Added `timeline.yaml` editing tab, alongside config.yaml and frequency_words.txt.
- Preset mode card selection: click to switch, automatically synchronize config.yaml's `schedule.preset`.
- Weekly timeline: 7 days × 24 hours horizontal bar, using color to distinguish push/analysis/collect status.
- Interactive controls: switches, drop-down boxes, time selectors, right-side modifications synchronize to left YAML in real-time.
- Weekly mapping drop-down selection: dynamically filled according to daily plans, drag and drop to complete scheduling configuration.
- **AI prompt word stability optimization** (ai_analysis_prompt.txt v2.0.0):
- Format specification independent description: extract line breaks/tags/serial numbers/prohibited items from JSON value as an independent chapter.
- JSON template simplification: field descriptions shortened to one sentence + word limit, reducing AI output format confusion.
- Remove Markdown format from system prompt, consistent with "prohibit Markdown" instruction.
- All JSON fields declared as optional, missing fields will not report errors, enhancing fault tolerance.
- **New independent display area AI summary analysis** (`ai_analysis.include_standalone`):
- New independent switch, after opening, AI generates core summaries for each standalone source.
- AI analysis and push display decoupling: no need to enable push display in the independent display area, AI can also independently analyze complete hot list data.
- Supports hot list platforms and RSS sources, including ranking/time/tracks data.
- Track analysis and `include_rank_timeline` linkage: when enabled, use track data for in-depth trend analysis, when closed, based on ranking for simple judgment.
- New `standalone_summaries` JSON field (independent source quick view), all push channels have adapted rendering.
### 2026/01/28 - v5.5.0
> It's the same as mcp functionality, I won't open a new repository for this small tool, it's pure front-end, so I'll keep it together.
- Add trendradar's visual configuration editor.
2026/02/02 - mcp-v3.2.0
- **New read_article tool**: Read the full text of a single article (in Markdown format) using Jina AI Reader.
- **New read_articles_batch tool**: Batch read multiple articles (up to 5, with automatic speed limiting).
- **Recommended workflow**: `search_news(query="keyword", include_url=True)` → `read_article(url=...)` to read the full text.
- **Documentation update**: README-MCP-FAQ.md and README-MCP-FAQ-EN.md added Q19-Q20 article reading related instructions.
### 2026/01/10 - mcp-v3.0.0~v3.1.5
- **Breaking Change**: All tool return values unified to `{success, summary, data, error}` structure.
- **Asynchronous consistency**: All 21 tool functions use `asyncio.to_thread()` to wrap synchronous calls.
- **MCP Resources**: Added 4 resources (platforms, rss-feeds, available-dates, keywords).
- **RSS enhancement**: `get_latest_rss` supports multi-day queries (days parameter), cross-date URL deduplication.
- **Regular expression fix**: `get_trending_topics` supports `/pattern/` regular expression syntax and `display_name`.
- **Cache optimization**: Added `make_cache_key()` function, parameter sorting + MD5 hash to ensure consistency.
- **New check_version tool**: Supports checking TrendRadar and MCP Server version updates simultaneously.
### 2026/01/23 - v5.4.0
- Added independent control function for AI analysis mode, optional follow_report | daily | current | incremental.
- Added AI analysis time window control, supporting custom operation segments and daily frequency limits.
- Added configuration file version management function.
- Fixed several bugs.
### 2026/01/19 - v5.3.0
> **Major refactoring: AI module migration to LiteLLM**
- **Unified AI interface**: Use LiteLLM instead of manual implementation, supporting 100+ AI providers.
- **Simplified configuration**: Removed `provider` field, using `model: "provider/model_name"` format instead.
- **New features**: Automatic retry (`num_retries`), fallback models (`fallback_models`).
- **Configuration changes**:
- `ai.provider` → removed (merged into model)
- `ai.base_url` → `ai.api_base`
- `AI_PROVIDER` environment variable → removed
- `AI_BASE_URL` environment variable → `AI_API_BASE`
- **Model format examples**:
- DeepSeek: `deepseek/deepseek-chat`
- OpenAI: `openai/gpt-4o`
- Gemini: `gemini/gemini-2.5-flash`
- Anthropic: `anthropic/claude-3-5-sonnet`
### 2026/01/17 - v5.2.0
> Mainly see config.yaml description
**🌐 AI translation feature**
- **Multi-language translation**: Supports translating pushed content into any language.
- **Batch translation**: Intelligent batch processing to reduce API call times.
- **Customizable prompts**: Supports custom translation styles.
**🔧 Configuration architecture optimization**
- **AI model configuration independence**: Analysis and translation share model configuration.
- **Regional switch unification**: Unified management of regional display.
- **Regional sorting customization**: Supports custom display order for each region.
**✨ AI analysis enhancement**
- **AI analysis embedded in HTML**: Analysis results directly embedded in HTML reports, with direct email notifications.
- **Rich-style AI blocks**: Gradient blue background card layout, clearly separating analysis dimensions.
- **Ranking timeline support**: AI can obtain precise ranking for each news at each crawl time point.
- **Sector reorganization (7→4)**: Integrated into core hotspot situation, public opinion trend controversy, abnormal and weak signals, and research strategy suggestions.
**🔧 Multi-model adaptation**
- **Universal parameter pass-through**: Supports passing arbitrary advanced parameters to API.
- **Gemini adaptation**: Native parameter support, built-in security strategy relaxation.
**🐛 Bug fixes**
- Fixed several known issues, improving system stability.
### 2026/01/10 - v5.0.0
> **Development episode**:
> A tribute to the model that accompanied me for over two years, but after renewing, it popped up with `"This organization has been disabled"`.
**✨ Pushed content "five major sections" refactoring**
This update refactored the pushed message into five core sections:
1. **📊 Hotlist news**: Precisely screened hotspots based on your keywords.
2. **📰 RSS subscription**: Your personalized subscription source content, supporting grouping by keywords.
3. **🆕 New additions**: Real-time capture of new hotspots since the last run (marked with 🆕).
4. **📋 Independent display area**: Complete hotlist or RSS source display for specified platforms, **completely不受关键词过滤限制**.
5. **✨ AI analysis section**: AI-driven deep insights, including trend overview, heat trend, and **extremely important** emotional tendency analysis.
**✨ AI intelligent analysis push function**
- **AI analysis integration**: Use large AI models to deeply analyze pushed content, automatically generating hotspot trend overview, keyword heat analysis, cross-platform association, potential impact assessment, etc.
- **Emotional tendency analysis**: Added deep emotional recognition, accurately capturing positive, negative, controversial, or concerned emotions in public opinion.
- **Multi-AI provider support**: Supports DeepSeek (default, high cost-effectiveness), OpenAI, Google Gemini, and any OpenAI-compatible interface.
- **Two push modes**: `only_analysis` (only AI analysis), `both` (both pushed).
- **Customizable prompts**: Customize AI analysis roles and output formats through `config/ai_analysis_prompt.txt` file.
- **Multi-dimensional data analysis**: AI can analyze ranking changes, heat duration, cross-platform performance, trend prediction, etc.
**📋 Independent display area function**
- **Complete hotlist display**: Specified platform's complete hotlist displayed separately, not affected by keyword filtering.
- **RSS independent display**: RSS source content can be displayed completely, suitable for content-limited subscription sources.
- **Flexible configuration**: Supports configuring display platform lists, RSS source lists, and maximum display number.
**📊 Push experience refactoring**
- **Layout upgrade**: Redesigned and unified statistical headers for each channel, strengthened block organization, and clear message hierarchy.
- **Configuration simplification**: Optimized configuration logic for notification channels like Feishu, making it easier to get started.
- **Heat trend arrow**: Added 🔺 (up), 🔻 (down), ➖ (stable) trend indicators, intuitively displaying heat changes.
- **Universal Webhook**: Supports custom Webhook URL and JSON template, easily adapting to Discord, Matrix, IFTTT, and other platforms.
**🔧 Configuration optimization**
- **Frequency word configuration enhancement**: Added `[group alias]` syntax, supports `#` comment lines, making configuration clearer (thanks to [@songge8](https://github.com/sansan0/TrendRadar/issues/752) for the suggestion).
- **Environment variable support**: AI analysis-related configurations support environment variable coverage (`AI_API_KEY`, `AI_PROVIDER`, etc.).
> 💡 See the detailed configuration tutorial at [让 AI 帮我分析热点](#12-让-ai-帮我分析热点)
### 2026/01/02 - v4.7.0
- **Fix RSS HTML display**: Fixed rendering issues due to mismatched RSS data formats, now correctly displayed by keyword grouping.
- **Added regular expression syntax**: Keyword configuration supports `/pattern/` regular expression syntax, solving English substring mis-matching issues (e.g., `ai` matching `training`).
- **Added display name syntax**: Use `=> remark` to give complex regular expressions a memorable name, making push message display clearer (e.g., `/\bai\b/ => AI相关`).
- **No regular expression?** README added AI-generated regular expression guide, telling ChatGPT/Gemini/DeepSeek what you want to match, and letting AI help you write.
### 2025/12/30 - mcp-v2.0.0
- **Architecture adjustment**: Removed TXT support, unified use of SQLite database.
- **RSS query**: Added `get_latest_rss`, `search_rss`, `get_rss_feeds_status`.
- **Unified search**: `search_news` supports `include_rss` parameter to search hotlists and RSS simultaneously.
### 2026/01/01 - v4.6.0
- **Fix RSS HTML display**: Merged RSS content into hotlist HTML page, displayed by source grouping.
- **Added display_mode configuration**: Supports `keyword` (grouped by keyword) and `platform` (grouped by platform) display modes.
### 2025/12/30 - v4.5.0
- **RSS subscription source support**: Added RSS/Atom crawling, grouped by keyword statistics (consistent with hotlist format).
- **Storage structure refactoring**: Flattened directory structure `output/{type}/{date}.db`.
- **Unified sorting configuration**: `sort_by_position_first` affects both hotlists and RSS.
- **Configuration structure refactoring**: `config.yaml` reorganized into 7 logical groups (app, report, notification, storage, platforms, rss, advanced), with clearer configuration paths.
### 2025/12/26 - mcp-v1.2.0
**MCP module update - optimized toolset, added aggregation comparison function, merged redundant tools:**
- Added `aggregate_news` tool - cross-platform news deduplication and aggregation.
- Added `compare_periods` tool - period comparison analysis (week-on-week/month-on-month).
- Merged `find_similar_news` + `search_related_news_history` → `find_related_news`.
- Enhanced `get_trending_topics` - added `auto_extract` mode for automatic hotspot extraction.
- Fixed several bugs.
- Synchronously updated README-MCP-FAQ.md documentation in Chinese and English (Q1-Q18).
### 2025/12/20 - v4.0.3
- Added URL standardization function to solve duplicate push issues caused by dynamic parameters (e.g., `band_rank`) on platforms like Weibo.
- Fixed incremental mode detection logic to correctly identify historical titles.
### 2025/12/17 - v4.0.1
- StorageManager added push record proxy method.
- S3 client switched to virtual-hosted style to improve compatibility (supporting more services like Tencent Cloud COS).
### 2025/12/13 - mcp-v1.1.0
**MCP module update:**
- Adapted to v4.0.0, also compatible with v3.x data.
- Added storage synchronization tools: `sync_from_remote`, `get_storage_status`, `list_available_dates`.
### 2025/12/13 - v4.0.0
**🎉 Major update: comprehensive refactoring of storage and core architecture**
- **Multi-storage backend support**: Introduced a new storage module, supporting local SQLite and remote cloud storage (S3 compatible protocol, e.g., Cloudflare R2), adapting to GitHub Actions, Docker, and local environments.
- **Database structure optimization**: Refactored SQLite database table structure to improve data efficiency and query capabilities.
- **Core code modularization**: Main program logic split into multiple modules of the trendradar package, significantly improving code maintainability.
- **Enhanced features**: Implemented date format standardization, data retention strategy, time zone configuration support, time display optimization, and fixed remote storage data persistence issues to ensure accurate data merging.
- **Cleanup and compatibility**: Removed most historical compatibility code and unified data storage and reading methods.
### 2025/12/03 - v3.5.0
**🎉 Core feature enhancement**
1. **Multi-account push support**
- All push channels (Feishu, Dingding, Enterprise WeChat, Telegram, ntfy, Bark, Slack) support multi-account configuration.
- Use semicolons `;` to separate multiple accounts, e.g., `FEISHU_WEBHOOK_URL=url1;url2`.
- Automatically verify paired configuration (e.g., Telegram's token and chat_id) quantity consistency.
2. **Push area configuration**
- Customize display order for each area through `display.region_order` (replacing `reverse_content_order` in v5.2.0).
- Control display of each area through `display.regions` (hotlist, new hotspots, RSS, independent display area, AI analysis).
3. **Global filtering keywords**
- Added `[GLOBAL_FILTER]` area marker, supporting global filtering of unwanted content.
- Applicable scenarios: filtering advertisements, marketing, low-quality content, etc.
**🐳 Docker double-path HTML generation optimization**
- **Problem fix**: Solved the issue of `index.html` not synchronizing to the host in the Docker environment.
- **Double-path generation**: Generate today's summary HTML in two locations:
- `index.html` (project root directory): for GitHub Pages access.
- `output/index.html`: accessible through Docker Volume mounting, allowing the host to directly access.
- **Compatibility**: Ensured that Docker, GitHub Actions, and local running environments can access the web report.
**🐳 Docker MCP image support**
- Added independent MCP service image `wantcat/trendradar-mcp`.
- Supports Docker deployment of AI analysis function through HTTP interface (port 3333).
- Two-container architecture: news push service and MCP service run independently, allowing separate scaling and restart.
- See [Docker deployment - MCP service](#6-docker-部署).
**🌐 Web server support**
- Added built-in web server, supporting access to generated reports through a browser.
- Control startup/stop through `manage.py` command: `docker exec -it trendradar python manage.py start_webserver`.
- Access address: `http://localhost:8080` (port configurable).
- Security features: static file service, directory restriction, local access.
- Supports automatic startup and manual control modes.
**📖 Documentation optimization**
- Added [How to display pushed content?](#7-推送内容怎么显示) section: customize push style and content.
- Added [When will I be pushed?](#8-什么时候给我推送) section: set push time periods.
- Added [How often do I run?](#9-多久运行一次) section: set automatic running frequency.
- Added [Push to multiple groups/devices](#10-推送到多个群设备) section: push to multiple receivers simultaneously.
- Optimized configuration sections: unified addition of "configuration location" instructions.
- Simplified quick start configuration instructions: three core files at a glance.
- Optimized [Docker deployment](#6-docker-部署) section: added image instructions, recommended git clone deployment, and reorganized deployment methods.
**🔧 Upgrade instructions**:
- **GitHub Fork users**: update `main.py`, `config/config.yaml`.
- **Multi-account push**: new feature, default not enabled, existing single-account configurations unaffected.
### 2025/11/26 - mcp-v1.0.3
**MCP module update:**
- Added date parsing tool `resolve_date_range` to solve AI model date calculation inconsistencies.
- Supports natural language date expression parsing (this week, last 7 days, last month, etc.).
- Tool count increased from 13 to 14.
### 2025/11/28 - v3.4.1
**🔧 Format optimization**
1. **Bark push enhancement**
- Bark now supports Markdown rendering.
- Enabled native Markdown format: bold, links, lists, code blocks, etc.
- Removed pure text conversion, fully utilizing Bark's native rendering capabilities.
2. **Slack format precision**
- Use dedicated mrkdwn format to process batch content.
- Improved byte size estimation accuracy (avoiding message overrun).
- Optimized link format: `<url|text>` and bold syntax: `*text*`.
3. **Performance improvement**
- Format conversion completed during batch processing, avoiding secondary processing.
- Accurately estimated message size, reducing send failure rate.
**🔧 Upgrade instructions**:
- **GitHub Fork users**: update `main.py`, `config.yaml`.
### 2025/11/25 - v3.4.0
**🎉 Added Slack push support**
1. **Team collaboration push channel**
- Supports Slack Incoming Webhooks (popular team collaboration tool).
- Messages centrally managed, suitable for teams to share hotspots.
- Supports mrkdwn format (bold, links, etc.).
2. **Multiple deployment methods**
- GitHub Actions: configure `SLACK_WEBHOOK_URL` Secret.
- Docker: environment variable `SLACK_WEBHOOK_URL`.
- Local run: `config/config.yaml` configuration file.
> 📖 **Detailed configuration tutorial**: [Quick Start - Slack Push](#-快速开始)
- Optimized setup-windows.bat and setup-windows-en.bat for one-click MCP installation.
**🔧 Upgrade instructions**:
- **GitHub Fork users**: update `main.py`, `config/config.yaml`, `.github/workflows/crawler.yml`.
### 2025/11/24 - v3.3.0
**🎉 Added Bark push support**
1. **iOS exclusive push channel**
- Supports Bark push (based on APNs, iOS platform).
- Free and open-source, simple and efficient, without ad interference.
- Supports official servers and self-built servers.
2. **Multiple deployment methods**
- GitHub Actions: configure `BARK_URL` Secret.
- Docker: environment variable `BARK_URL`.
- Local run: `config/config.yaml` configuration file.
> 📖 **Detailed configuration tutorial**: [Quick Start - Bark Push](#-快速开始)
**🐛 Bug fix**
- Fixed `config.yaml` `ntfy_server_url` configuration not taking effect ([#345](https://github.com/sansan0/TrendRadar/issues/345)).
**🔧 Upgrade instructions**:
- **GitHub Fork users**: update `main.py`, `config/config.yaml`, `.github/workflows/crawler.yml`.
### 2025/11/23 - v3.2.0
**🎯 Added advanced customization features**
1. **Keyword sorting priority configuration**
- Supports two sorting strategies: heat priority vs. configuration order priority.
- Satisfies different usage scenarios: hotspot tracking or personalized focus.
2. **Display quantity precise control**
- Global configuration: uniformly limit all keyword display quantities.
- Separate configuration: use `@number` syntax to set limits for specific keywords.
- Effectively control push length, highlighting key content.
> 📖 **Detailed configuration tutorial**: [Keyword configuration - Advanced configuration](#关键词高级配置)
**🔧 Upgrade instructions**:
- **GitHub Fork users**: update `main.py`, `config/config
### 2025/11/22 - v3.1.1
- **Fix crash caused by data exception**: Resolves the `'float' object has no attribute 'lower'` error encountered by some users in the GitHub Actions environment
- Added dual protection mechanism: Filters out invalid titles (None, float, empty string) during data acquisition and adds type checking at function calls
- Improved system stability to ensure normal operation even when data source returns abnormal format
**Upgrade Instructions** (GitHub Fork Users):
- Must update: `main.py`
- Recommended to use small version upgrade method: copy and replace the above file
### 2025/11/20 - v3.1.0
- **Added personal WeChat push support**: Enterprise WeChat applications can push to personal WeChat without installing the Enterprise WeChat APP
- Supports two message formats: `markdown` (Enterprise WeChat group robot) and `text` (personal WeChat application)
- Added `WEWORK_MSG_TYPE` environment variable configuration, supporting multiple deployment methods such as GitHub Actions, Docker, and docker compose
- `text` mode automatically clears Markdown syntax to provide pure text push effect
- See the "Personal WeChat Push" configuration instructions in the Quick Start for details
**Upgrade Instructions** (GitHub Fork Users):
- Must update: `main.py`, `config/config.yaml`
- Optional update: `.github/workflows/crawler.yml` (if using GitHub Actions deployment)
- Recommended to use small version upgrade method: copy and replace the above files
### 2025/11/12 - v3.0.5
- Fixed email sending SSL/TLS port configuration logic error
- Optimized email service providers (QQ/163/126) to use port 465 (SSL) by default
- **Added Docker environment variable support**: Core configuration items (`enable_crawler`, `report_mode`, `push_window`, etc.) support overriding through environment variables, solving the issue of NAS users' modified configuration files not taking effect (see [🐳 Docker Deployment](#-docker-deployment) chapter for details)
### 2025/10/26 - mcp-v1.0.1
**MCP Module Update:**
- Fixed date query parameter passing error
- Unified time parameter format for all tools
### 2025/10/31 - v3.0.4
- Solved the error caused by Feishu pushing content that is too long, and implemented batched pushing
### 2025/10/23 - v3.0.3
- Expanded ntfy error information display range
### 2025/10/21 - v3.0.2
- Fixed ntfy push encoding issue
### 2025/10/20 - v3.0.0
**Major Update - AI Analysis Function Launched**
- **Core Features**:
- Added AI analysis server based on MCP (Model Context Protocol)
- Supports 17 intelligent analysis tools: basic query, intelligent retrieval, advanced analysis, RSS query, system management
- Natural language interaction: query and analyze news data through conversation
- Multi-client support: Claude Desktop, Cherry Studio, Cursor, Cline, etc.
- **Analysis Capabilities**:
- Topic trend analysis (heat tracking, life cycle, explosion detection, trend prediction)
- Data insights (platform comparison, activity statistics, keyword co-occurrence)
- Sentiment analysis, similar news search, intelligent summary generation
- Historical related news retrieval, multi-mode search
- **Update Instructions**:
- This is an independent AI analysis function that does not affect existing push functions
- Can be used selectively without upgrading existing deployment
### 2025/10/15 - v2.4.4
- **Update Content**:
- Fixed ntfy push encoding issue + 1
- Fixed push time window judgment issue
- **Update Instructions**:
- Recommended to use [small version upgrade]
### 2025/10/10 - v2.4.3
> Thanks to [nidaye996](https://github.com/sansan0/TrendRadar/issues/98) for discovering the experience issue
- **Update Content**:
- Refactored "silent push mode" to "push time window control" to improve functional understanding
- Clearly defined push time window as an optional additional function, which can be used with three push modes
- Improved comments and documentation descriptions to make functional positioning clearer
- **Update Instructions**:
- This is just a refactoring, and you don't need to upgrade
### 2025/10/8 - v2.4.2
- **Update Content**:
- Fixed ntfy push encoding issue
- Fixed configuration file missing issue
- Optimized ntfy push effect
- Added GitHub page image segmented export function
- **Update Instructions**:
- Recommended to use [major version update]
### 2025/10/2 - v2.4.0
**Added ntfy push notification**
- **Core Features**:
- Supports ntfy.sh public service and self-hosted server
- **Usage Scenarios**:
- Suitable for users who pursue privacy (support self-hosting)
- Cross-platform push (iOS, Android, Desktop, Web)
- No need to register an account (public server)
- Open-source and free (MIT protocol)
- **Update Instructions**:
- Recommended to use [major version update]
### 2025/09/26 - v2.3.2
- Corrected the issue of email notification configuration check being missed ([#88](https://github.com/sansan0/TrendRadar/issues/88))
**Repair Instructions**:
- Solved the issue where the system still prompts "no webhook configured" even if the email notification is correctly configured
### 2025/09/22 - v2.3.1
- **Added email push function**, supporting sending hot news reports to email
- **Intelligent SMTP identification**: Automatically identifies 10+ email service providers' configurations, such as Gmail, QQ mailbox, Outlook, and NetEase mailbox
- **HTML exquisite format**: Email content adopts the same HTML format as the web version, with beautiful layout and mobile-end adaptation
- **Batch sending support**: Supports multiple recipients, separated by commas, to send to multiple people at once
- **Custom SMTP**: Customizable SMTP server and port
- Fixed Docker build network connection issue
**Usage Instructions**:
- Applicable scenarios: Suitable for users who need email archiving, team sharing, and timing reports
- Supported email: Gmail, QQ mailbox, Outlook/Hotmail, 163/126 mailbox, Sina mailbox, Sohu mailbox, etc.
**Update Instructions**:
- This update has more content, and if you want to upgrade, it is recommended to use [major version upgrade]
### 2025/09/17 - v2.2.0
- Added one-click save news picture function, making it easy to share hotspots
**Usage Instructions**:
- Applicable scenarios: When you enable the web version function (GitHub Pages) according to the tutorial
- Usage method: Open the webpage link with your mobile phone or computer, click the "Save as Picture" button at the top of the page
- Actual effect: The system will automatically make the current news report into a beautiful picture and save it to your mobile phone album or computer desktop
- Convenient sharing: You can directly send the picture to friends, post it on Moments, or share it to the work group, letting others see the important information you found
### 2025/09/13 - v2.1.2
- Solved the issue of DingTalk push capacity limit causing news push failure (adopted batched push)
### 2025/09/04 - v2.1.1
- Fixed the issue of Docker not running normally on certain architectures
- Officially released the official Docker image wantcat/trendradar, supporting multiple architectures
- Optimized Docker deployment process, no need for local build to quickly use
### 2025/08/30 - v2.1.0
**Core Improvements**:
- **Push logic optimization**: Changed from "pushing every execution" to "controllable pushing within a time window"
- **Time window control**: Can set push time range to avoid disturbing during non-working hours
- **Push frequency optional**: Supports single push or multiple pushes within a time period
**Update Instructions**:
- This function is disabled by default and needs to be manually enabled in config.yaml
- Upgrade requires updating main.py and config.yaml files simultaneously
### 2025/08/27 - v2.0.4
- This version is not a functional fix but an important reminder
- Please properly keep webhooks confidential, do not expose them publicly, and do not put them in config.yaml
- If you have exposed webhooks or put them in config.yaml, it is recommended to delete and regenerate them
### 2025/08/06 - v2.0.3
- Optimized GitHub page web version effect for mobile-end use
### 2025/07/28 - v2.0.2
- Refactored code
- Solved the issue of version number being easily missed and modified
### 2025/07/27 - v2.0.1
**Fixed Issues**:
1. Docker shell script line ending character CRLF caused execution exception
2. frequency_words.txt being empty caused news sending to be empty logic issue
- Fixed, when you choose frequency_words.txt to be empty, it will **push all news**, but limited by message push size, please make adjustments as follows
- Solution 1: Close mobile push and only choose GitHub Pages deployment (this is the best solution, which will reorder hotspots from all platforms according to your **custom hotspot algorithm**)
- Solution 2: Reduce push platforms, prioritize **Enterprise WeChat** or **Telegram**, which have batched push functions (because batched push affects push experience, and only these two platforms have limited push capacity, so I had to implement batched push function, but at least ensure complete information)
- Solution 3: Can be combined with Solution 2, mode selection current or incremental can effectively reduce one-time push content
### 2025/07/17 - v2.0.0
**Major Refactor**:
- Configuration management refactor: All configurations are now managed through `config/config.yaml` file (main.py remains unchanged for easy copying and upgrading)
- Running mode upgrade: Supports three modes - `daily` (daily summary), `current` (current ranking), `incremental` (incremental monitoring)
- Docker support: Complete Docker deployment solution, supporting containerized operation
**Configuration File Instructions**:
- `config/config.yaml` - Main configuration file (application settings, crawler configuration, notification configuration, platform configuration, etc.)
- `config/frequency_words.txt` - Keyword configuration (monitoring vocabulary settings)
### 2025/07/09 - v1.4.1
**New Features**: Added incremental push (configured at the head of main.py, FOCUS_NEW_ONLY), which only cares about new topics rather than continuous heat, and only sends notifications when new content appears.
**Fixed Issues**: Occasional layout anomalies caused by special symbols in news itself.
### 2025/06/23 - v1.3.0
Enterprise WeChat and Telegram push message have length limits, so I adopted splitting and pushing messages. Development documentation can be found in [Enterprise WeChat](https://developer.work.weixin.qq.com/document/path/91770) and [Telegram](https://core.telegram.org/bots/api)
### 2025/06/21 - v1.2.1
In versions prior to this, not only main.py needs to be copied and replaced, but crawler.yml also needs to be copied and replaced
https://github.com/sansan0/TrendRadar/blob/master/.github/workflows/crawler.yml
### 2025/06/19 - v1.2.0
> Thanks to claude research for sorting out platform APIs, which helped me quickly complete platform adaptations (although the code is more redundant~
1. Supports Telegram, Enterprise WeChat, and DingTalk push channels, supporting multi-channel configuration and simultaneous push
### 2025/06/18 - v1.1.0
> **200 stars⭐**, continue to help! Recently, under my "encouragement", many people liked, shared, and recommended on my public account, and I saw the specific account encouragement data in the background. Many became angel-round old fans (I played on my public account for just over a month, although registered for seven or eight years, ha, early on and late off). But because you didn't leave a message or private message, I couldn't respond and thank you one by one. Thanks here!
1. Important update, added weight, and the news you see now are the hottest and most concerned at the top
2. Updated document usage, because recent updates have added many functions, and previous usage documents were written simply (see the complete tutorial for ⚙️ frequency_words.txt configuration below)
### 2025/06/16 - v1.0.0
1. Added a new version update prompt for the project, default on, if you want to turn it off, you can change True to False in main.py
### 2025/06/13+14
1. Removed compatible code, and previous fork students directly copying code will show abnormalities on the same day (will return to normal the next day)
2. Added a new news display at the bottom of Feishu and HTML
### 2025/06/09
**100 stars⭐**, write a small function to help!
Added a 'must-have word' function to frequency_words.txt using the + symbol
1. Must-have word syntax:
Tang Sanzang or Zhu Bajie must appear in the title simultaneously to be included in the pushed news
```
+Tang Sanzang
+Zhu Bajie
```
2. Filtering words have higher priority:
If the filtering words match "Tang Sanzang recites sutras", even if the must-have words have Tang Sanzang, it will not be displayed
```
+Tang Sanzang
!Tang Sanzang recites sutras
```
### 2025/06/02
1. **Webpage** and **Feishu message** support direct jump to news details
2. Optimized display effect + 1
### 2025/05/26
1. Optimized Feishu message display effect
<table>
<tr>
<td align="center">
Before optimization<br>
<img src="_image/before.jpg" alt="Feishu message interface - before optimization" width="400"/>
</td>
<td align="center">
After optimization<br>
<img src="_image/after.jpg" alt="Feishu message interface - after optimization" width="400"/>
</td>
</tr>
</table>
</details>
<br>
## ✨ Core Features
### **All-Network Hotspot Aggregation**
- Zhihu
- Douyin
- Bilibili hot search
- Wall Street insights
- Tieba
- Baidu hot search
- Financial news
- Pengpai News
- Phoenix
- The headline
- Weibo
Default monitoring of 11 mainstream platforms, can also add extra platforms
> 💡 Detailed configuration tutorial see [Configuration Instructions - Platform Configuration](#1-platform-configuration)
### **RSS Subscription Source Support** (added in v4.5.0)
Supports RSS/Atom subscription source crawling, grouped by keywords (consistent with hot list format):
- **Unified format**: RSS and hot list use the same keyword matching and display format
- **Simple configuration**: Directly add RSS source in `config.yaml`
- **Merged push**: Hot list and RSS merged into one message push
- **Freshness filtering**: Automatically filter old articles exceeding the specified number of days to avoid repeated pushes. Supports global default days and single-source independent settings
> 💡 RSS uses the same `frequency_words.txt` for keyword filtering
### **Visual Configuration Editor**
Provides a web-based graphical configuration interface, no need to manually edit YAML files, all configuration items can be modified and exported through the form.
👉 **Online experience**: [https://sansan0.github.io/TrendRadar/](https://sansan0.github.io/TrendRadar/)
<img src="/_image/editor.png" alt="Visual configuration editor" width="80%">
### **Intelligent Push Strategy**
**Three push modes**:
| Mode | Applicable scenarios | Push characteristics |
|------|---------|---------|
| **Daily Summary** (daily) | Enterprise managers/ordinary users | Pushes all matched news at a specified time (including previously pushed) |
| **Current Ranking** (current) | Self-media people/content creators | Pushes current ranking matched news (continuously on the list are pushed every time) |
| **Incremental Monitoring** (incremental) | Investors/traders | Only pushes new content, zero repetition |
> 💡 **Quick Selection Guide**:
> - Don't want to see repeated news → Use `incremental` (incremental monitoring)
> - Want to see complete ranking trends → Use `current` (current ranking)
> - Need daily summary reports → Use `daily` (daily summary)
>
> Detailed comparison and configuration tutorial see [Configuration Instructions - Push Mode Instructions](#3-push-mode-instructions)
**Additional Features** (optional):
| Feature | Description | Default |
|------|------|------|
| **Scheduling System** | Weekly scheduling: assign different time periods, push modes, and AI analysis strategies for each day. **Each period can have independent filtering (keywords/AI) and focus direction**. Built-in 5 presets (always_on / morning_evening / office_hours / night_owl / custom), can also be customized. Supports workday/weekend differentiation, cross-midnight periods, per-period de-duplication, and time-slot conflict detection (v6.0.0 + v6.5.0) | morning_evening |
| **Content Order Configuration** | Adjust display order of each area through `display.region_order`; control whether each area is displayed through `display.regions` (v5.2.0) | See configuration file |
| **Display Mode Switching** | `keyword`=grouped by keywords, `platform`=grouped by platform (added in v4.6.0) | keyword |
> 💡 Detailed configuration tutorial see [How to display push content?](#7-push-content-display) and [When will I be pushed?](#8-when-will-i-be-pushed)
### **Precise Content Filtering**
Set personal keywords (e.g., AI, BYD, education policy), only push relevant hotspots, filter out irrelevant information
> 💡 **Basic Configuration Tutorial**: [Keyword Configuration - Basic Syntax](#keyword-basic-syntax)
>
> 💡 **Advanced Configuration Tutorial**: [Keyword Configuration - Advanced Configuration](#keyword-advanced-configuration)
>
> 💡 Can also not filter, push all hotspots (leave `frequency_words.txt` blank)
### **AI Intelligent News Filtering** (added in v6.5.0)
Describe your interests in natural language, AI automatically classifies news, replacing traditional keyword matching
- **Natural Language Interest Description**: Write concern directions in daily language in `ai_interests.txt`, no need to learn keyword syntax
- **Two-Stage Intelligent Processing**: AI extracts structured labels from interest descriptions, then classifies news into labels and scores
- **Score Threshold Control**: Control push quality through `ai_filter.min_score`, only push high-correlation news
- **Automatic Fallback Guarantee**: Automatically fall back to keyword matching if AI filtering fails, ensuring push continuity
- **Intelligent Label Update**: When interests change, AI automatically assesses change amplitude and decides incremental or full reclassification
- **Flexible Switching**: `filter.method` supports `keyword` (default) and `ai` modes, Timeline can cover different periods
```yaml
# config.yaml quick enable example
filter:
method: ai # keyword (default) | ai
ai_filter:
min_score: 6 # minimum push score threshold (1-10)
```
> 💡 AI filtering shares model configuration with AI analysis/translation, only needs to configure `ai.api_key` once
### **Hotspot Trend Analysis**
Real-time tracking of news heat changes, letting you know not only "what's on the hot search" but also "how hotspots evolve"
- **Time Axis Tracking**: Records complete time span of each news from appearance to disappearance
- **Heat Change**: Statistics news ranking changes and appearance frequency in different periods
- **New Detection**: Real-time identifies new hotspots with new markers
- **Sustainability Analysis**: Distinguishes one-time hotspots and continuously fermenting in-depth news
- **Cross-Platform Comparison**: Same news performance on different platforms, seeing media attention differences
> 💡 Push format instructions see [Message Style Instructions](#5-what-do-i-receive)
**Personalized Hotspot Algorithm**
No longer be led by the algorithms of various platforms, TrendRadar will reorganize the hottest searches on the web.
> 💡 Three ratios can be adjusted, see [Configuration Details - Hotspot Weight Adjustment](#4-热点权重调整)
### **Multi-Channel and Multi-Account Push**
Supports **Enterprise WeChat** (+ WeChat push solution), **Feishu**, **DingTalk**, **Telegram**, **Email**, **ntfy**, **Bark**, **Slack**, **Generic Webhook** (can be connected to Discord, IFTTT and other platforms), messages reach mobile phones and email inboxes.
> 💡 For detailed configuration tutorials, see [Push to Multiple Groups/Devices](#10-推送到多个群设备)
### **AI Multi-Language Translation** (added in v5.2.0)
Translate push content into any language, breaking language barriers, whether it's reading domestic hotspots or subscribing to overseas information through RSS, you can easily get it in your native language.
- **One-Click Translation**: Set `ai_translation.enabled: true` and target language in `config.yaml`
- **Multi-Language Support**: Supports English, Korean, Japanese, French and other languages
- **Intelligent Batch Processing**: Automatic batch translation, reducing API call times, and saving costs
- **Customizable Style**: Customize translation style and terminology through `ai_translation_prompt.txt`
- **Shared Model Configuration**: Share the model settings of the `ai` configuration section with the AI analysis function
```yaml
# config.yaml quick enable example
ai_translation:
enabled: true
language: "English" # target language for translation
```
> 💡 The translation function shares model configuration with the AI analysis function, just configure `ai.api_key` once to use both functions.
**RSS Source Reference**: The following are some RSS subscription source collections, which can be selected as needed.
- [awesome-tech-rss](https://github.com/tuan3w/awesome-tech-rss) - Technology, entrepreneurship, programming blogs and media
- [awesome-rss-feeds](https://github.com/plenaryapp/awesome-rss-feeds) - Mainstream news media RSS collections from various countries
> ⚠️ Some overseas media content may involve sensitive topics, and AI models may refuse to translate. It is recommended to filter subscription sources according to actual needs.
### **HTML Report Browser Enhancement** (added in v6.6.0)
Open the pushed HTML report in the browser and automatically unlock the enhanced experience (email clients are not affected):
- **Wide-Screen Mode**: Desktop automatically switches to 1200px wide-screen layout, fully utilizing screen space
- **Tab Quick Switch**: Keyword grouping and independent exhibition areas both support Tab navigation, goodbye to long page scrolling
- **Dark Mode**: One-click switch to dark theme, automatically remember preferences
- **Real-Time Search**: Press `/` to wake up the search box, instantly filter news titles
- **One-Click Copy**: Hover over the news serial number to copy the title and link
- **Shortcuts**: `W` wide-screen, `D` dark mode, `/` search, `?` view all shortcuts
> 💡 All enhancements are based on progressive enhancement, and email clients still display the original 600px layout, with zero regression.
### **Flexible Storage Architecture** (major update in v4.0.0)
**Multi-Storage Backend Support**:
- **Remote Cloud Storage**: Default for GitHub Actions environment, supports S3 compatible protocol (R2/OSS/COS, etc.), data stored in the cloud, does not pollute the repository
- **Local SQLite Database**: Default for Docker/local environment, data is completely controllable
- **Automatic Backend Selection**: Intelligent switching of storage methods based on the running environment
> 💡 For detailed instructions, see [Where is the data stored?](#11-数据保存在哪里)
### **Multi-Platform Deployment**
- **GitHub Actions**: Timed automatic crawling + remote cloud storage (requires sign-in renewal)
- **Docker Deployment**: Supports multi-architecture containerized operation, data stored locally
- **Local Operation**: Windows/Mac/Linux direct operation
### **AI Analysis and Push** (added in v5.0.0)
Use large AI models to conduct in-depth analysis of push content and automatically generate hotspot insight reports.
- **Intelligent Analysis**: Automatically analyze hotspot trends, keyword heat, cross-platform association, and potential impact
- **Multi-Provider**: Based on LiteLLM unified interface, supports 100+ AI providers (DeepSeek, OpenAI, Gemini, Anthropic, local Ollama, etc.), also supports automatic switching of backup models
- **Independent Analysis Mode**: AI's analysis scope can be different from push - push only sends new messages (to avoid disturbance), but AI can analyze all news of the day (to see the complete trend)
- **Flexible Push**: Optional only original content, only AI analysis, or both
- **Customizable Prompt Words**: Customize analysis angles through `config/ai_analysis_prompt.txt`
> 💡 For detailed configuration tutorials, see [Let AI help me analyze hotspots](#12-让-ai-帮我分析热点)
### **Independent Display Area** (added in v5.0.0)
Provides a complete hot list display for specified platforms, not affected by keyword filtering.
- **Complete Hot List**: Complete display of the hot list for specified platforms, suitable for users who want to see the complete ranking
- **RSS Independent Display**: RSS source content can be displayed completely, without keyword restrictions
- **AI In-Depth Analysis**: Can independently enable AI to analyze the trend of the complete hot list, without displaying in push
- **Flexible Configuration**: Supports configuration of display platforms, RSS sources, and maximum number of articles
> 💡 For detailed configuration tutorials, see [How is the push content displayed? - Independent Display Area](#7-推送内容怎么显示)
### **AI Intelligent Analysis** (added in v3.0.0)
AI dialogue analysis system based on MCP (Model Context Protocol) protocol, allowing you to deeply mine news data with natural language.
> **💡 Usage Tips**: AI function requires local news data support
> - The project comes with test data, and you can experience the function immediately
> - It is recommended to deploy and run the project yourself to obtain more real-time data
>
> See [AI Intelligent Analysis](#-ai-智能分析) for details.
### **Web Deployment**
After running, the root directory generates `index.html`, which is a complete news report page.
> **Deployment Method**: Click **Use this template** to create a repository, which can be deployed to Cloudflare Pages or GitHub Pages and other static hosting platforms.
>
> **💡 Tips**: Enabling GitHub Pages can obtain an online access address. Go to the repository Settings → Pages to enable it. [Effect Preview](https://sansan0.github.io/TrendRadar/)
>
> ⚠️ The original GitHub Actions automatic storage function has been discontinued (this solution once caused high load on GitHub servers, affecting platform stability).
### **Reduce APP Dependence**
From being "kidnapped" by algorithm recommendations to actively obtaining the information you want.
**Suitable for**: Investors, self-media people, enterprise public relations, ordinary users concerned about current events.
**Typical Scenarios**: Stock market investment monitoring, brand public opinion tracking, industry dynamics attention, life information acquisition.
| Web Effect (Email Push Effect) | Feishu Push Effect | AI Analysis Push Effect |
|:---:|:---:|:---:|
|  |  |  |
<br>
## 🚀 Quick Start
> **Reminder**: It is recommended to **[view the latest official documentation](https://github.com/sansan0/TrendRadar?tab=readme-ov-file)** first to ensure that the configuration steps are the latest.
### Please Choose a Deployment Method That Suits You
#### 🅰️ Option 1: Docker Deployment (Recommended 🔥)
* **Features**: More stable than GitHub Actions, data stored locally (no need to configure cloud storage)
* **Applicable**: Those with their own servers, NAS, or long-running computers
* **Note**: You need to read and understand the basic configuration process below, then jump to the Docker tutorial for deployment.
#### 🅱️ Option 2: GitHub Actions Deployment (content of this section ⬇️)
* **Features**: Serverless, data stored in **remote cloud storage** (recommended configuration)
* **Applicable**: Users without servers, utilizing GitHub free resources
* **Note**: Cloud storage needs to be configured to obtain a complete experience, and periodic sign-in renewal is required.
### 1️⃣ Step 1: Obtain Project Code
Click the green **[Use this template]** button in the upper right corner of this repository page → select "Create a new repository".
> ⚠️ Reminder:
> - Subsequent documentation mentions "Fork" can be understood as "Use this template"
> - Using Fork may cause operational abnormalities, see [Issue #606](https://github.com/sansan0/TrendRadar/issues/606)
### 2️⃣ 第二步:设置 GitHub Secrets
在你 Fork 后的仓库中,进入 `Settings` > `Secrets and variables` > `Actions` > `New repository secret`
**📌 重要说明(请务必仔细阅读):**
- **一个 Name 对应一个 Secret**:每添加一个配置项,点击一次"New repository secret"按钮,填写一对"Name"和"Secret"
- **保存后看不到值是正常的**:出于安全考虑,保存后重新编辑时,只能看到 Name(名称),看不到 Secret(值)的内容
- **严禁自创名称**:Secret 的 Name(名称)必须**严格使用**下方列出的名称(如 `WEWORK_WEBHOOK_URL`、`FEISHU_WEBHOOK_URL` 等),不能自己随意修改或创造新名称,否则系统无法识别
- **可以同时配置多个平台**:系统会向所有配置的平台发送通知
**配置示例:**
<img src="_image/secrets.png" alt="GitHub Secrets 配置示例"/>
如上图所示,每一行是一个配置项:
- **Name(名称)**:必须使用下方展开内容中列出的固定名称(如 `WEWORK_WEBHOOK_URL`)
- **Secret(值)**:填写你从对应平台获取的实际内容(如 Webhook 地址、Token 等)
<br>
<details>
<summary>👉 点击展开:<strong>企业微信机器人</strong>(配置最简单最迅速)</summary>
<br>
**GitHub Secret 配置(⚠️ Name 名称必须严格一致):**
- **Name(名称)**:`WEWORK_WEBHOOK_URL`(请复制粘贴此名称,不要手打,避免打错)
- **Secret(值)**:你的企业微信机器人 Webhook 地址
<br>
**机器人设置步骤:**
#### 手机端设置:
1. 打开企业微信 App → 进入目标内部群聊
2. 点击右上角"…"按钮 → 选择"消息推送"
3. 点击"添加" → 名称输入"TrendRadar"
4. 复制 Webhook 地址,点击保存,复制的内容配置到上方的 GitHub Secret 中
#### PC 端设置流程类似
</details>
<details>
<summary>👉 点击展开:<strong>个人微信推送</strong>(基于企业微信应用,推送到个人微信)</summary>
<br>
> 由于该方案是基于企业微信的插件机制,推送样式为纯文本(无 markdown 格式),但可以直接推送到个人微信,无需安装企业微信 App。
**GitHub Secret 配置(⚠️ Name 名称必须严格一致):**
- **Name(名称)**:`WEWORK_WEBHOOK_URL`(请复制粘贴此名称,不要手打)
- **Secret(值)**:你的企业微信应用 Webhook 地址
- **Name(名称)**:`WEWORK_MSG_TYPE`(请复制粘贴此名称,不要手打)
- **Secret(值)**:`text`
<br>
**设置步骤:**
1. 完成上方的企业微信机器人 Webhook 设置
2. 添加 `WEWORK_MSG_TYPE` Secret,值设为 `text`
3. 按照下面图片操作,关联个人微信
4. 配置好后,手机上的企业微信 App 可以删除
<img src="_image/wework.png" title="个人微信推送配置"/>
**说明**:
- 与企业微信机器人使用相同的 Webhook 地址
- 区别在于消息格式:`text` 为纯文本,`markdown` 为富文本(默认)
- 纯文本格式会自动去除所有 markdown 语法(粗体、链接等)
</details>
<details>
<summary>👉 点击展开:<strong>飞书机器人</strong>(消息显示相对友好)</summary>
<br>
若启用 **AI 分析**,飞书推送偶发(约 5% 概率)会有数分钟延迟(推测为平台对 AI 生成内容的合规性审核)。
**GitHub Secret 配置(⚠️ Name 名称必须严格一致):**
- **Name(名称)**:`FEISHU_WEBHOOK_URL`(请复制粘贴此名称,不要手打)
- **Secret(值)**:你的飞书机器人 Webhook 地址(该链接开头类似 https://www.feishu.cn/flow/api/trigger-webhook/********)
<br>
有两个方案,**方案一**配置简单,**方案二**配置复杂(但是稳定推送)
其中方案一,由 **ziventian**发现并提供建议,在这里感谢他,默认是个人推送,也可以配置群组推送操作[#97](https://github.com/sansan0/TrendRadar/issues/97) ,
**方案一:**
> 对部分人存在额外操作,否则会报"系统错误"。需要手机端搜索下机器人,然后开启飞书机器人应用(该建议来自于网友,可参考)
1. 电脑浏览器打开 https://botbuilder.feishu.cn/home/my-command
2. 点击"新建机器人指令"
3. 点击"选择触发器",往下滑动,点击"Webhook 触发"
4. 此时你会看到"Webhook 地址",把这个链接先复制到本地记事本暂存,继续接下来的操作
5. "参数"里面放上下面的内容,然后点击"完成"
```json
{
"message_type": "text",
"content": {
"text": "{{内容}}"
}
}
```
6. 点击"选择操作" > "通过官方机器人发消息"
7. 消息标题填写"TrendRadar 热点监控"
8. 最关键的部分来了,点击 + 按钮,选择"Webhook 触发",然后按照下面的图片摆放

9. 配置完成后,将第 4 步复制的 Webhook 地址配置到 GitHub Secrets 中的 `FEISHU_WEBHOOK_URL`
<br>
**方案二:**
1. 电脑浏览器打开 https://botbuilder.feishu.cn/home/my-app
2. 点击"新建机器人应用"
3. 进入创建的应用后,点击"流程设计" > "创建流程" > "选择触发器"
4. 往下滑动,点击"Webhook 触发"
5. 此时你会看到"Webhook 地址",把这个链接先复制到本地记事本暂存,继续接下来的操作
6. "参数"里面放上下面的内容,然后点击"完成"
```json
{
"message_type": "text",
"content": {
"text": "{{内容}}"
}
}
```
7. 点击"选择操作" > "发送飞书消息",勾选 "群消息",然后点击下面的输入框,点击"我管理的群组"(如果没有群组,你可以在飞书 app 上创建群组)
8. 消息标题填写"TrendRadar 热点监控"
9. 最关键的部分来了,点击 + 按钮,选择"Webhook 触发",然后按照下面的图片摆放

10. 配置完成后,将第 5 步复制的 Webhook 地址配置到 GitHub Secrets 中的 `FEISHU_WEBHOOK_URL`
</details>
<details>
<summary>👉 点击展开:<strong>钉钉机器人</strong></summary>
<br>
**GitHub Secret 配置(⚠️ Name 名称必须严格一致):**
- **Name(名称)**:`DINGTALK_WEBHOOK_URL`(请复制粘贴此名称,不要手打)
- **Secret(值)**:你的钉钉机器人 Webhook 地址
<br>
**机器人设置步骤:**
1. **创建机器人(仅 PC 端支持)**:
- 打开钉钉 PC 客户端,进入目标群聊
- 点击群设置图标(⚙️)→ 往下翻找到"机器人"点开
- 选择"添加机器人" → "自定义"
2. **配置机器人**:
- 设置机器人名称
- **安全设置**:
- **自定义关键词**:设置 "热点"
3. **完成设置**:
- 勾选服务条款协议 → 点击"完成"
- 复制获得的 Webhook URL
- 将 URL 配置到 GitHub Secrets 中的 `DINGTALK_WEBHOOK_URL`
**注意**:移动端只能接收消息,无法创建新机器人。
</details>
<details>
<summary>👉 点击展开:<strong>Telegram Bot</strong></summary>
<br>
**GitHub Secret 配置(⚠️ Name 名称必须严格一致):**
- **Name(名称)**:`TELEGRAM_BOT_TOKEN`(请复制粘贴此名称,不要手打)
- **Secret(值)**:你的 Telegram Bot Token
- **Name(名称)**:`TELEGRAM_CHAT_ID`(请复制粘贴此名称,不要手打)
- **Secret(值)**:你的 Telegram Chat ID
**说明**:Telegram 需要配置**两个** Secret,请分别点击两次"New repository secret"按钮添加
<br>
**机器人设置步骤:**
1. **创建机器人**:
- 在 Telegram 中搜索 `@BotFather`(大小写注意,有蓝色徽章勾勾,有类似 37849827 monthly users,这个才是官方的,有一些仿官方的账号注意辨别)
- 发送 `/newbot` 命令创建新机器人
- 设置机器人名称(必须以"bot"结尾,很容易遇到重复名字,所以你要绞尽脑汁想不同的名字)
- 获取 Bot Token(格式如:`123456789:AAHfiqksKZ8WmR2zSjiQ7_v4TMAKdiHm9T0`)
2. **获取 Chat ID**:
**方法一:通过官方 API 获取**
- 先向你的机器人发送一条消息
- 访问:`https://api.telegram.org/bot<你的Bot Token>/getUpdates`
- 在返回的 JSON 中找到 `"chat":{"id":数字}` 中的数字
**方法二:使用第三方工具**
- 搜索 `@userinfobot` 并发送 `/start`
- 获取你的用户 ID 作为 Chat ID
3. **配置到 GitHub**:
- `TELEGRAM_BOT_TOKEN`:填入第 1 步获得的 Bot Token
- `TELEGRAM_CHAT_ID`:填入第 2 步获得的 Chat ID
</details>
<details>
<summary>👉 点击展开:<strong>邮件推送</strong>(支持所有主流邮箱)</summary>
<br>
- 注意事项:为防止邮件群发功能被**滥用**,当前的群发是所有收件人都能看到彼此的邮箱地址。
- 如果你没有过配置下面这种邮箱发送的经历,不建议尝试
> ⚠️ **重要配置依赖**:邮件推送需要 HTML 报告文件。请确保 `config/config.yaml` 中的 `storage.formats.html` 设置为 `true`:
> ```yaml
> storage:
> formats:
> sqlite: true
> txt: false
> html: true # 必须启用,否则邮件推送会失败
> ```
> 如果设置为 `false`,邮件推送时会报错:`错误:HTML文件不存在或未提供: None`
<br>
**GitHub Secret 配置(⚠️ Name 名称必须严格一致):**
- **Name(名称)**:`EMAIL_FROM`(请复制粘贴此名称,不要手打)
- **Secret(值)**:发件人邮箱地址
- **Name(名称)**:`EMAIL_PASSWORD`(请复制粘贴此名称,不要手打)
- **Secret(值)**:邮箱密码或授权码
- **Name(名称)**:`EMAIL_TO`(请复制粘贴此名称,不要手打)
- **Secret(值)**:收件人邮箱地址(多个收件人用英文逗号分隔,也可以和 EMAIL_FROM 一样,自己发送给自己)
- **Name(名称)**:`EMAIL_SMTP_SERVER`(可选配置,请复制粘贴此名称)
- **Secret(值)**:SMTP服务器地址(可留空,系统会自动识别)
- **Name(名称)**:`EMAIL_SMTP_PORT`(可选配置,请复制粘贴此名称)
- **Secret(值)**:SMTP端口(可留空,系统会自动识别)
**说明**:邮件推送需要配置至少**3个必需** Secret(EMAIL_FROM、EMAIL_PASSWORD、EMAIL_TO),后两个为可选配置
<br>
**支持的邮箱服务商**(自动识别 SMTP 配置):
| 邮箱服务商 | 域名 | SMTP 服务器 | 端口 | 加密方式 |
|-----------|------|------------|------|---------|
| **Gmail** | gmail.com | smtp.gmail.com | 587 | TLS |
| **QQ邮箱** | 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邮箱** | 163.com | smtp.163.com | 465 | SSL |
| **126邮箱** | 126.com | smtp.126.com | 465 | SSL |
| **新浪邮箱** | sina.com | smtp.sina.com | 465 | SSL |
| **搜狐邮箱** | sohu.com | smtp.sohu.com | 465 | SSL |
| **天翼邮箱** | 189.cn | smtp.189.cn | 465 | SSL |
| **阿里云邮箱** | aliyun.com | smtp.aliyun.com | 465 | TLS |
| **Yandex邮箱** | yandex.com | smtp.yandex.com | 465 | TLS |
| **iCloud邮箱** | icloud.com | smtp.mail.me.com | 587 | SSL |
> **自动识别**:使用以上邮箱时,无需手动配置 `EMAIL_SMTP_SERVER` 和 `EMAIL_SMTP_PORT`,系统会自动识别。
>
> **反馈说明**:
> - 如果你使用**其他邮箱**测试成功,欢迎开 [Issues](https://github.com/sansan0/TrendRadar/issues) 告知,我会添加到支持列表
> - 如果上述邮箱配置有误或无法使用,也请开 [Issues](https://github.com/sansan0/TrendRadar/issues) 反馈,帮助改进项目
>
> **特别感谢**:
> - 感谢 [@DYZYD](https://github.com/DYZYD) 贡献天翼邮箱(189.cn)配置并完成自发自收测试 ([#291](https://github.com/sansan0/TrendRadar/issues/291))
> - 感谢 [@longzhenren](https://github.com/longzhenren) 贡献阿里云邮箱(aliyun.com)配置并完成测试 ([#344](https://github.com/sansan0/TrendRadar/issues/344))
> - 感谢 [@ACANX](https://github.com/ACANX) 贡献 Yandex 邮箱(yandex.com)配置并完成测试 ([#663](https://github.com/sansan0/TrendRadar/issues/663))
> - 感谢 [@Sleepy-Tianhao](https://github.com/Sleepy-Tianhao) 贡献 iCloud 邮箱(icloud.com)配置并完成测试 ([#728](https://github.com/sansan0/TrendRadar/issues/728))
**常见邮箱设置:**
#### QQ邮箱:
1. 登录 QQ邮箱网页版 → 设置 → 账户
2. 开启 POP3/SMTP 服务
3. 生成授权码(16位字母)
4. `EMAIL_PASSWORD` 填写授权码,而非 QQ 密码
#### Gmail:
1. 开启两步验证
2. 生成应用专用密码
3. `EMAIL_PASSWORD` 填写应用专用密码
#### 163/126邮箱:
1. 登录网页版 → 设置 → POP3/SMTP/IMAP
2. 开启 SMTP 服务
3. 设置客户端授权码
4. `EMAIL_PASSWORD` 填写授权码
<br>
**高级配置**:
如果自动识别失败,可手动配置 SMTP:
- `EMAIL_SMTP_SERVER`:如 smtp.gmail.com
- `EMAIL_SMTP_PORT`:如 587(TLS)或 465(SSL)
<br>
**如果有多个收件人(注意是英文逗号分隔)**:
- EMAIL_TO="user1@example.com,user2@example.com,user3@example.com"
</details>
<details>
<summary>👉 点击展开:<strong>ntfy 推送</strong>(开源免费,支持自托管)</summary>
<br>
**两种使用方式:**
### 方式一:免费使用(推荐新手) 🆓
**特点**:
- ✅ 无需注册账号,立即使用
- ✅ 每天 250 条消息(足够 90% 用户)
- ✅ Topic 名称即"密码"(需选择不易猜测的名称)
- ⚠️ 消息未加密,不适合敏感信息, 但适合我们这个项目的不敏感信息
**Getting Started:**
1. **Download the ntfy app**:
- Android: [Google Play](https://play.google.com/store/apps/details?id=io.heckel.ntfy) / [F-Droid](https://f-droid.org/en/packages/io.heckel.ntfy/)
- iOS: [App Store](https://apps.apple.com/us/app/ntfy/id1625396347)
- Desktop: Visit [ntfy.sh](https://ntfy.sh)
2. **Subscribe to a topic** (choose a hard-to-guess name):
```
Suggested format: trendradar-{your initials}-{random number}
No Chinese characters allowed
✅ Good example: trendradar-zs-8492
❌ Bad example: news, alerts (too easy to guess)
```
3. **Configure GitHub Secret (⚠️ Name must match exactly)**:
- **Name**: `NTFY_TOPIC` (copy and paste this name)
- **Secret**: Enter the topic name you just subscribed to
- **Name**: `NTFY_SERVER_URL` (optional, copy and paste this name)
- **Secret**: Leave blank (default is ntfy.sh)
- **Name**: `NTFY_TOKEN` (optional, copy and paste this name)
- **Secret**: Leave blank
**Note**: ntfy requires at least 1 required Secret (NTFY_TOPIC), the other two are optional
4. **Test**:
```bash
curl -d "Test message" ntfy.sh/your_topic_name
```
---
### Method 2: Self-hosting (complete privacy control) 🔒
**Suitable for**: Those with servers, seeking complete privacy, and technical expertise
**Advantages**:
- ✅ Completely open-source (Apache 2.0 + GPLv2)
- ✅ Complete data control
- ✅ No limitations
- ✅ Zero cost
**One-click Docker deployment**:
```bash
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**:
```yaml
NTFY_SERVER_URL: https://ntfy.yourdomain.com
NTFY_TOPIC: trendradar-alerts # Simple name available for self-hosting
NTFY_TOKEN: tk_your_token # Optional: enable access control
```
**Subscribe in the app**:
- Click "Use another server"
- Enter your server address
- Enter the topic name
- (Optional) Enter login credentials
---
**Frequently Asked Questions:**
<details>
<summary><strong>Q1: Is the free version sufficient?</strong></summary>
250 messages per day are enough for most users. With 30 minutes of crawling once, there are about 48 pushes per day, which is sufficient.
</details>
<details>
<summary><strong>Q2: Is the topic name really secure?</strong></summary>
If you choose a random, long enough name (like `trendradar-zs-8492-news`), brute-force attacks are almost impossible:
- ntfy has strict rate limiting (1 request per second)
- 64 character choices (A-Z, a-z, 0-9, _, -)
- 10-character random string has 64^10 possibilities (takes years to crack)
</details>
---
**Recommendations:**
| User type | Recommended solution | Reason |
|---------|---------|------|
| Ordinary users | Method 1 (free) | Simple and quick, sufficient |
| Technical users | Method 2 (self-hosting) | Complete control, no limitations |
| High-frequency users | Method 3 (paid) | Check the official website for details |
**Related links:**
- [ntfy official documentation](https://docs.ntfy.sh/)
- [Self-hosting tutorial](https://docs.ntfy.sh/install/)
- [GitHub repository](https://github.com/binwiederhier/ntfy)
</details>
<details>
<summary>👉 Click to expand: <strong>Bark push</strong> (iOS exclusive, simple and efficient)</summary>
<br>
**GitHub Secret configuration (⚠️ Name must match exactly):**
- **Name**: `BARK_URL` (copy and paste this name)
- **Secret**: Your Bark push URL
<br>
**Bark introduction:**
Bark is a free and open-source push tool for iOS, characterized by simplicity, speed, and no ads.
**Usage:**
### Method 1: Use the official server (recommended for beginners) 🆓
1. **Download Bark App**:
- iOS: [App Store](https://apps.apple.com/app/bark-给你的手机发推送/id1403753865)
2. **Get the push URL**:
- Open the Bark App
- Copy the push URL displayed on the homepage (format: `https://api.day.app/your_device_key`)
- Configure the URL to `BARK_URL` in GitHub Secrets
### Method 2: Self-hosting (complete privacy control) 🔒
**Suitable for**: Those with servers, seeking complete privacy, and technical expertise
**One-click Docker deployment**:
```bash
docker run -d \
--name bark-server \
-p 8080:8080 \
finab/bark-server
```
**Configure TrendRadar**:
```yaml
BARK_URL: http://your-server-ip:8080/your_device_key
```
---
**Notes:**
- ✅ Bark uses APNs push, with a maximum message size of 4KB
- ✅ Supports automatic batching, no need to worry about long messages
- ✅ Push format is plain text (automatically removes Markdown syntax)
- ⚠️ Only supports iOS platform
**Related links:**
- [Bark official website](https://bark.day.app/)
- [Bark GitHub repository](https://github.com/Finb/Bark)
- [Bark Server self-hosting tutorial](https://github.com/Finb/bark-server)
</details>
<details>
<summary>👉 Click to expand: <strong>Slack push</strong></summary>
<br>
**GitHub Secret configuration (⚠️ Name must match exactly):**
- **Name**: `SLACK_WEBHOOK_URL` (copy and paste this name)
- **Secret**: Your Slack Incoming Webhook URL
<br>
**Slack introduction:**
Slack is a team collaboration tool, and Incoming Webhooks can push messages to Slack channels.
**Setup steps:**
### Step 1: Create a Slack App
1. **Access the Slack API page**:
- Open https://api.slack.com/apps?new_app=1
- If not logged in, log in to your Slack workspace
2. **Choose the creation method**:
- Click **"From scratch"**
3. **Fill in app information**:
- **App Name**: Fill in the app name (e.g., `TrendRadar` or `Hot News Monitor`)
- **Workspace**: Select your workspace from the dropdown list
- Click **"Create App"**
### Step 2: Enable Incoming Webhooks
1. **Navigate to Incoming Webhooks**:
- Find and click **"Incoming Webhooks"** in the left menu
2. **Enable the feature**:
- Find **"Activate Incoming Webhooks"**
- Switch from `OFF` to `ON`
- The page will refresh to display new configuration options
### Step 3: Generate Webhook URL
1. **Add a new Webhook**:
- Scroll to the bottom of the page
- Click **"Add New Webhook to Workspace"**
2. **Select the target channel**:
- An authorization page will pop up
- Select the channel to receive messages from the dropdown list (e.g., `#hot-news`)
- ⚠️ If you want to select a private channel, you must first join the channel
3. **Authorize the app**:
- Click **"Allow"** to complete authorization
- The system will automatically jump back to the configuration page
### Step 4: Copy and save the Webhook URL
1. **View the generated URL**:
- In the "Webhook URLs for Your Workspace" section
- You will see the generated Webhook URL
- Format: `https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX`
2. **Copy the URL**:
- Click the **"Copy"** button next to the URL
- Or manually select and copy the URL
3. **Configure to TrendRadar**:
- **GitHub Actions**: Add the URL to `SLACK_WEBHOOK_URL` in GitHub Secrets
- **Local testing**: Fill the URL into `slack_webhook_url` in `config/config.yaml`
- **Docker deployment**: Add the URL to `SLACK_WEBHOOK_URL` in `docker/.env`
---
**Notes:**
- ✅ Supports Markdown format (automatically converted to Slack mrkdwn)
- ✅ Supports automatic batching (4KB per batch)
- ✅ Suitable for team collaboration, centralized message management
- ⚠️ Webhook URL contains a secret key, do not expose it
**Message format preview:**
```
*[Part 1/2]*
📊 *Hot word statistics*
🔥 *[1/3] AI ChatGPT* : 2 articles
1. [Baidu Hot Search] 🆕 ChatGPT-5 officially released *[1]* - 09:15 (1 time)
2. [Toutiao] AI chip concept stocks soar *[3]* - [08:30 ~ 10:45] (3 times)
```
**Related links:**
- [Slack Incoming Webhooks official documentation](https://api.slack.com/messaging/webhooks)
- [Slack API app management](https://api.slack.com/apps)
</details>
<details>
<summary>👉 Click to expand: <strong>Generic Webhook push</strong> (supports Discord, Matrix, IFTTT, etc.)</summary>
<br>
**GitHub Secret configuration (⚠️ Name must match exactly):**
- **Name**: `GENERIC_WEBHOOK_URL` (copy and paste this name)
- **Secret**: Your Webhook URL
- **Name**: `GENERIC_WEBHOOK_TEMPLATE` (optional, copy and paste this name)
- **Secret**: JSON template string, supports `{title}` and `{content}` placeholders
<br>
**Generic Webhook introduction:**
Generic Webhooks support any platform that accepts HTTP POST requests, including but not limited to:
- **Discord**: Push to channels via Webhooks
- **Matrix**: Bridge push via Webhooks
- **IFTTT**: Trigger automation processes
- **Self-built services**: Any custom service that supports Webhooks
**Configuration example:**
### Discord configuration
1. **Get the Webhook URL**:
- Go to Discord server settings → Integrations → Webhooks
- Create a new Webhook and copy the URL
2. **Configure the template**:
```json
{"content": "{content}"}
```
3. **GitHub Secret configuration**:
- `GENERIC_WEBHOOK_URL`: Discord Webhook URL
- `GENERIC_WEBHOOK_TEMPLATE`: `{"content": "{content}"}`
### Custom template
The template supports two placeholders:
- `{title}` - Message title
- `{content}` - Message content
**Template example:**
```json
# Default format (leave blank)
{"title": "{title}", "content": "{content}"}
# Discord format
{"content": "{content}"}
# Custom format
{"text": "{content}", "username": "TrendRadar"}
```
---
**Notes:**
- ✅ Supports Markdown format (consistent with WeChat format)
- ✅ Supports automatic batching
- ✅ Supports multi-account configuration (use `;` to separate)
- ⚠️ The template must be a valid JSON format
- ⚠️ Different platforms have different requirements for message format, please refer to the target platform documentation
</details>
<br>
### Step 3: Manually test news pushes
> ⚠️ Reminder:
> - Complete steps 1-2, then test immediately! Test successfully before adjusting configurations (step 4)
> - Please enter your own project, not this one!
**How to find your Actions page**:
- **Method 1**: Open your forked project homepage, click the **Actions** tab at the top
- **Method 2**: Directly access `https://github.com/your_username/TrendRadar/actions`
**Example comparison**:
- ❌ Author's project: `https://github.com/sansan0/TrendRadar/actions`
- ✅ Your project: `https://github.com/your_username/TrendRadar/actions`
**Test steps**:
1. Enter your project's Actions page
2. Find **"Get Hot News"** (must be these words), click into it, and click the **"Run workflow"** button on the right
- If you don't see the text, refer to [#109](https://github.com/sansan0/TrendRadar/issues/109) to solve
3. About 3 minutes later, the message will be pushed to your configured platform
<br>
> ⚠️ Reminder:
> - Don't test too frequently, avoid triggering GitHub Actions limits
> - After clicking Run workflow, you need to refresh the browser page to see the new run record
<br>
### Step 4: Configuration instructions (optional)
The default configuration is already usable. If you need personalized adjustments, understand the following files:
| File | Function |
|------|------|
| `config/config.yaml` | Main configuration file: push mode, time window, platform list, hot word weight, etc. |
| `config/frequency_words.txt` | Keyword file: set concerned vocabulary, filter push content |
| `config/ai_analysis_prompt.txt` | AI prompt template: customize AI analyst role and analysis dimensions |
| `.github/workflows/crawler.yml` | Execution frequency: control how often to run (⚠️ be cautious when modifying) |
👉 **Detailed configuration tutorial**: [Configuration details](#configuration-details)
<br>
### 5️⃣ Step 5: Remote Cloud Storage & Check-in Configuration
**v4.0.0 Important Change**: Introduced an "activity detection" mechanism, GitHub Actions requires periodic check-ins to maintain operation.
- **Operation Cycle**: Valid for **7 days**, service will automatically suspend after countdown ends.
- **Renewal Method**: Manually trigger "Check In" workflow on Actions page to reset 7-day validity.
- **Operation Path**: `Actions` → `Check In` → `Run workflow`
- **Design Philosophy**:
- If you forget to check in for 7 days, perhaps this information is not essential for you. Timely pauses help you detach from information flow and give your mind a breather.
- GitHub Actions are valuable public computing resources. Introducing a check-in mechanism aims to avoid idle computing power and ensure resources are allocated to active and needed users. Thank you for your understanding and support.
---
**About Remote Cloud Storage Configuration (choose according to deployment method):**
- **GitHub Actions Users**:
- **Current Status**: Actions run in a fresh environment each time, no file saving. If cloud storage is not configured, the project will run in **lightweight mode** (no incremental push, no history tracking).
- **Recommendation**: Configure remote cloud storage for a complete experience.
- **Docker / Local Users**:
- **Current Status**: Data is saved to local hard drive by default.
- **Recommendation**: Cloud storage is optional and can be used for off-site backup.
<details>
<summary>👉 Click to expand: <strong>Remote Cloud Storage Configuration Tutorial (using Cloudflare R2 as an example)</strong></summary>
<br>
**⚠️ Prerequisites (important):**
According to Cloudflare platform rules, enabling R2 requires binding a payment method.
* **Purpose**: Only for identity verification (Verify Only), **no charges incurred**.
* **Payment**: Supports dual-currency credit cards or mainland China PayPal.
* **Usage**: R2's free quota (10GB storage/month) is sufficient for daily operation, no need to worry about payment.
---
**GitHub Secret Configuration (4 items need to be added):**
| Name | Secret Description |
|-------------|-----------------|
| `S3_BUCKET_NAME` | Bucket name (e.g., `trendradar-data`) |
| `S3_ACCESS_KEY_ID` | Access key ID |
| `S3_SECRET_ACCESS_KEY` | Secret access key |
| `S3_ENDPOINT_URL` | S3 API endpoint (e.g., R2: `https://<account-id>.r2.cloudflarestorage.com`) |
**Optional Configuration:**
| Name | Secret Description |
|-------------|-----------------|
| `S3_REGION` | Region (default `auto`, some service providers may require specification) |
> 💡 **More storage configuration options**: See [Where is the data stored?](#11-where-is-the-data-stored)
<br>
**Detailed operation steps (obtaining credentials):**
1. **Enter R2 Overview**:
- Log in to [Cloudflare Dashboard](https://dash.cloudflare.com/).
- Find and click `R2 object storage` in the left sidebar.
2. **Create a bucket**:
- Click `Overview`.
- Click `Create bucket` in the top right corner.
- Enter a name (e.g., `trendradar-data`) and click `Create bucket`.
3. **Create an API token**:
- Go back to the **Overview** page.
- Click `Manage` (Manage R2 API Tokens) at the bottom right corner.
- You will see `S3 API`: `https://<account-id>.r2.cloudflarestorage.com` (this is S3_ENDPOINT_URL).
- Click `Create Account API token`.
- **⚠️ Key settings**:
- **Token name**: Fill in arbitrarily (e.g., `github-action-write`).
- **Permissions**: Select `Admin Read and Write`.
- **Specify bucket**: For security, recommend selecting `For specified bucket only` and select your bucket (e.g., `trendradar-data`).
- Click `Create API token`, **immediately copy** the displayed `Access Key ID` and `Secret Access Key` (only shown once!).
</details>
<br>
### 6️⃣ Step 6: Enable AI Analysis Push
This is a core feature of v5.0.0, allowing AI to summarize and analyze news for you, recommended for trying out.
**Configuration method:**
Add to GitHub Secrets (or `.env` / `config.yaml`):
- `AI_API_KEY`: Your API Key (supports DeepSeek, OpenAI, etc.)
- `AI_PROVIDER`: Service provider name (e.g., `deepseek`, `openai`)
That's it, no complex deployment needed; you'll see intelligent analysis reports at the next push.
<br>
### 7️⃣ Step 7: 🎉 Deployment Successful!
Congratulations! Now you can start enjoying efficient information flow brought by TrendRadar.
💬 **Join the community**: Welcome to follow the public account **[Silicon Base Tea Room](#-support-the-project)**, share your usage experience and advanced gameplay.
<br>
### 8️⃣ Step 8: Advanced: Choose Your AI Assistant
TrendRadar provides two AI usage methods to meet different needs:
| Feature | ✨ AI Analysis Push | 🧠 AI Intelligent Analysis |
| :--- | :--- | :--- |
| **Mode** | **Passive reception** (daily report) | **Active dialogue** (in-depth research) |
| **Scenario** | "What big things happened today?" | "Analyze the changes in the AI industry over the past week" |
| **Deployment** | Simple (fill in Key) | Advanced (need local operation/Docker) |
| **Client** | Mobile | Computer |
👉 **Conclusion**: Start with **AI Analysis Push** for daily needs; if you're a data analyst or need in-depth mining, try **[AI Intelligent Analysis](#-ai-intelligent-analysis)**.
<br>
<a name="configuration-details"></a>
## ⚙️ Configuration Details
> **📖 Reminder**: This section provides detailed configuration instructions, recommend completing the [Quick Start](#-quick-start) basic configuration first, then review detailed options as needed.
### 1. Which platforms do I want to watch?
<details id="customize-monitor-platforms">
<summary>👉 Click to expand: <strong>Choose information sources</strong></summary>
<br>
**Configuration location:** `config/config.yaml` `platforms` section
This project's information data comes from [newsnow](https://github.com/ourongxing/newsnow). You can click [website](https://newsnow.busiyi.world/), click [More], and check if you want the platform.
Specific additions can be accessed [project source code](https://github.com/ourongxing/newsnow/tree/main/server/sources). According to the file names inside, modify the `platforms` configuration in `config/config.yaml` file:
```yaml
platforms:
enabled: true # Whether to enable hot list platform crawling
sources:
- id: "toutiao"
name: "Toutiao"
- id: "baidu"
name: "Baidu Hot Search"
- id: "wallstreetcn-hot"
name: "Wall Street News"
# Add more platforms...
```
> 💡 **Shortcut**: If you can't read the source code, you can copy others' sorted [platform configuration summary](https://github.com/sansan0/TrendRadar/issues/95)
> ⚠️ **Note**: It's not that the more platforms, the better. Recommend selecting 10-15 core platforms. Too many platforms will lead to information overload and reduce user experience.
</details>
### 2. What content do I care about?
In the `frequency_words.txt` file, tell the robot what you want to see, and it will help you monitor. Supports ordinary words, must-have words, filter words, and other gameplay.
| Syntax type | Symbol | Effect | Example | Matching logic |
|---------|------|------|------|---------|
| **Ordinary words** | None | Basic matching | `Huawei` | Contains any one can |
| **Must-have words** | `+` | Limit scope | `+mobile phone` | Must contain simultaneously |
| **Filter words** | `!` | Exclude interference | `!advertising` | Contains direct exclusion |
| **Quantity limit** | `@` | Control display quantity | `@10` | Display up to 10 news (v3.2.0 added) |
| **Global filter** | `[GLOBAL_FILTER]` | Global exclusion of specified content | See below | Filter in any case (v3.5.0 added) |
| **Regular expression** | `/pattern/` | Precise matching mode | `/\bai\b/` | Use regular expression matching (v4.7.0 added) |
| **Display name** | `=> remark` | Custom display text | `/\bai\b/ => AI-related` | Push and HTML display remark name (v4.7.0 added) |
#### 2.1 Basic syntax
<a name="keyword-basic-syntax"></a>
<details>
<summary>👉 Click to expand: <strong>Basic syntax tutorial</strong></summary>
<br>
**Configuration location:** `config/frequency_words.txt`
##### 1. **Ordinary keywords** -
##### 关键词排序优先级
**配置位置:** `config/config.yaml`
```yaml
report:
sort_by_position_first: false # 排序优先级配置
```
| 配置值 | 排序规则 | 适用场景 |
|--------|---------|---------|
| `false`(默认) | 热点条数 ↓ → 配置位置 ↑ | 关注热度趋势 |
| `true` | 配置位置 ↑ → 热点条数 ↓ | 关注个人优先级 |
**示例:** 配置顺序 A、B、C,热点数 A(3条)、B(10条)、C(5条)
- `false`:B(10条) → C(5条) → A(3条)
- `true`:A(3条) → B(10条) → C(5条)
##### 全局显示数量限制
```yaml
report:
max_news_per_keyword: 10 # 每个关键词最多显示10条(0=不限制)
```
**Docker 环境变量:**
```bash
SORT_BY_POSITION_FIRST=true
MAX_NEWS_PER_KEYWORD=10
```
**综合示例:**
```yaml
# config.yaml
report:
sort_by_position_first: true # 按配置顺序优先
max_news_per_keyword: 10 # 全局默认每个关键词最多10条
```
```txt
# frequency_words.txt
特斯拉
马斯克
@20 # 重点关注,显示20条(覆盖全局配置)
华为 # 使用全局配置,显示10条
比亚迪
@5 # 限制5条
```
**最终效果:** 按配置顺序显示 特斯拉(20条) → 华为(10条) → 比亚迪(5条)
</details>
### 3. 推送模式选哪个?
<details>
<summary>👉 点击展开:<strong>三种推送模式详细对比</strong></summary>
<br>
**配置位置:** `config/config.yaml` 的 `report.mode`
```yaml
report:
mode: "daily" # 可选: "daily" | "incremental" | "current"
```
#### 详细对比表格
| 模式 | 适用人群 | 推送时机 | 显示内容 | 典型使用场景 |
|------|----------|----------|----------|------------|
| **当日汇总**<br/>`daily` | 📋 企业管理者/普通用户 | 按时推送(默认每小时推送一次) | 当日所有匹配新闻<br/>+ 新增新闻区域 | **案例**:每天下午6点查看今天所有重要新闻<br/>**特点**:看全天完整趋势,不漏掉任何热点<br/>**提醒**:会包含之前推送过的新闻 |
| **当前榜单**<br/>`current` | 📰 自媒体人/内容创作者 | 按时推送(默认每小时推送一次) | 当前榜单匹配新闻<br/>+ 新增新闻区域 | **案例**:每小时追踪"哪些话题现在最火"<br/>**特点**:实时了解当前热度排名变化<br/>**提醒**:持续在榜的新闻每次都会出现 |
| **增量监控**<br/>`incremental` | 📈 投资者/交易员 | 有新增才推送 | 新出现的匹配频率词新闻 | **案例**:监控"特斯拉",只在有新消息时通知<br/>**特点**:零重复,只看首次出现的新闻<br/>**适合**:高频监控、避免信息打扰 |
#### 实际推送效果举例
假设你监控"苹果"关键词,每小时执行一次:
| 时间 | daily 模式推送 | current 模式推送 | incremental 模式推送 |
|-----|--------------|----------------|-------------------|
| 10:00 | 新闻A、新闻B | 新闻A、新闻B | 新闻A、新闻B |
| 11:00 | 新闻A、新闻B、新闻C | 新闻B、新闻C、新闻D | **仅**新闻C |
| 12:00 | 新闻A、新闻B、新闻C | 新闻C、新闻D、新闻E | **仅**新闻D、新闻E |
**说明**:
- `daily`:累积展示当天所有新闻(A、B、C 都保留)
- `current`:展示当前榜单的新闻(排名变化,新闻D上榜,新闻A掉榜)
- `incremental`:**只推送新出现的新闻**(避免重复干扰)
#### 常见问题
> **💡 遇到这个问题?** 👉 "每个小时执行一次,第一次执行完输出的新闻,在下一个小时执行时还会出现"
> - **原因**:你可能选择了 `daily`(当日汇总)或 `current`(当前榜单)模式
> - **解决**:改用 `incremental`(增量监控)模式,只推送新增内容
#### ⚠️ 增量模式重要提示
> **选择了 `incremental`(增量监控)模式的用户请注意:**
>
> 📌 **增量模式只在有新增匹配新闻时才会推送**
>
> **如果长时间没有收到推送,可能是因为:**
> 1. 当前时段没有符合你关键词的新热点出现
> 2. 关键词配置过于严格或过于宽泛
> 3. 监控平台数量较少
>
> **解决方案:**
> - 方案1:👉 [优化关键词配置](#2-关键词配置) - 调整关键词的精准度,增加或修改监控词汇
> - 方案2:切换推送模式 - 改用 `current` 或 `daily` 模式,可以定时接收推送
> - 方案3:👉 [增加监控平台](#1-平台配置) - 添加更多新闻平台,扩大信息来源
</details>
### 4. 调整热点算法
<details>
<summary>👉 点击展开:<strong>自定义热点权重</strong></summary>
<br>
**配置位置:** `config/config.yaml` 的 `advanced.weight` 部分
```yaml
advanced:
weight:
rank: 0.6 # 排名权重
frequency: 0.3 # 频次权重
hotness: 0.1 # 热度权重
```
当前默认的配置是平衡性配置
#### 两个核心场景
**追实时热点型**:
```yaml
advanced:
weight:
rank: 0.8 # 主要看排名
frequency: 0.1 # 不太在乎持续性
hotness: 0.1
```
**适用人群**:自媒体博主、营销人员、想快速了解当下最火话题的用户
**追深度话题型**:
```yaml
advanced:
weight:
rank: 0.4 # 适度看排名
frequency: 0.5 # 重视当天内的持续热度
hotness: 0.1
```
**适用人群**:投资者、研究人员、新闻工作者、需要深度分析趋势的用户
#### 调整的方法
1. **三个数字加起来必须等于 1.0**
2. **哪个重要就调大哪个**:在乎排名就调大 `rank`,在乎持续性就调大 `frequency`
3. **建议每次只调 0.1-0.2**,观察效果
核心思路:追求速度和时效性的用户提高排名权重,追求深度和稳定性的用户提高频次权重。
</details>
### 5. 我收到的消息长什么样?
<details>
<summary>👉 点击展开:<strong>消息样式预览</strong></summary>
<br>
#### 推送示例
📊 热点词汇统计
🔥 [1/3] AI ChatGPT : 2 条
1. [百度热搜] 🆕 ChatGPT-5正式发布 [**1**] - 09时15分 (1次)
2. [今日头条] AI芯片概念股暴涨 [**3**] - [08时30分 ~ 10时45分] (3次)
━━━━━━━━━━━━━━━━━━━
📈 [2/3] 比亚迪 特斯拉 : 2 条
1. [微博] 🆕 比亚迪月销量破纪录 [**2**] - 10时20分 (1次)
2. [抖音] 特斯拉降价促销 [**4**] - [07时45分 ~ 09时15分] (2次)
━━━━━━━━━━━━━━━━━━━
📌 [3/3] A股 股市 : 1 条
1. [华尔街见闻] A股午盘点评分析 [**5**] - [11时30分 ~ 12时00分] (2次)
🆕 本次新增热点新闻 (共 2 条)
**百度热搜** (1 条):
1. ChatGPT-5正式发布 [**1**]
**微博** (1 条):
1. 比亚迪月销量破纪录 [**2**]
更新时间:2025-01-15 12:30:15
#### 消息格式说明
| 格式元素 | 示例 | 含义 | 说明 |
| ------------- | --------------------------- | ------------ | --------------------------------------- |
| 🔥📈📌 | 🔥 [1/3] AI ChatGPT | 热度等级 | 🔥高热度(≥10条) 📈中热度(5-9条) 📌普通热度(<5条) |
| [序号/总数] | [1/3] | 排序位置 | 当前词组在所有匹配词组中的排名 |
| 频率词组 | AI ChatGPT | 关键词组 | 配置文件中的词组,标题必须包含其中词汇 |
| : N 条 | : 2 条 | 匹配数量 | 该词组匹配的新闻总数 |
| [平台名] | [百度热搜] | 来源平台 | 新闻所属的平台名称 |
| 🆕 | 🆕 ChatGPT-5正式发布 | 新增标记 | 本轮抓取中首次出现的热点 |
| [**数字**] | [**1**] | 高排名 | 排名≤阈值的热搜,红色加粗显示 |
| [数字] | [7] | 普通排名 | 排名>阈值的热搜,普通显示 |
| - 时间 | - 09时15分 | 首次时间 | 该新闻首次被发现的时间 |
| [时间~时间] | [08时30分 ~ 10时45分] | 持续时间 | 从首次出现到最后出现的时间范围 |
| (N次) | (3次) | 出现频率 | 在监控期间出现的总次数 |
| **新增区域** | 🆕 **本次新增热点新闻** | 新话题汇总 | 单独展示本轮新出现的热点话题 |
</details>
### 6. Docker 部署
**镜像说明:**
TrendRadar 提供两个独立的 Docker 镜像,可根据需求选择部署:
| 镜像名称 | 用途 | 说明 |
|---------|------|------|
| `wantcat/trendradar` | 新闻推送服务 | 定时抓取新闻、推送通知(必选) |
| `wantcat/trendradar-mcp` | AI 分析服务 | MCP 协议支持、AI 对话分析(可选) |
> 💡 **建议**:
> - 只需要推送功能:仅部署 `wantcat/trendradar` 镜像
> - 需要 AI 分析功能:同时部署两个镜像
<details>
<summary>👉 点击展开:<strong>Docker 部署完整指南</strong></summary>
<br>
#### Method 1: Using Docker Compose (Recommended)
1. **Create Project Directory and Configuration**:
```bash
# Clone project to local
git clone https://github.com/sansan0/TrendRadar.git
cd TrendRadar
```
> 💡 **Description**: The key directory structure required for Docker deployment is as follows:
```
Current directory/
├── config/
│ ├── config.yaml # Core function configuration (required)
│ ├── frequency_words.txt # Keyword configuration (required)
│ ├── timeline.yaml # Timeline configuration
│ ├── ai_analysis_prompt.txt # AI analysis prompt (optional)
│ ├── ai_translation_prompt.txt # AI translation prompt (optional)
│ ├── ai_interests.txt # AI interest filtering configuration (optional)
│ ├── ai_filter/ # AI filtering related prompts
│ │ ├── prompt.txt
│ │ ├── extract_prompt.txt
│ │ └── update_tags_prompt.txt
│ └── custom/ # User-defined configuration (optional)
│ ├── ai/ # Custom AI prompts
│ └── keyword/ # Custom keyword files
└── docker/
├── .env # Sensitive information + Docker-specific configuration
└── docker-compose.yml # Docker Compose orchestration file
```
2. **Configuration File Description**:
**Configuration Division Principle (v4.6.0 optimized)**:
| File | Purpose | Modification Frequency | Description |
|------|------|-------------------|------|
| `config/config.yaml` | **Core Function Configuration** | Low | Report mode, push settings, storage format, push window, AI analysis switch, platform enablement, etc. |
| `config/frequency_words.txt` | **Keyword Configuration** | High | Set concerned hot words, support grouping, regular expressions, aliases, etc. |
| `config/timeline.yaml` | **Timeline Configuration** | Low | Control news timeline display and filtering rules |
| `config/ai_analysis_prompt.txt` | **AI Analysis Prompt** | Medium | Custom AI analysis role definition and output format (v5.0.0+) |
| `config/ai_translation_prompt.txt` | **AI Translation Prompt** | Low | Custom AI translation prompt template |
| `config/ai_interests.txt` | **AI Interest Filtering** | Medium | Define AI-based interest automatic filtering news rules |
| `config/ai_filter/` | **AI Filtering Prompts** | Low | Internal prompts for AI filtering module (generally no need to modify) |
| `config/custom/` | **User-defined Extension** | As needed | `custom/ai/` for custom AI prompts, `custom/keyword/` for custom keyword files |
| `docker/.env` | **Sensitive Information + Docker-specific Configuration** | Low | Webhook URLs, API Key, S3 credentials, scheduled tasks, etc., **not tracked by git** |
> 💡 **Division Points**:
> - **Functional Behavior** → Modify `config.yaml` (e.g., enable/disable a platform, adjust push mode)
> - **Concerned Content** → Modify `frequency_words.txt` (e.g., add new concerned keywords)
> - **AI Output Style** → Modify `ai_analysis_prompt.txt` or `ai_translation_prompt.txt`
> - **Credentials and Tokens** → Modify `docker/.env` (sensitive information like API Key, Webhook URL)
> - **Personalized Extension** → Use `config/custom/` directory, avoid direct modification of default configuration being overwritten by upgrades
> 💡 **Configuration Take Effect**: After modifying `config.yaml`, execute `docker compose up -d` to restart the container to take effect
**⚙️ Environment Variable Override Mechanism (v3.0.5+)**:
Environment variables in `.env` file will override corresponding configurations in `config.yaml`:
| Environment Variable | Corresponding Configuration | Example Value | Description |
|---------|---------|-------|------|
| `WEBSERVER_PORT` | - | `8080` | Web server port |
| `FEISHU_WEBHOOK_URL` | `notification.channels.feishu.webhook_url` | `https://...` | Feishu Webhook (multiple accounts separated by `;`) |
| `AI_ANALYSIS_ENABLED` | `ai_analysis.enabled` | `true` / `false` | Whether to enable AI analysis (added in v5.0.0) |
| `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 |
| `S3_*` | `storage.remote.*` | - | Remote storage configuration (5 parameters) |
**Configuration Priority**: Environment variables > config.yaml
**Usage**:
- Modify `.env` file and fill in needed configurations
- Or add directly in NAS/Synology Docker management interface's "environment variables"
- Take effect after restarting the container: `docker compose up -d`
3. **Start Service**:
**Option A: Start All Services (Push + AI Analysis)**
```bash
# Pull the latest image
docker compose pull
# Start all services (trendradar + trendradar-mcp)
docker compose up -d
```
**Option B: Start News Push Service Only**
```bash
# Start trendradar (scheduled crawling and pushing)
docker compose pull trendradar
docker compose up -d trendradar
```
**Option C: Start MCP AI Analysis Service Only**
```bash
# Start trendradar-mcp (provide AI analysis interface)
docker compose pull trendradar-mcp
docker compose up -d trendradar-mcp
```
> 💡 **Hint**:
> - Most users only need to start `trendradar` to achieve news push functionality
> - Only when using ChatGPT/Gemini for AI dialogue analysis, `trendradar-mcp` needs to be started
> - Two services are independent and can be flexibly combined according to needs
4. **View Running Status**:
```bash
# 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
```
#### Method 2: Local Build (Developer Option)
If you need to customize and modify the code or build your own image:
```bash
# Clone project
git clone https://github.com/sansan0/TrendRadar.git
cd TrendRadar
# Modify configuration files
vim config/config.yaml
vim config/frequency_words.txt
# Use build version of docker compose
cd docker
cp docker-compose-build.yml docker-compose.yml
```
**Build and Start Service**:
```bash
# 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 Description**:
> - Default build `amd64` architecture image (applicable to most x86_64 servers)
> - If you need to build `arm64` architecture (Apple Silicon, Raspberry Pi, etc.), set environment variable:
> ```b
Tool List
## 11. Where is the data stored?
<details id="storage-config">
<summary>👉 Click to expand:<strong>Choose a data storage location</strong></summary>
<br>
#### Where will the data be stored?
The system will automatically choose the most suitable location for you, and you usually don't need to worry about it:
| Your running environment | Where is the data stored | Description |
|-------------|-----------|------|
| **Docker / Local run** | **Local hard drive** | Stored in the `output/` folder in the project directory, can be viewed at any time. |
| **GitHub Actions** | **Cloud storage** | Because GitHub Actions will destroy the environment after running, you must configure cloud storage (such as Cloudflare R2). |
#### How to configure cloud storage? (GitHub Actions users must read)
If you are running with GitHub Actions, you need a "cloud hard drive" to store data. For example, use Cloudflare R2 (because it has a free quota).
**Add these 5 variables to GitHub Secrets:**
| Variable name | What to fill in |
|-------|-------|
| `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 interface address |
> 💡 **Detailed tutorial**: How to apply for R2? Please see [Quick Start - Remote Storage Configuration](#-quick-start)
#### How long will the data be saved?
By default, we will not automatically delete your data. But if you think the data takes up too much space, you can set "automatic cleaning".
**Configuration location**: `config/config.yaml`
```yaml
storage:
local:
retention_days: 30 # Local data is retained for 30 days (0 means permanent)
remote:
retention_days: 30 # Cloud data is retained for 30 days
```
#### The push time is not correct? (Time zone setting)
If you are overseas, or find that the push time does not match your local time, you can modify the time zone.
**Configuration location**: `config/config.yaml`
```yaml
app:
timezone: "Asia/Shanghai" # Default is China time
```
- For example, if you are in Los Angeles, USA, change it to: `America/Los_Angeles`
- For example, if you are in London, UK, change it to: `Europe/London`
</details>
### 12. Let AI help me analyze hotspots
<details id="ai-analysis-config">
<summary>👉 Click to expand:<strong>Enable AI intelligent analysis function</strong></summary>
<br>
#### What can AI do for me?
After enabling this function, AI will act like a professional analyst, and for each batch of news pushed:
1. **Automatic reading**: Read all matched hot news
2. **In-depth thinking**: Analyze the connections between isolated news
3. **Write a report**: At the end of the push message, attach a short and profound "insight report"
**Content included**: Hotspot trend summary, public opinion trend judgment, cross-platform association analysis, potential impact assessment, etc
#### How to Enable AI Analysis?
The simplest method is through environment variable configuration (recommended GitHub Secrets or .env).
**Required Configurations**:
| Variable Name | What to Fill | 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, supporting 100+ providers):
| Provider | What to Fill for AI_MODEL | Description |
|----------|--------------------------|-------------|
| **DeepSeek** (recommended) | `deepseek/deepseek-chat` | High cost-effectiveness, suitable for high-frequency analysis |
| **OpenAI** | `openai/gpt-4o`<br>`openai/gpt-4o-mini` | GPT-4o series |
| **Google Gemini** | `gemini/gemini-1.5-flash`<br>`gemini/gemini-1.5-pro` | Gemini series |
| **Custom API** | Any format | Use with `AI_API_BASE` |
> 💡 **New Feature**: Now unified interface based on [LiteLLM](https://github.com/BerriAI/litellm), supporting 100+ AI providers, simpler configuration, and improved error handling.
**Optional Configurations**:
| Variable Name | Default Value | Description |
|---------------|--------------|-------------|
| `AI_API_BASE` | (automatic) | Custom API address (e.g., OneAPI, local model) |
| `AI_TEMPERATURE` | `1.0` | Sampling temperature (0-2, higher is more random) |
| `AI_MAX_TOKENS` | `5000` | Maximum generated tokens |
| `A
Connection Info
You Might Also Like
awesome-mcp-servers
A collection of MCP servers.
cc-switch
All-in-One Assistant for Claude Code, Codex & Gemini CLI across platforms.
git
A Model Context Protocol server for Git automation and interaction.
oh-my-opencode
Background agents · Curated agents like oracle, librarians, frontend...
Appwrite
Build like a team of hundreds
everything-claude-code
Complete Claude Code configuration collection - agents, skills, hooks,...