Horizon README

The project's README from github.com/Thysrael/Horizon. As one markdown file: README.md.

🌅 Horizon

Enjoy the News itself. Leave others to Horizon

Thysrael%2FHorizon | Trendshift Thysrael%2FHorizon | Trendshift Featured|HelloGitHub

License Tool uv Website Daily Commit PRs Welcome Sources Welcome

Claude GPT Gemini DeepSeek Doubao MiniMax OpenClaw Ollama

📡 Your own AI-powered news radar. Generates daily briefings in English & Chinese. | 构建你专属的 AI 新闻雷达

📖 Live Demo · 📋 Configuration Guide · 简体中文 · 日本語

Screenshots

Ranked Daily Briefing

Daily Overview

Context, Summary & Discussion

News Detail
More Screenshots

Terminal Output

Terminal Output

Feishu Notification

Feishu Notification

Email Delivery

Email Delivery

Why Horizon?

Good news is scattered; bad news is endless. Horizon gives you a personal first pass over Hacker News, Reddit, Telegram, RSS, and GitHub: it fetches, deduplicates, scores, filters, and enriches stories with background context and community discussion.

But Horizon is not just another summarizer. AI is great at reducing noise, but news still needs human taste: the sources you trust, the comments that change how you read a story, and the hidden gems only people can share. Horizon keeps that human layer in the loop with customizable sources, processing profiles, models, languages, delivery channels, comment summaries, and a community source hub.

Features

How It Works

%%{init: {
  "theme": "base",
  "themeVariables": {
    "fontFamily": "ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif",
    "fontSize": "18px",
    "primaryTextColor": "#2d2a3e",
    "primaryBorderColor": "#e0dbd3",
    "lineColor": "#7c7891",
    "tertiaryColor": "#faf8f5",
    "clusterBkg": "#f3f0eb",
    "clusterBorder": "#e0dbd3"
  }
}}%%
flowchart LR
    classDef config fill:#fbbf24,stroke:#d4a017,color:#2d2a3e,stroke-width:1.5px;
    classDef source fill:#ede7fb,stroke:#6d4aaa,color:#2d2a3e,stroke-width:1.5px;
    classDef process fill:#ffe8db,stroke:#e0652e,color:#2d2a3e,stroke-width:1.5px;
    classDef output fill:#f9d7e5,stroke:#be185d,color:#2d2a3e,stroke-width:1.5px;

    config["⚙️ Config<br/>sources, profiles, models, outputs"]

    subgraph sources["Configured Sources"]
        rss["📡 RSS"]
        hn["📰 Hacker News"]
        reddit["💬 Reddit"]
        telegram["✈️ Telegram"]
        twitter["🐦 Twitter / X"]
        github["🐙 GitHub"]
        openbb["💹 OpenBB"]
    end

    fetch["📥 Fetch"]
    dedup["🧹 Deduplicate"]
    score["🤖 AI Score & Filter"]
    enrich["🔎 Enrich"]
    summary["📝 Summarize"]

    subgraph outputs["Outputs"]
        direction TB
        site["🌐 Pages"]
        email["📧 Email"]
        webhook["🔔 Webhooks"]
        mcp["🧩 MCP"]
    end

    config --> fetch
    rss --> fetch
    hn --> fetch
    reddit --> fetch
    telegram --> fetch
    twitter --> fetch
    github --> fetch
    openbb --> fetch

    fetch --> dedup --> score --> enrich --> summary
    config --> score
    config --> summary
    config --> outputs

    summary --> site
    summary --> email
    summary --> webhook
    summary --> mcp

    class config config
    class rss,hn,reddit,telegram,twitter,github,openbb source
    class fetch,dedup,score,enrich,summary process
    class site,email,webhook,mcp output
  1. Define — Configure sources, processing profiles, models, languages, and delivery.
  2. Fetch — Pull latest content from all configured sources concurrently.
  3. Deduplicate — Merge items pointing to the same story or URL across platforms.
  4. Analyze & Filter — Select a profile, analyze each item with its prompt, and apply the configured user threshold.
  5. Enrich — Generate the profile's configured content blocks, using only tools allowed for each block.
  6. Summarize — Render localized titles, leads, sections, and cited sources as a Markdown briefing.
  7. Deliver — Publish the result to GitHub Pages, email, webhooks such as Feishu, MCP, or local files.

