#434 App: RSS Digest Emailer (rss_digest)

closed medium Created 2025-12-14 20:17 · Updated 2026-01-02 06:26

Description

Edit
## Overview Aggregate multiple RSS feeds, filter by keywords/date, and send daily/weekly email digests. ## App Metadata - **App Name:** rss_digest - **Publisher:** platform - **Version:** 1.0.0 - **Priority:** Medium - **Complexity:** Low - **Phase:** 2 (Core business value) ## Actions ### 1. fetch_feeds **Description:** Parse and fetch items from multiple RSS/Atom feeds **Parameters:** - feed_urls (list, required): List of RSS feed URLs - max_items_per_feed (int, default=20): Maximum items to fetch per feed - since_hours (int, optional): Only items from last N hours - timeout_seconds (int, default=30): Request timeout per feed **Returns:** { "feeds_processed": 5, "total_items": 85, "items": [ { "title": "...", "link": "...", "published": "2025-01-01T00:00:00Z", "summary": "...", "feed_title": "Source Name", "feed_url": "..." } ], "errors": [{"feed_url": "...", "error": "..."}] } ### 2. filter_items **Description:** Filter feed items by keywords, date, or custom rules **Parameters:** - items (list, required): Items from fetch_feeds - keywords (list, optional): Include items matching any keyword - exclude_keywords (list, optional): Exclude items matching these - min_date (str, optional): Only items after this date - max_items (int, default=50): Maximum items to return - deduplicate (bool, default=True): Remove duplicate URLs **Returns:** { "filtered_count": 25, "original_count": 85, "items": [...], "keywords_matched": {"python": 10, "ai": 8} } ### 3. generate_digest **Description:** Format filtered items into HTML digest email **Parameters:** - items (list, required): Filtered items - digest_title (str, default='Your Daily Digest'): Email title - group_by (str, default='feed'): Grouping (feed|date|none) - include_summaries (bool, default=True): Include item summaries - max_summary_length (int, default=200): Truncate summaries - template (str, default='default'): Digest template name **Returns:** { "html": "...", "text": "...", "item_count": 25, "sections": [{"title": "TechCrunch", "count": 5}, ...] } ### 4. send_digest **Description:** Email the generated digest **Parameters:** - digest_html (str, required): HTML content from generate_digest - digest_text (str, required): Plain text fallback - recipient_email (str, required): Recipient - subject (str, default='Your Daily Digest - {{date}}'): Email subject - from_name (str, default='Highway Digest'): Sender name **Returns:** {"sent": true, "recipient": "...", "item_count": 25} ## Example Workflow - Daily Tech News Digest builder = WorkflowBuilder(name='daily_tech_digest', version='1.0.0') builder.task( task_id='fetch', function='apps.platform.rss_digest.fetch_feeds', kwargs={ 'feed_urls': [ 'https://news.ycombinator.com/rss', 'https://feeds.arstechnica.com/arstechnica/technology-lab', 'https://www.theverge.com/rss/index.xml' ], 'since_hours': 24 }, result_key='raw_items' ) builder.task( task_id='filter', function='apps.platform.rss_digest.filter_items', kwargs={ 'items': '{{raw_items.items}}', 'keywords': ['python', 'ai', 'startup'], 'max_items': 30 }, result_key='filtered' ) builder.task( task_id='format', function='apps.platform.rss_digest.generate_digest', kwargs={ 'items': '{{filtered.items}}', 'digest_title': 'Tech News Digest', 'group_by': 'feed' }, result_key='digest' ) builder.task( task_id='send', function='apps.platform.rss_digest.send_digest', kwargs={ 'digest_html': '{{digest.html}}', 'digest_text': '{{digest.text}}', 'recipient_email': 'user@example.com' } ) ## Supported Feed Formats - RSS 2.0 - RSS 1.0 - Atom ## Implementation Notes - Use feedparser library (robust RSS/Atom parsing) - Handle various date formats gracefully - Cache feed responses to avoid re-fetching - Implement parallel fetching for multiple feeds - Create responsive HTML email template - Support OPML import for feed lists (future) ## HTML Digest Template Features - Responsive design for mobile - Dark mode support via media queries - Grouped sections with collapsible headers - Read more links - Unsubscribe link placeholder ## Configuration Schema { "default_feeds": [], "fetch_timeout": 30, "max_items_per_digest": 100, "cache_ttl_minutes": 60, "default_template": "default" } ## Secrets Config None required ## Dependencies - feedparser for RSS/Atom parsing - httpx for feed fetching - Jinja2 for email templates - Email sending (SMTP) - dateutil for date parsing

Comments

Loading comments...

Context

Loading context...

Audit History

View All
Loading audit history...