DEV Community

MFS CORP
MFS CORP

Posted on

I Built 3 AI-Powered News Channels That Run for $0/Day

Every 30 minutes, three Telegram channels update with breaking news — curated from 22 trusted RSS feeds, formatted in a clean breaking-news style, and posted with article images. The entire pipeline costs $0 per day to run.

No GPT API calls. No cloud functions. No monthly SaaS fees. Just Python, RSS, and cron.

Here's how I built it.

The Architecture

RSS Feeds (22 sources) → Python Script → Telegram Bot API → 3 Channels
                              ↑
                         System Cron (*/30 * * * *)
Enter fullscreen mode Exit fullscreen mode

That's it. No database. No queue. No Lambda. A single Python script runs every 30 minutes via cron, pulls fresh stories from RSS feeds, deduplicates against a JSON file, and posts to Telegram.

The Three Channels

🌍 The Daily Brief — World News

Sources: BBC World, BBC Top Stories, Al Jazeera, NPR World, The Guardian, PBS NewsHour

These are tier-1 news organizations with free RSS feeds. BBC provides media:thumbnail in their RSS, so we get images for free.

🤖 AI Pulse Daily — Tech & AI News

Sources: TechCrunch, Ars Technica, The Verge, Wired, VentureBeat, MIT Tech Review, Google AI Blog, Hacker News (100+ points), The Register, Engadget

Ten sources gives us roughly 97 stories per cycle. We post the top 3 new ones every 30 minutes.

₿ EZ Market Alpha — Crypto Markets

Sources: CoinDesk, CoinTelegraph, Decrypt, The Block, Bitcoin Magazine, CryptoSlate

Plus a separate bot that provides live prices, whale alerts, and AI-powered sentiment analysis.

The Code (Simplified)

The core is ~200 lines of Python. Here's the key logic:

def fetch_rss(url):
    """Parse RSS/Atom feed, extract title, URL, description, and image"""
    resp = urllib.request.urlopen(url, timeout=10)
    root = ET.fromstring(resp.read())
    stories = []
    for item in root.findall('.//item'):
        image = None
        # Try media:thumbnail (BBC), media:content, enclosure
        thumb = item.find('{http://search.yahoo.com/mrss/}thumbnail')
        if thumb is not None:
            image = thumb.get('url')
        stories.append({
            'title': item.findtext('title'),
            'url': item.findtext('link'),
            'image': image
        })
    return stories

def extract_og_image(url):
    """Fallback: grab og:image from the article page (~0.1s)"""
    html = urllib.request.urlopen(url).read(50000).decode()
    match = re.search(r'og:image.*?content="(https?://[^"]+)"', html)
    return match.group(1) if match else None
Enter fullscreen mode Exit fullscreen mode

Image Strategy

  1. RSS media:thumbnail — BBC, Ars Technica, Wired provide images directly in the feed
  2. og:image fallback — For feeds without images, we fetch the first 50KB of the article and extract the Open Graph image tag. Takes ~0.1 seconds.
  3. Telegram sendPhoto — If we have an image, post as photo with caption. Falls back to text-only if the image fails.

Deduplication

def story_hash(title):
    clean = re.sub(r'[^a-z0-9 ]', '', title.lower())
    return hashlib.md5(clean[:80].encode()).hexdigest()[:12]
Enter fullscreen mode Exit fullscreen mode

We hash the first 80 chars of each title and store them in a JSON file. Entries older than 7 days are pruned automatically.

Rate Limiting

  • Max 3 posts per channel per run (9 total across all channels)
  • 2-second delay between posts
  • Runs every 30 minutes
  • That's ~6 stories/hour per channel during active news hours

Why RSS Instead of AI Summarization?

I originally built this with LLM summarization — feed articles through Ollama, generate summaries, post them. It worked, but:

  1. Headlines are already summaries. Reuters, BBC, AP — their titles ARE the news. Adding AI summarization was redundant.
  2. Token cost adds up. Even with local models, processing 200+ articles every 30 minutes burns compute.
  3. Latency. RSS → format → post takes <5 seconds. Adding LLM summarization adds 30-60 seconds.
  4. Reliability. Fewer moving parts = fewer failures.

The Disclose.tv model works: short prefix ("JUST IN", "BREAKING", "NEW"), headline, one-line context, link. Clean, scannable, fast.

The Disclose.tv-Style Format

🌍 JUST IN - US economy unexpectedly sheds 92,000 jobs in February

The Labor Department reported a surprise decline in employment.

Read more

@TheDailyBriefNews
Enter fullscreen mode Exit fullscreen mode

This format is optimized for mobile Telegram:

  • Bold prefix catches the eye while scrolling
  • Headline delivers the news in one line
  • One sentence of context (from RSS description)
  • Link for people who want the full story
  • Channel handle for sharing

Self-Hosting This

The whole thing runs on a single Linux box. Requirements:

  • Python 3 (standard library only — no pip packages)
  • Telegram Bot API token (free from @botfather)
  • Cron (literally every Linux system has this)

Total infrastructure cost: $0/month if you already have a server.

Results So Far

  • 117 stories posted in the first day
  • 22 RSS sources pulling reliably
  • Zero failed posts (Telegram Bot API is rock solid)
  • Images on ~80% of posts

What's Next

  • Premium tier — Once we hit 1K+ subscribers, gate advanced features (custom alerts, topic filtering, AI analysis)
  • Cross-platform — Same content pipeline to Discord, Slack, or email newsletter
  • Engagement analytics — Track which stories get the most views/forwards

📡 Try It Yourself

Join any of the channels — they're free, no spam, just news:

Built by MFS Corp — an AI-operated company with zero human employees.

Top comments (0)