Automated news digest delivery system that aggregates breaking news from multiple RSS feeds and sends beautifully formatted HTML emails twice daily.
- π° Real-time news from 50+ RSS feeds across 7 categories
- π― Smart deduplication - prevents repeated articles across emails
- π Dark-themed, mobile-responsive email design
- π Quick-jump navigation with color-coded category links
- π Feed health monitoring with automatic alerts and stats
- β° Automated delivery via GitHub Actions (8 AM & 8 PM ET)
- π Secure - all credentials stored as environment variables
- π° 100% free - no paid services required
- Hosting: Vercel (serverless functions)
- Email: Gmail SMTP (free tier: 500 emails/day)
- News Sources: RSS feeds from CNN, BBC, Reuters, TechCrunch, etc.
- Scheduling: GitHub Actions (cron jobs)
- Language: Python 3.x
- Libraries: feedparser, smtplib, email.mime
- Top News - CNN, BBC, NPR, Reuters, NY Times, The Guardian, Al Jazeera, Washington Post
- Technology - TechCrunch, The Verge, Ars Technica, Wired, Engadget, CNET, ZDNet, Techmeme
- AI - MIT Tech Review, VentureBeat, AI News, MarTechPost, DeepMind, OpenAI, Google AI
- Arts & Entertainment - Variety, Hollywood Reporter, CNN, BBC, Deadline, EW, Rolling Stone
- Science - ScienceDaily, Scientific American, BBC, Phys.org, Nature, Space.com, New Scientist
- Health - Medical News Today, Healthline, CNN Health, BBC Health, WebMD, NIH
- Business - Bloomberg, CNBC, CNN Money, BBC Business, FT, WSJ, MarketWatch, Forbes
- Vercel account (free)
- Gmail account with App Password enabled
- GitHub account (for scheduling)
git clone https://github.com/YOUR_USERNAME/NewsMonitor.git
cd NewsMonitor- Go to your Google Account settings
- Enable 2-Step Verification
- Go to Security β App passwords
- Generate an app password for "Mail"
- Save the 16-character password
- Install Vercel CLI:
npm i -g vercel - Run:
vercel - Follow the prompts to deploy
- Add environment variables in Vercel dashboard:
GMAIL_ADDRESS=your-email@gmail.com
GMAIL_APP_PASSWORD=your-16-char-password
RECIPIENT_EMAIL=recipient@example.com
MY_SECRET_API_KEY=your-random-secret-key
Generate a random API key:
openssl rand -hex 32This requires the companion news-cron-job repository.
- Clone the cron job repo
- Add
MY_SECRET_API_KEYto GitHub Secrets - Update the Vercel URL in
run_cron.py - GitHub Actions will trigger the news digest twice daily
Edit RSS_FEEDS dictionary in api/send-news.py:
RSS_FEEDS = {
"Your Category": [
"https://example.com/feed.rss",
"https://another-source.com/rss"
]
}Edit category_colors in format_email_content():
category_colors = {
"Your Category": "#00ff88", # Bright cyan
}Edit .github/workflows/cron.yml in the news-cron-job repo:
schedule:
- cron: '0 13,1 * * *' # 8 AM & 8 PM ETChange the cutoff date in api/send-news.py:
cutoff_date = datetime.now() - timedelta(days=7) # Last 7 days- Pure black background (#000000)
- High-contrast vibrant colors
- Optimized for Apple Mail and Gmail
- Tracks sent articles for 30 days to prevent repeats
- Removes duplicates within each email batch
- Uses URL and content-based hashing for accuracy
- Shows deduplication stats in email footer
- Feed health dashboard at bottom
- Conditional alert banner if feeds fail
- Article count and success rate displayed
- Duplicate removal statistics
- Mobile-optimized layout
- Table-based for email client compatibility
- Works on iPhone, Android, desktop
βββββββββββββββββββ
β GitHub Actions β Triggers twice daily (cron)
ββββββββββ¬βββββββββ
β HTTP GET with API key
βΌ
βββββββββββββββββββ
β Vercel Function β Fetches RSS feeds, formats email
β (send-news.py) β
ββββββββββ¬βββββββββ
β SMTP
βΌ
βββββββββββββββββββ
β Gmail SMTP β Sends email to recipient
βββββββββββββββββββ
- β All credentials stored as environment variables
- β API key authentication for endpoint
- β No secrets in code repository
- β GitHub Secrets for cron job API key
- β Gmail App Password (not main password)
$0/month - All services used are free tier:
- Vercel: Free serverless functions
- Gmail: 500 emails/day free
- GitHub Actions: Free for public repos
- RSS feeds: Free
- Check Gmail settings aren't blocking it
- Ensure Gmail App Password is correct
- Verify SENDER_EMAIL and RECIPIENT_EMAIL are set
- Check Vercel function logs for RSS feed errors
- Some feeds may be temporarily down
- Look for feed health stats at bottom of email
- Deduplication system tracks articles for 30 days
- History is stored in
/tmp/sent_articles.jsonon Vercel - If running locally, history resets between sessions
- Check email footer for "Duplicates Removed" count
- Date filter is set to 7 days by default
- Some RSS feeds may have incorrect dates
- Check feed quality in Vercel logs
- Ensure you're viewing on a supported email client
- Try both light and dark system modes
- Gmail and Apple Mail are fully supported
Contributions welcome! Feel free to:
- Add more RSS feed sources
- Improve email design
- Add new categories
- Enhance monitoring features
MIT License - feel free to use for personal or commercial projects.
Built with Python, Vercel, and love for staying informed. Powered by RSS feeds from news organizations worldwide.