Horizon: A Self-Hosted News Radar That Puts Human Taste Back in the Pipeline
Project brief: Your own AI-powered news radar. Generates daily briefings in English & Chinese. | AI .
At a glance
- What is it?
- Horizon is a Python-based tool that fetches, deduplicates, scores, and summarizes news from Hacker News, Reddit, Telegram, RSS, and GitHub, then delivers bilingual briefings. The core judgement: it is a serious, configurable pipeline, not a toy summarizer, but its complexity and dependency extras demand careful setup.
- Who is it for?
- Adopt Horizon if you want a self-hosted, source-controlled news pipeline that preserves human curation through configurable profiles and delivery channels, and you are comfortable managing Python dependencies and API keys. Do not adopt it if you expect a plug-and-play app with no configuration, or if you need a hosted service with a GUI.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The Problem: News Is Scattered, and Summarizers Can't Judge Taste
Horizon addresses a specific pain: good news is scattered across platforms, and bad news is endless. The README frames it as a personal first pass over Hacker News, Reddit, Telegram, RSS, and GitHub. The tool fetches, deduplicates, scores, filters, and enriches stories with background context and community discussion. The intended user is someone who wants a daily briefing but refuses to surrender editorial judgement to an AI. Horizon keeps a human layer in the loop through customizable sources, processing profiles, models, languages, delivery channels, and comment summaries. This is not a generic RSS reader. It is a pipeline that treats news as a data problem with a taste filter.
How It Works: A Seven-Stage Pipeline from Fetch to Delivery
The architecture is a linear flow with seven stages. Define comes first: you configure sources, processing profiles, models, languages, and delivery. Fetch pulls latest content from all sources concurrently. Deduplicate merges items that point to the same story or URL across platforms, which is a real problem when a story appears on both Reddit and Hacker News. Analyze and Filter selects a profile, runs each item through its prompt, and applies a user-set threshold. Enrich generates the profile's content blocks, using only tools allowed for each block. Summarize renders localized titles, leads, sections, and cited sources as Markdown. Deliver publishes the result to GitHub Pages, email, webhooks like Feishu, MCP, or local files. The pipeline is deterministic in structure but flexible in content, because each profile defines its own prompts and tools.
Getting It Running: uv, Docker, and the Wizard
The quick start offers two installation paths. Local installation uses git clone, then uv sync, or pip install -e . for a more traditional route. Test dependencies are optional: uv sync --extra dev pulls in pytest. The OpenBB financial-news source requires its own extra: uv sync --extra openbb. If openbb lacks wheels on your machine, the README suggests installing with uv pip install --only-binary=:all: openbb openbb-benzinga. Docker is the second path: docker compose build --build-arg EXTRAS=trafilatura horizon, with multiple extras comma-separated. Configuration starts with a wizard: uv run horizon-wizard. It asks about interests like LLM inference or embedded systems and generates data/config.json. Manual setup means copying .env.example to .env for API keys, and data/config.example.json to data/config.json. The minimal config example shows an ai block with provider, model, and api_key_env, plus a sources block with an RSS entry and a processing block with profiles_dir and default_profile.
The Human Layer: Profiles and Thresholds Are the Real Controls
Horizon's differentiator is the processing profile. Each source item is analyzed with a profile-specific prompt, and you set a filter threshold. This is not a fixed summarization model. The profile defines content blocks and allowed tools for enrichment. The README stresses that AI reduces noise but cannot replace human taste. The threshold is the dial you turn to decide what survives. The default profile is tech-news, but you can create your own. This design means the tool's usefulness depends entirely on how well you write or choose profiles. A poorly tuned threshold will either flood you with junk or starve you of stories. The documentation implies that profiles live in a profiles directory, so they are versionable and shareable, which is a practical feature for teams.
Delivery Channels: From GitHub Pages to Feishu and Email
The deliver stage is where Horizon shows its breadth. It can publish Markdown as a GitHub Pages daily briefing site, which is how the live demo works. It can send email via self-hosted SMTP/IMAP with automatic subscribe and unsubscribe handling, a feature that turns it into a mini newsletter platform. It can push to Feishu/Lark, DingTalk, Slack, Discord, or custom webhooks. The README mentions MCP as a delivery target, which suggests integration with AI assistants. Each channel has its own template system. The screenshots show terminal output, Feishu notification, and email delivery. This breadth is a strength, but it also means more configuration surface. You are not just running a script; you are wiring it into your communication infrastructure.
Limitations and Failure Modes: The Twitter Extra and Docker Gaps
The most concrete limitation is the twitter extra. It requires a Playwright browser and system packages, and the current Dockerfile does not install them. So if you want Twitter/X sources, Docker will not work out of the box. You must install Playwright manually, which is a significant extra step. The OpenBB extra also has a caveat: it may pull packages without wheels, requiring a binary-only install. These are not theoretical problems; they are documented in the README. Another failure mode is the dependency on external services. The ai block requires an API key, and if your provider is down, the pipeline stops. The wizard generates a config, but it cannot guarantee that your sources are reachable or that your profiles match your interests. The tool is wrong for you if you want a zero-configuration app or if you are not willing to iterate on profiles and thresholds.
Alternatives: RSS Readers vs. Full Pipelines
The obvious alternative is a traditional RSS reader like Miniflux or FreshRSS. Those tools fetch and display feeds, but they do not deduplicate across platforms, score items, or generate bilingual briefings. They also do not enrich stories with web-researched context or summarize comments. The difference is fundamental: an RSS reader is a passive display, while Horizon is an active analysis pipeline. Another alternative is a hosted AI summarizer like a ChatGPT custom GPT that you paste links into. That requires manual effort every day and has no source fetching or delivery. Horizon's approach is to automate the entire chain, but it demands more setup and maintenance. The trade-off is between control and convenience. If you only need to skim headlines, a simple reader is enough. If you want a curated, contextualized briefing, Horizon's pipeline is the differentiator.
Maintenance and License: MIT, Extras, and Upgrade Cost
Horizon is MIT licensed, which means you can use, modify, and redistribute it with minimal restrictions, though this is not legal advice. The project uses uv for dependency management, which is modern and fast. The cost of maintenance comes from the extras. Each extra, like openbb or trafilatura, adds dependencies that can break across platforms. The README's note about binary-only installs for OpenBB is a sign of that fragility. The configuration files are plain JSON and .env, so upgrades should be straightforward if the schema stays stable, but the README does not mention a migration path. The release page shows no recent releases, so version stability is unclear. You should pin your dependencies and test after any update. The wizard reduces initial setup cost, but ongoing tuning of profiles and thresholds is a recurring effort.
Editorial conclusion
Adopt Horizon if you want a self-hosted, source-controlled news pipeline that preserves human curation through configurable profiles and delivery channels, and you are comfortable managing Python dependencies and API keys. Do not adopt it if you expect a plug-and-play app with no configuration, or if you need a hosted service with a GUI. Before committing, verify that your chosen sources (especially Twitter/X and OpenBB) work with your hardware, since the docker image does not include Playwright browser support, and check the processing profile prompts against your news tastes, because the filter threshold is the real control over noise.
Community notes