Case study · AI integration · November 2026

AI News Briefing

An open-source news aggregator, adapted into a reliable daily AI briefing.

Built on Horizon, an open-source project The news-processing engine is Horizon by Thysrael (MIT licence). My part was choosing it, adapting it for AI-only news, fixing two bugs that stopped it working, and automating it. The exact split is in the first section below.

Each morning it collects the last 24 hours of AI news from 16 sources, has Claude score every story against a rubric written for this project, merges duplicates, writes up the best ten or so, and emails the briefing before I'm up.

16 → 1sources in, one email out
~100 → 10stories scored, then kept
4 fixesto make it work in practice
~6½ minper run, fully unattended
Open sourcebuilt on Horizon (MIT)
Scope

What came from Horizon, and what I added

Horizon is a general-purpose aggregator. Out of the box it's set up for general tech and finance news, and on this machine it didn't produce a briefing at all until two bugs were fixed.

From Horizon (open source)

  • The pipeline engine and its collectors for RSS, Hacker News, Reddit and GitHub
  • The LLM scoring framework and profile system
  • Duplicate merging and quota-based selection
  • Write-ups using web search and past briefings
  • Markdown archive and email delivery

What I added

  • Tool selection: compared five approaches against written requirements
  • AI-only scoring profile: relevance rule and rubric (profiles/ai-news)
  • Sources and quotas: 16 AI sources, with combined Reddit feeds to get around blocking
  • Two bug fixes to Horizon's code: API error handling and rate-limit retry
  • Tuning: thresholds, model choice, and concurrency under rate limits
  • Automation: scheduled task, logging wrapper, setup scripts
  • Documentation: this case study and an operator guide
The goal

One short, trustworthy AI briefing a day

AI news is spread across lab blogs, tech press, newsletters, Reddit, Hacker News and GitHub, and most of it is noise. I wanted a "what's new" email each morning that only covered things that mattered, explained why they mattered, and didn't need me to keep anything running.

My requirements were:

  • Pull from the primary sources (the labs themselves) as well as the press and the communities discussing them.
  • Filter by importance, not popularity, and drop anything that isn't really about AI.
  • Merge the five articles about the same launch into one entry.
  • Add enough background that a headline makes sense on its own.
  • Run unattended every morning and arrive by email.
Research

Build, borrow or buy

Before building anything I surveyed what already existed on GitHub, in the n8n template library and in community write-ups. I compared five approaches against the requirements.

OptionWhat it isStrengthsWhy not / whyVerdict
Horizon
Thysrael/Horizon · ~12.8k ★ · MIT
Open-source Python news aggregator with LLM scoringMany source types, per-profile scoring rubrics, AI-based duplicate merging, background enrichment with web search, email deliveryCovered every requirement and is actively maintained. Needed AI-specific configuration and two bug fixesChosen
agents-radar
~1.2k ★
A ready-made daily digest published by someone elseNo setup: subscribe by RSS or TelegramFixed sources, focused on AI developer tools, no control over filteringNot chosen
n8n templatesVisual workflows: RSS → LLM summary → emailEasy to read and changeNeeds an n8n server. Templates do simple keyword filters, with no scoring rubric or duplicate mergingNot chosen
Claude scheduled taskAn AI assistant prompted to search the web each morningAlmost no setup and no API keyResults vary from day to day, with no fixed sources or repeatable scoringNot chosen
Custom scriptWriting my own fetch → summarise → email scriptTotal controlWould rebuild most of what Horizon already does wellNot chosen
Architecture

How it fits together

Collection, filtering and scheduling run locally. Only the LLM calls, web search and email leave the machine.