Quick Start

1. Install

Option A: Local Installation

git clone https://github.com/Thysrael/Horizon.git
cd Horizon

# Install with uv (recommended)
uv sync

# Install test/development extras when needed
uv sync --extra dev

# Or with pip
pip install -e .

dev is currently defined as an optional extra in pyproject.toml, so use uv sync --extra dev for pytest and other development dependencies.

If you want the optional OpenBB financial-news source, install its extra too:

uv sync --extra openbb

If openbb pulls packages without wheels on your machine, install the SDK manually with binaries only:

uv pip install --only-binary=:all: openbb openbb-benzinga

Option B: Docker

git clone https://github.com/Thysrael/Horizon.git
cd Horizon

# Optional: build with comma-separated extras before the first run
docker compose build --build-arg EXTRAS=trafilatura horizon

Multiple extras may be supplied as EXTRAS=trafilatura,openbb. The twitter extra also requires a Playwright browser and system packages, which the current Dockerfile does not install.

2. Configure

Option A: Interactive wizard (recommended)

uv run horizon-wizard

The wizard asks about your interests (e.g. "LLM inference", "嵌入式", "web security") and auto-generates data/config.json. See Interactive Wizard for CLI options.

Option B: Manual configuration

cp .env.example .env          # Add your API keys
cp data/config.example.json data/config.json  # Customize your sources

Minimal manual configuration:

{
  "ai": {
    "provider": "openai",
    "model": "gpt-4",
    "api_key_env": "OPENAI_API_KEY"
  },
  "sources": {
    "rss": [
      {
        "name": "Simon Willison",
        "url": "https://simonwillison.net/atom/everything/",
        "profile": "tech-news"
      }
    ]
  },
  "processing": {
    "profiles_dir": "profiles",
    "default_profile": "tech-news",
    "profile_settings": {
      "tech-news": {
        "threshold": 7.0,
        "topic_dedup": true
      }
    }
  }
}

An explicit source profile uses that profile directly. Omit it or set it to "auto" to let AI match the item against all available profiles. Set it to an array such as ["tech-news", "finance-news"] to restrict AI matching to those profiles. See Processing Profiles for profile structure and behavior. Per-profile user preferences such as score thresholds and topic deduplication belong in processing.profile_settings, not in the profile files.

Balanced digest (optional)

Limit the final digest size and prevent one category from dominating the results. Categories come from source configuration such as sources.rss[].category.

{
  "digest": {
    "max_items": 20,
    "category_groups": {
      "ai": {
        "limit": 5,
        "categories": ["ai-news", "ai-tools", "machine-learning"]
      },
      "finance": {
        "limit": 5,
        "categories": ["finance", "business", "equities"]
      }
    },
    "default_group": "other",
    "default_group_limit": 3
  }
}

Group limits are applied after profile filtering and before enrichment. If category_groups and max_items are omitted, no balanced digest limits apply.

api_key_env must be the name of an environment variable, not the API key itself. Put the real secret in .env:

OPENAI_API_KEY=sk-your-key

For Gemini, use GOOGLE_API_KEY:

{
  "ai": {
    "provider": "gemini",
    "model": "gemini-2.0-flash",
    "api_key_env": "GOOGLE_API_KEY"
  }
}

Any string value in data/config.json can reference environment variables with ${VAR_NAME}. This is useful for values such as ai.base_url, private RSS feed URLs, webhook endpoints, or custom header templates.

For the full reference, see the Configuration Guide.

3. Run

A. Local installation

uv run horizon [OPTIONS]

B. Docker

