Find your next open-source project

Search by name, purpose, or keyword — or paste a GitHub repository URL

Thysrael/Horizon

AI Engineering

Self-hosted AI news radar that collects, scores, and summarizes feeds into bilingual daily briefings.

Best position on GitHub Trending (daily): #14. Click to get this badge for your README
12,903
1,850
Python
MIT
8 months old

What It Does

Horizon is a Python pipeline for building a personal news briefing. It pulls items from RSS/Atom, Hacker News, Reddit, Telegram, X, GitHub, OpenBB, OSS Insight, GDELT, and Google News, then uses an LLM to score, deduplicate, summarize, and enrich them with context and community discussion. Output is an English and Chinese Markdown briefing that can be published to GitHub Pages or delivered by email, webhook, or WeChat.

The key abstraction is the profile: a reusable set of editorial rules that decides what belongs, what is worth keeping, and what to write. Built-in profiles like tech-news, tech-blog, and ai-creator produce different treatments; you can assign one per source, let the AI match items, or restrict matching to a list of profiles. Per-profile thresholds and deduplication settings live in processing.profile_settings, not in the profile files.

Quick Start

Prerequisites: Python with uv (recommended) or pip, plus an API key for a supported model provider.

  1. Clone and install:
git clone https://github.com/Thysrael/Horizon.git
cd Horizon
uv sync

For development dependencies use uv sync --extra dev. The optional OpenBB financial-news source needs uv sync --extra openbb.

  1. Configure. The interactive wizard writes data/config.json:
uv run horizon-wizard

Alternatively copy .env.example to .env, add your API key, copy data/config.example.json to data/config.json, and edit sources. A minimal config sets ai.provider, ai.model, and ai.api_key_env (the name of the environment variable, e.g. OPENAI_API_KEY), plus a source such as:

"sources": {
  "rss": [
    { "name": "Simon Willison", "url": "https://simonwillison.net/atom/everything/", "profile": "tech-news" }
  ]
}
  1. Run the pipeline:
uv run horizon

Options include --hours N (default 24), --data-dir PATH (default data), --config PATH, and --log-level. The generated briefing is written under data/summaries/.

Docker is an alternative: docker compose build then docker compose run --rm horizon.

Constraints

  • An LLM provider and API key are required; providers include OpenAI, Gemini, and others listed in the README.
  • The X/Twitter source relies on Apify, and the twitter extra also needs a Playwright browser and system packages not installed by the current Dockerfile.
  • Email delivery uses SMTP/IMAP; WeChat delivery uses iLink Bot after QR login and is subject to WeChat reply limits.
  • --data-dir changes the state directory (summaries, subscribers, default config location), while --config changes only the config file.
  • The GitHub Actions daily workflow template is disabled and must be enabled by renaming it to daily-summary.yml.
  • Licensed MIT.

HotRepo's Take

Horizon reached a best GitHub all-language daily rank of 14 and gained 121 stars on the 2026-11-04 daily snapshot, with 12,298 stars and 1,803 forks overall. The README shows a complete loop—multi-source collection, profile-driven analysis, deduplication, bilingual output, and several delivery channels—rather than a single-purpose script. The profile system is the most distinctive design choice: it separates editorial intent from Python code, so adapting a feed's treatment usually does not require touching the pipeline. The README also carries paid sponsor links for model platforms, but they sit alongside real installation and configuration documentation, not instead of it.

Project source and documentation

Written by AI from the project's README, updated . The project's own docs are the source of truth.

Hacker News