how it works
1. rss ingestion
24 RSS feeds across 6 categories: general, business, technology, health, science, and politics. sources include BBC, NPR, NYT, Reuters, and Google News. a GitHub Actions cron job rotates through one category every 15 minutes, so the whole set refreshes roughly every 90 minutes.
2. ai processing
new articles get sent to Gemini 2.5 Flash in batches. the prompt tells it to strip emotional language, clickbait patterns, and urgency theater from both headlines and descriptions. it keeps the facts — who, what, when, where — and drops everything designed to make you feel a certain way before you’ve read the actual story.
3. storage & dedup
processed articles go into Supabase. URL-based deduplication means the same story from multiple feeds only shows up once. articles are tagged by category and timestamped for freshness.
4. display
Next.js with Incremental Static Regeneration. pages are pre-rendered and revalidate every 15 minutes, so you get static-site speed with near-live content. light/dark theme, category nav, and a “see original” toggle if you want to compare what the AI changed.
5. hype scoring
alongside neutralization, Gemini rates each original headline 0–100 for emotional manipulation. 0 means it was already dry and factual. 100 means it was pure outrage bait. we use this to build the hype report — a breakdown of which sources and topics are most sensational.
the stack
- Next.js 14 (Pages Router, ISR)
- Supabase (Postgres storage)
- Gemini 2.5 Flash (headline neutralization)
- GitHub Actions (cron scheduling)
- Vercel (hosting)
- 24 RSS feeds, 6 categories