---
name: mainline-sources
description: Adding new RSS feeds and data sources to Mainline
compatibility: opencode
metadata:
  audience: developers
  source_type: codebase
---

## What This Skill Covers

This skill covers how to add new data sources (RSS feeds, poetry) to Mainline.

## Key Concepts

### Feeds Dictionary (engine/sources.py)

All feeds are defined in a simple dictionary:

```python
FEEDS = {
    "Feed Name": "https://example.com/feed.xml",
    # Category comments help organize:
    # Science & Technology
    # Economics & Business
    # World & Politics
    # Culture & Ideas
}
```

### Poetry Sources

Project Gutenberg URLs for public domain literature:

```python
POETRY_SOURCES = {
    "Author Name": "https://www.gutenberg.org/cache/epub/1234/pg1234.txt",
}
```

### Language & Script Mapping

The sources.py also contains language/script detection mappings used for auto-translation and font selection.

## Adding a New RSS Feed

1. Edit `engine/sources.py`
2. Add entry to `FEEDS` dict under appropriate category:
   ```python
   "My Feed": "https://example.com/feed.xml",
   ```
3. The feed will be automatically discovered on next run

### Feed Requirements

- Must be valid RSS or Atom XML
- Should have `<title>` elements for items
- Must be HTTP/HTTPS accessible

## Adding Poetry Sources

1. Edit `engine/sources.py`
2. Add to `POETRY_SOURCES` dict:
   ```python
   "Author": "https://www.gutenberg.org/cache/epub/XXXX/pgXXXX.txt",
   ```

### Poetry Requirements

- Plain text (UTF-8)
- Project Gutenberg format preferred
- No DRM-protected sources

## Data Flow

Feeds are fetched via `engine/fetch.py`:
- `fetch_feed(url)` - Fetches and parses RSS/Atom
- Results cached for fast restarts
- Filtered via `engine/filter.py` for content cleaning

## Categories

Organize new feeds by category using comments:
- Science & Technology
- Economics & Business  
- World & Politics
- Culture & Ideas