SOURCES WINDOWS PC EXTERNAL SERVICES AI lab blogs Anthropic, OpenAI, DeepMind, Google AI News & analysis Verge, TechCrunch, Latent Space +5 Reddit (RSS) 5 subreddits in 2 combined feeds Hacker News top stories + comments (API) OSS Insight GitHub repos gaining stars today Task Scheduler daily 06:30 PowerShell wrapper runs + logs each run Horizon pipeline open source · by Thysrael 1 Fetch 2 Merge 3 Score 4 Filter 5 De-dupe 6 Balance 7 Enrich 8 Deliver Blue outline: calls the LLM. Orange dot: patched by me. Step 7 can also search the web and past briefings. config.json sources, quotas .env secrets ai-news scoring rubric summaries Markdown archive Config is read at start; each briefing is archived as Markdown, which step 7 searches for earlier coverage of the same story. Anthropic API Claude Sonnet 5.5 Web search DuckDuckGo and others Gmail SMTP port 465 · SSL · app password Inbox HTML + plain-text email My additions Horizon (open source) or third party Calls the LLM Patched by me
Orange outlines mark what this project added; grey is Horizon or third-party services. Horizon's eight steps run in a fixed order. Scoring sends one LLM request per item and returns structured JSON (score, reason, summary, tags). Write-ups only happen after quotas are applied, so no tokens are spent on stories that won't make the briefing.

How a hundred stories become ten

Collected16 feeds, last 24 h 102 Scored by LLMevery item, 0–10 102 Passed thresholdnews ≥ 6 · deep dives ≥ 5 17 Same-story merge5 duplicates folded in 12 Quotas appliedper-category caps 10 Emailedwritten up in full 10
Real counts from a weekday test run, drawn to scale. The score threshold does most of the work.
Making it work

Four problems found in testing, and how they were fixed

The software installed cleanly but didn't work as intended on the first real runs. Each problem was spotted in the run logs or the briefing itself, reproduced in isolation where possible, and fixed with the smallest change that solved it.

1. Every LLM call failed

Symptom

All 176 scoring requests to Claude came back as 400 Bad Request, so the briefing would have been empty.

Diagnosis

A minimal API call with the same key worked. Adding settings one at a time isolated temperature: the API now rejects it with "Extra inputs are not permitted". Horizon has a fallback that retries without temperature, but it only recognised older wordings of that error.

Fix

One line added to the error-matching function, so the existing fallback runs.

Result

Every call succeeds on the first fallback. Failed requests aren't billed, so the broken run cost nothing.

src/ai/client.py · _is_temperature_unsupported()         or "only 1 is allowed" in lowered
+        or "not permitted" in lowered  # Anthropic: "temperature: Extra inputs are not permitted"
     )

2. Reddit was blocking the scraper

Symptom

Collection took about 13 minutes, and Reddit posts arrived without their comments.

Diagnosis

Reddit returns 403 to automated requests for its normal pages and its JSON API. Horizon tried both routes for every subreddit and every post, about 20 seconds per blocked attempt, before falling back to RSS. The project's issue tracker showed other users hitting the same thing. RSS was rate-limited too, returning 429 for about half of rapid requests.

Fix

Read RSS directly and combine the five subreddits into two multi-subreddit feeds, so there are 2 requests a day. Add retry with linear backoff on 429.

Result

Reddit now takes 2 requests a day instead of dozens of blocked ones, and the whole run finishes in about 6 minutes. In testing, a feed refused three times succeeded on the fourth attempt.

src/scrapers/rss.py · _fetch_feed()+        # Retry rate-limited feeds (Reddit RSS often answers 429) with backoff.
+        for attempt in range(4):
+            response = await self.client.get(feed_url, follow_redirects=True,
+                                             headers={"User-Agent": RSS_USER_AGENT})
+            if response.status_code != 429 or attempt == 3:
+                break
+            await asyncio.sleep(15 * (attempt + 1))
         response.raise_for_status()

3. Half the briefing wasn't about AI

Symptom

The first working briefing had 4 items. Two were general tech stories (an SSH vulnerability, a desktop-app rewrite) that came in through Hacker News.

Diagnosis

The built-in scoring rubric is for all of technology, so an important non-AI story scores as highly as an AI one. The threshold of 7 was also too strict for a niche topic.

Fix

