Build an AI news radar at zero cost
Using the open-source project Horizon plus GitHub Actions' free tier, automatically scrape Hacker News, Reddit, and major official blogs every day; after AI scoring and filtering, generate a daily brief pushed to Feishu. Completely free.
Information overload — I used to solve it with RSS subscriptions, then found it didn’t work. The more sources I subscribed to, the more unread items piled up, until I just stopped looking.
The core of the problem isn’t lack of information, it’s lack of filtering. Of everything the global AI field produces each day, maybe only three to five items are what I actually need to see, but I have to fish them out from hundreds myself.
Then I found an open-source project called Horizon, whose thinking is exactly right: let information come to you, instead of you going to find it.
Its workflow
configure sources → concurrent fetch → dedupe & merge → AI scoring & filter → background fill-in → generate daily brief
Each news item gets scored 0–10; only content above the threshold is kept, and it also attaches background notes and a community-comment summary. That is, the AI doesn’t just filter for you, it fills in context.
The key point: the whole flow can run on GitHub Actions’ free runners, at zero cost.
Why GitHub Actions is the key
Horizon has two ways to run: local/Docker (needs a server, not free), or GitHub Actions.
Choosing GitHub Actions has an extra benefit I didn’t realize at first: the runner is overseas. Hacker News, Reddit, various RSS sources are accessed directly, no proxy hassle at all. On a domestic server this would be a big pain; here it simply doesn’t exist.
Do the free-tier math: GitHub Actions gives 2000 minutes/month; this task runs 5–10 minutes a time, 30 times a month is 150–300 minutes — plenty.
Three steps to set up
Step 1, fork the repo: github.com/Thysrael/Horizon
Step 2, configure Secrets. In the forked repo → Settings → Secrets and variables → Actions, add:
| Secret name | Use | Required |
|---|---|---|
OPENAI_API_KEY | Key for OpenAI or a compatible API | depends on Provider |
ANTHROPIC_API_KEY | Key for Claude | depends on Provider |
GITHUB_TOKEN | raise GitHub API rate limit | strongly recommended |
HORIZON_WEBHOOK_URL | daily-brief push address | optional |
Step 3, edit data/config.json. This is the core config file; details below.
How to pick an AI Provider: a free-ride guide
Horizon supports 7 providers. The goal is zero cost, so pick ones with free tiers.
Google Gemini (recommended). Sign up on AI Studio and you get quota; gemini-2.0-flash is fast and good enough:
"ai": {
"provider": "gemini",
"model": "gemini-2.0-flash",
"api_key_env": "GOOGLE_API_KEY",
"throttle_sec": 0
}
Aliyun DashScope (more stable on domestic networks). Goes through the OpenAI-compatible interface, no extra adaptation needed:
"ai": {
"provider": "ali",
"model": "qwen-plus",
"api_key_env": "DASHSCOPE_API_KEY"
}
DeepSeek. Horizon has no native provider, but DeepSeek’s API is fully OpenAI-format compatible, so just use the openai provider with a base_url:
"ai": {
"provider": "openai",
"model": "deepseek-chat",
"base_url": "https://api.deepseek.com/v1",
"api_key_env": "OPENAI_API_KEY"
}
DeepSeek gives 5 million tokens on signup, enough for a long time.
30–50 news items a day, each needing scoring plus a summary, consumes roughly 50–100K tokens. Gemini Flash’s free tier covers it completely.
Source configuration
This is the most valuable part of Horizon. For AI news, I configure these types:
"sources": {
"hackernews": {
"enabled": true,
"fetch_top_stories": 30,
"min_score": 100
},
"reddit": {
"enabled": true,
"subreddits": [
{ "subreddit": "MachineLearning", "sort": "hot", "fetch_limit": 15, "min_score": 50 },
{ "subreddit": "LocalLLaMA", "sort": "hot", "fetch_limit": 15, "min_score": 30 }
],
"fetch_comments": 5
},
"rss": [
{ "name": "Simon Willison", "url": "https://simonwillison.net/atom/everything/", "enabled": true, "category": "ai-tools" }
],
"github": [
{ "type": "repo_releases", "owner": "anthropics", "repo": "claude-code", "enabled": true }
]
}
A few parameter rules of thumb: min_score is the community-popularity threshold; setting Hacker News to 100 filters out most low-quality posts; fetch_comments set to 5, because Reddit’s top comments are often more informative than the post itself.
The RSS item is the one I most recommend adding — first-hand info from official blogs (OpenAI, Anthropic) arrives one to two days earlier than second-hand retellings, with no self-media distortion.
Automation: change two spots in the workflow
The repo ships with a workflow file; change two places and it works:
on:
schedule:
- cron: '0 2 * * *' # 10:00 Beijing time daily
workflow_dispatch: # supports manual trigger
Then go to repo Settings → Pages and set Source to the gh-pages branch. After it runs, the daily brief auto-publishes to https://your-username.github.io/Horizon/.
The first time, trigger manually (workflow_dispatch) to confirm the brief format is fine and the AI scoring matches expectations, before turning on cron. Don’t reverse this order, or you’ll get a pile of junk every day.
Output channels
Four are supported, can be on simultaneously: GitHub Pages, Feishu/DingTalk Webhook, email, MCP Server.
I use Pages plus Feishu Webhook. Feishu config is simple: create a custom bot in the group, store the Webhook URL in the HORIZON_WEBHOOK_URL secret:
"webhook": {
"enabled": true,
"url_env": "HORIZON_WEBHOOK_URL",
"delivery": "summary",
"platform": "feishu",
"layout": "collapsible",
"languages": ["zh"]
}
The effect is a collapsible daily-brief card popping into the group every morning. This experience is far better than opening an RSS reader — it comes to you proactively.
Pitfalls logged
GitHub Token must be added. Without it, the GitHub API allows only 60 requests/hour; fetching release info quickly hits the limit. With a Personal Access Token it’s 5000.
Don’t greedily lower min_score. I set it to 30 at first, got 80 items a day, and the filter threshold became meaningless. After raising it back to 100 it returned to the “three-to-five gems” state. This parameter is essentially how much attention you’re willing to spend.
Bilingual burns tokens. languages: ["en", "zh"] generates two versions of the brief, doubling tokens. If you only read Chinese, set ["zh"].
Score threshold must be tuned with the sources. ai_score_threshold at 6.0 happens to be right for my source combination. If your sources lean technically deep, raise it a bit.
Finally, what this approach doesn’t solve: it can only filter information that “has already happened,” and can’t catch trends not yet written down. Also, AI scoring has its own bias; over time you’ll find it keeps pushing one type of content, and occasionally you need to manually adjust the threshold or sources.
Project address: github.com/Thysrael/Horizon
Follow me