docker compose run --rm horizon [OPTIONS]
Option Default Description
--hours N 24 Fetch from last N hours
-d, --data-dir PATH data Path to the data directory
-c, --config PATH <data-dir>/config.json Path to config file
-l, --log-level LEVEL WARNING Logging level (DEBUG/INFO/WARNING/ERROR/CRITICAL)

--data-dir changes the state directory, including summaries, subscribers, and the default config location; --config changes only the config file. The generated report is saved to data/summaries/ (or <data-dir>/summaries/ if --data-dir is set). See Configuration Paths for combining both flags and initializing a custom config location.

4. Automate (Optional)

Horizon works great as a GitHub Actions cron job. See .github/workflows/daily-summary.yml for a ready-to-use workflow that generates and deploys your daily briefing to GitHub Pages automatically.

Supported Sources

Source What it fetches Comments
Hacker News Top stories by score Yes (top N comments)
RSS / Atom Any RSS or Atom feed —
Reddit Subreddits + user posts Yes (top N comments)
Telegram Public channel messages —
Twitter / X Tweets from specific users Yes (top N replies)
GitHub User events & repo releases —
OpenBB Financial company news by watchlist/provider —

Where Your Briefing Goes

Horizon can publish or deliver the generated briefing in several ways:

Channel What it does
GitHub Pages Daily Site Copies generated Markdown into docs/ so GitHub Pages can publish a daily-updated briefing site
Email Subscription Sends the daily briefing to subscribers and handles subscribe/unsubscribe requests through SMTP/IMAP
Webhook Notification Pushes success or failure results to Feishu/Lark, DingTalk, Slack, Discord, or a

Horizon (Thysrael/Horizon)

Searching Database…

10.7K ·GitHub
这是什么?Horizon 是一个自托管的 AI 资讯雷达:它每天盯守你指定的信息源,生成一份包含摘要、背景介绍和社区讨论的简报,英文和中文都有。
这是一个我直接看的网站,还是需要自己运行的东西?需要自己运行:它是一条 Python 流水线(本地或 Docker 里跑),负责抓取、去重、打分和补充信息,然后把做好的 Markdown 简报发到 GitHub Pages、邮箱或聊天 webhook。
我怎么把它跑起来?先用 'uv sync' 安装(或者用自带的 Docker 环境),然后运行交互式向导 —— 它会问你的兴趣,并自动生成 data/config.json。每次运行会把报告保存到 data/summaries/ 目录。
我需要自己的 LLM API 密钥吗?需要 —— 配置里通过环境变量的名字引用密钥,真正的密钥放在 .env 里(示例用的是 Gemini 的 GOOGLEAPIKEY)。可选功能里还包含 OpenBB 财经新闻,以及一个需要 Playwright 的 Twitter 信息源。
安装上有什么麻烦的地方吗?Docker 镜像里缺少 Twitter 信息源所需的 Playwright 浏览器和系统依赖包,OpenBB 拉取的软件包也可能没有预编译的二进制包 —— README 说明遇到这种情况时要只以二进制包方式手动安装那个 SDK。
每条新闻在进入简报之前会经过什么处理?各条目会并发抓取,跨平台指向同一条新闻的重复内容会被合并,每个条目会根据你的处理配置和分数阈值进行分析,然后通过联网检索补充背景资料、汇总社区评论,最后渲染成一份带引用的 Markdown 简报。
我能防止某个话题把简报刷屏吗?可以 —— 可选的均衡简报设置(分类分组和条目数上限)能限制简报的最终篇幅,防止单个分类占满版面;这些限制会在配置过滤之后、信息补充之前生效。
为什么它不只是又一个 AI 新闻摘要工具?作者认为 AI 很擅长降噪,但看新闻仍然离不开人的品味。Horizon 让你全程掌控:信息源、处理配置、模型、语言、推送渠道、评论摘要都可以自定义,还有一个社区信息源中心。
Creator
Thysrael
Size
15.3 MB
Stars
10.7K
Updated
CommitOct 13
Age
7mo
Commits · 90 Days