Tarang Deep Goel

Off the clock · Jan 2026

A news digest on n8n

A Telegram digest of the news I'd actually care about, built first as an n8n workflow on a Google Sheet, then on Supabase with a feedback loop, then rewritten as a Python service that scraped full articles and wrote me a briefing for each.

n8n-news-agent

Can I get only the news I'd actually care about?

I wanted a digest of the news I'd actually care about, sent somewhere I already look, and a way to tell it when it got something wrong. In January 2026 n8n was where everyone was wiring up these kinds of automations, so that's where I started.

How it works

flowchart TD
    A["16 news feeds"] --> B["Drop duplicates, scrape the full article"]
    B --> C[("Supabase: articles")]
    C --> D["Gemini scores each against my profile, 0 to 10, and writes a briefing"]
    D --> E["Telegram: the recommended ones, with the briefing"]
    E -->|"Relevant / Not relevant / Must read / Never show"| F[("My button presses")]

By the end it was a small Python service that woke up every two hours. It read 16 feeds, dropped duplicate stories, and scraped the full article wherever it could, because the summaries in the feeds were too thin to judge anything by. Gemini then scored each article from 0 to 10 against a profile of me as a product manager, with my interests and the topics I didn't want, and wrote a short briefing in bullet points so I wouldn't need to open the article at all. The recommended ones went to Telegram with four buttons, and every press was stored.

How I got here

1. n8n and a Google Sheet

I built the first version as an n8n workflow with a Google Sheet as the database. Eight feeds (TechCrunch, MIT Technology Review, Economic Times, Bloomberg Markets and a few others) landed in the sheet, and Gemini scored each article from 0 to 10 against a prompt describing me as a product manager with my interests and dislikes. The good ones went to Telegram with buttons like Relevant and Never Show. The buttons did nothing, because nothing captured the clicks.

2. A real database and a feedback loop

The same day I moved to Postgres on Supabase, so every button press was stored and nudged my topic preferences, and the prompt pulled those back in. The webhook for the clicks ran through ngrok on my laptop, and its address changed every time ngrok restarted.

The bigger problem was text. RSS summaries are thin, often under 500 characters, and I spent a session trying to get full articles from inside n8n. One reader service was blocked by some sites, archive.ph rate-limited me, pretending to be Googlebot got me the header but not the body, and with no proper HTML parser everything was regex.

3. The Python rewrite

Seven weeks later I rewrote it as a Python service that ran every two hours, with a proper scraper for full text, 16 feeds, and a short briefing per article so I wouldn't need to open it at all. TODO(tarang): a line on why I left n8n, if it was more than the scraping.

It worked as a digest, but it was still answering "is this relevant to my interests?", and I'd started caring about a different question: what a piece of news actually does to someone's life. So in March, on the same day as the last real change to this repo, I started a new one: Impact News. TODO(tarang): why a new repo rather than evolving this one?