A custom ai-news profile with its own matching and scoring prompts and a relevance rule: non-AI items score at most 3, and items that mention AI only in passing score at most 4. The rubric bands were rewritten for an AI reader, and the threshold was lowered to 6.

Result

On the same day's sources: 10 items, all about AI.

Before · general tech rubric

4 items, 2 off-topic

After · ai-news rubric

10 items, 0 off-topic

4. Write-ups silently disappeared

Symptom

One run produced a briefing where all 10 items had only a one-line summary. The background and impact sections were missing, though the run reported success.

Diagnosis

The enrichment step failed straight after a burst of about 100 scoring requests at concurrency 4. A short rerun with fewer items enriched every item correctly. That points to request-rate limits on a new API account rather than a code fault.

Fix

Reduced concurrency to 2 for scoring and 1 for write-ups. That trades about a minute of run time for headroom under the rate limit.

Result

The first scheduled run after the change wrote up every item in full.

Key decisions

The trade-offs behind the design

Horizon

over n8n templates or an AI scheduled task

A fixed set of sources with a written scoring rubric gives a briefing I can tune and trust from day to day. A prompt-only approach would produce something different every morning.

Combined Reddit RSS feeds

over Reddit's scraper and API routes

Reddit blocks the other routes, so the only reliable path is RSS. Two combined feeds keep the request count low enough to stay under its rate limit, at the cost of comment threads.

Claude Sonnet 5.5

over the cheaper Haiku 5.5

Scoring and write-ups need judgement, and quality is the point of the briefing. Haiku stays available as a cost lever with a one-line config change, once a few weeks of usage data show what a run actually costs.

Python virtual environment

over Docker

Horizon ships with Docker support. For one daily job on one Windows machine, Docker Desktop would add WSL2, a background service and memory overhead, plus one more thing that has to be running at 6:30, with no benefit at this scale. Docker becomes the right choice if the job moves to a server so it runs while the PC is off.

Results

What it produces

~10items on a typical weekday, from about 100 collected
0off-topic items in the 3 runs since the custom rubric
6 min 26 sfull run, measured through the scheduler
160–200kLLM tokens per run, about 85% input

The Ultimate MoE Training Handbook: training Mixture-of-Experts models with Megatron-LM

★ 6.0/10 · Reddit: LocalLLaMA + MachineLearning
Summary

A new handbook for engineers who have trained dense models explains how to train Mixture-of-Experts models with Megatron-LM, from a hardware test and dense baseline to a first single-node MoE run. The authors say it draws on about 800k GH200 GPU-hours on the Alps cluster at CSCS.

Background

An MoE model replaces each dense feed-forward layer with many smaller "expert" networks and a router that sends each token to only a few of them, cutting compute per token but adding problems such as balancing load across experts.

Impact

Teams moving from dense to MoE training get a consolidated starting point: a baseline comparison, recommended flags and scripts. Teams on other hardware should validate the settings themselves.

#Mixture-of-Experts#Megatron-LM#LLM training#handbook

One item from a real briefing, shortened. The model was told to separate vendor claims from verified results, and the write-up does that: "the authors say", and a note that the recommendations aren't benchmarked.

Skills and tools

What this project involved

Evaluating tools

Writing requirements first, surveying GitHub, n8n and hosted options against them, and justifying the choice and its trade-offs.

Configuring LLMs

Writing a scoring rubric and relevance rules as prompts, choosing the model, and tuning thresholds, token use and concurrency under rate limits.

Fixing someone else's code

Reading logs, isolating failures with minimal reproductions, interpreting HTTP 400, 403 and 429 responses, and making small, targeted patches to an unfamiliar codebase.

Automation and ops

Python virtual environments, PowerShell, Windows Task Scheduler, SMTP over SSL, and keeping secrets out of version control.

How it was built. I built this with Claude Code, Anthropic's AI coding agent, working as a pair. I set the goal and requirements, chose between the options, made the trade-off decisions above, and reviewed each test briefing. Claude Code did the source research, wrote the configuration and custom profile, read the logs, and made the code fixes. Every change was checked against a real run before moving on.

Next steps

Where it could go