n8n News pipeline - samkoBuilds
An AI news editor that runs twice a day without me
- n8n
- automation
- LLM
- Supabase
- RSS

Problem
The news section on this site had an obvious flaw: it only worked if I fed it. Reading TechCrunch, The Verge and VentureBeat every morning, deciding what was actually worth posting, rewriting a summary, pasting it in — that's twenty minutes a day of work that isn't building anything. Miss two days and the section looks abandoned, which is worse than not having it. The naive fix is "let AI write the news." I didn't want that. An unattended model publishing straight to a live site is how you end up with a hallucinated headline sitting under your own name. What I wanted was narrower: something that does the reading and the shortlisting, and leaves the publishing to me.
What I built
A workflow in n8n — a tool where you connect blocks visually instead of writing a whole application — running on a 12-hour schedule. It moves through four stages: 1. Ingest. The schedule trigger fans out to three RSS readers in parallel, one each for TechCrunch, The Verge and VentureBeat. Running them in parallel rather than in sequence means the whole fetch takes as long as the slowest feed, not the sum of all three. 2. Reduce. Everything merges into one stream, then hits a JavaScript step that does the unglamorous work: drop duplicates by link (the same story often appears in two feeds), discard anything older than 24 hours, cut each summary to 300 characters, and keep the top 25. It ends by flattening all of that into a single block of text. That flattening step is the one I'd call the actual engineering decision. The obvious approach is to send each article to the AI and ask "is this important?" — 25 articles, 25 API calls, 50 a day. Instead the pipeline sends one call containing all 25 and asks the model to choose between them. Same outcome, a fraction of the cost, and the model can compare stories against each other rather than judging each in isolation. 3. Select. A language model (gpt-4o-mini, temperature 0.3, locked to JSON output) gets a system prompt casting it as a tech news editor writing for AI and software professionals — weight model releases, funding rounds, acquisitions and big strategic moves. It returns exactly one story: title, link, a rewritten 2–3 sentence summary, and one line explaining why it picked that story over the rest. Low temperature and enforced JSON because I want the same behaviour every run, not creativity. 4. Persist. Another JavaScript step hardens the output — strips code fences if the model wraps its JSON, parses it, and throws a readable error containing the raw response if parsing fails, so a bad run tells me what went wrong instead of failing silently. It derives the source name from the link's hostname and stamps the record status: draft. That row goes into a Supabase table, with error handling set to continue so a rejected insert doesn't kill the run. Nothing publishes itself. Every story lands as a draft and waits for me in the admin UI. The pipeline has an opinion; it doesn't have permission.
Tech used
- n8n
- OpenAI gpt-4o-mini
- JavaScript
- Supabase (Postgres)
- RSS
- Next.js
Result
Running unattended on a 12-hour cycle. It replaced roughly 20 minutes of daily reading and rewriting with a two-minute review of a pre-written draft. The number I find more interesting than the time saved: the share of drafts I reject. That's the argument for keeping a human in the loop — the pipeline is a good editor, not an infallible one, and the design assumes that rather than hoping otherwise.