Skip to content

Commit 1026cde

Browse files
pal-hexraysclaude
andcommitted
feat(rss): add RSS feed reader with auto-discovery
- Add rss articles/get/info commands - Auto-discover feed URL from blog home page - Support common feed paths and HTML link tag discovery - No profile storage needed - one-shot operations Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 6747040 commit 1026cde

10 files changed

Lines changed: 1233 additions & 2 deletions

File tree

bun.lock

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/rss_analysis.md

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
# RSS Feed Integration Analysis
2+
3+
**Date:** January 2026
4+
**Status:** HIGHLY RECOMMENDED
5+
6+
## Executive Summary
7+
8+
RSS (Really Simple Syndication) integration is an excellent fit for agentio. Unlike social media APIs, RSS feeds are:
9+
- **Public** - No authentication required
10+
- **Standardized** - Well-defined XML formats (RSS 2.0, Atom, RDF)
11+
- **Free** - No API costs or rate limits
12+
- **Read-only** - Focused on content consumption
13+
14+
This makes RSS one of the simplest integrations to implement while providing high value for LLM agents that need to consume web content.
15+
16+
## API Overview
17+
18+
### Feed Formats Supported
19+
20+
| Format | Description | Common Use |
21+
|--------|-------------|------------|
22+
| RSS 2.0 | Most common, XML-based | Blogs, news sites |
23+
| Atom | More modern, XML-based | Google services, modern blogs |
24+
| RDF | Older format | Legacy feeds |
25+
| JSON Feed | Modern JSON-based | Developer blogs |
26+
27+
### No Authentication Required
28+
29+
RSS feeds are designed for public consumption. The "profile" concept in agentio would store:
30+
- Feed URL
31+
- Optional display name
32+
- Optional category/tag
33+
34+
No OAuth, API keys, or tokens needed.
35+
36+
## Capabilities for agentio
37+
38+
### Read Operations
39+
40+
| Operation | Description | Implementation |
41+
|-----------|-------------|----------------|
42+
| `list` | List articles from a feed | Fetch and parse feed XML |
43+
| `get` | Get full article content | Fetch feed, find by ID/GUID |
44+
| `search` | Search across saved feeds | Parse multiple feeds, filter |
45+
46+
### Profile Management
47+
48+
Instead of credentials, profiles store feed configurations:
49+
50+
```typescript
51+
interface RssProfile {
52+
url: string; // Feed URL
53+
name?: string; // Display name
54+
category?: string; // Optional grouping
55+
lastFetched?: number; // Cache timestamp
56+
}
57+
```
58+
59+
### Proposed Commands
60+
61+
```bash
62+
# Feed management
63+
agentio rss add <url> [--name <name>] [--profile <name>]
64+
agentio rss list # List configured feeds
65+
agentio rss remove --profile <name>
66+
67+
# Article operations
68+
agentio rss articles [--profile <name>] [--limit N] [--since <date>]
69+
agentio rss get <article-id> [--profile <name>]
70+
agentio rss search --query <text> [--profile <name>]
71+
72+
# Multi-feed operations
73+
agentio rss all [--limit N] # Articles from all feeds
74+
```
75+
76+
## Technical Implementation
77+
78+
### Recommended Library: rss-parser
79+
80+
[rss-parser](https://www.npmjs.com/package/rss-parser) is the most popular choice:
81+
- 2M+ weekly downloads
82+
- TypeScript support built-in
83+
- Handles RSS 2.0, Atom, and RDF
84+
- Works with custom fields
85+
- Promise-based API
86+
87+
```typescript
88+
import Parser from 'rss-parser';
89+
90+
const parser = new Parser();
91+
const feed = await parser.parseURL('https://example.com/feed.xml');
92+
93+
console.log(feed.title);
94+
for (const item of feed.items) {
95+
console.log(item.title, item.link, item.pubDate);
96+
}
97+
```
98+
99+
### Alternative: Feedsmith
100+
101+
[Feedsmith](https://github.com/macieklamberski/feedsmith) is a newer option:
102+
- TypeScript-first
103+
- Supports JSON Feed format
104+
- OPML import/export
105+
- Tree-shakable
106+
107+
### No External Dependencies Option
108+
109+
Could also use native fetch + a lightweight XML parser, but rss-parser handles edge cases and malformed feeds gracefully.
110+
111+
## Architecture Differences from Other Services
112+
113+
| Aspect | Other Services | RSS |
114+
|--------|----------------|-----|
115+
| Authentication | OAuth/API keys | None |
116+
| Credentials storage | Encrypted tokens | Plain feed URLs |
117+
| Profile = | Account access | Feed subscription |
118+
| Rate limits | Platform-imposed | None (be polite) |
119+
| Write operations | Yes | No (read-only) |
120+
121+
### Profile Storage
122+
123+
Since no secrets are involved, RSS profiles could be stored in plain config:
124+
125+
```json
126+
{
127+
"profiles": {
128+
"rss": ["tech-news", "dev-blog", "company-updates"]
129+
},
130+
"rss": {
131+
"tech-news": {
132+
"url": "https://news.ycombinator.com/rss",
133+
"name": "Hacker News"
134+
},
135+
"dev-blog": {
136+
"url": "https://blog.example.com/feed.xml",
137+
"name": "Dev Blog"
138+
}
139+
}
140+
}
141+
```
142+
143+
## Rate Limiting Considerations
144+
145+
While RSS has no official rate limits, best practices:
146+
- Cache feeds locally (refresh every 15-30 min)
147+
- Respect `ttl` element if present in feed
148+
- Use conditional GET (If-Modified-Since header)
149+
- Don't hammer feeds on every command
150+
151+
## Feasibility Assessment
152+
153+
### Pros
154+
155+
1. **No authentication** - Simplest integration possible
156+
2. **No API costs** - Completely free
157+
3. **No rate limits** - Within reason
158+
4. **Standardized format** - Well-supported libraries
159+
5. **High value** - LLM agents can consume news, blogs, updates
160+
6. **Offline-friendly** - Can cache feeds locally
161+
162+
### Cons / Limitations
163+
164+
1. **Read-only** - Cannot post to RSS feeds
165+
2. **Full content varies** - Some feeds only include summaries
166+
3. **No real-time** - Polling-based, not push
167+
4. **Inconsistent quality** - Some feeds are malformed
168+
169+
### Risk Matrix
170+
171+
| Risk | Severity | Likelihood | Mitigation |
172+
|------|----------|------------|------------|
173+
| Malformed feed | Low | Medium | rss-parser handles gracefully |
174+
| Feed URL changes | Low | Low | User re-adds feed |
175+
| CORS issues | N/A | N/A | CLI tool, not browser |
176+
| Feed removed | Low | Low | Clear error message |
177+
178+
## Recommendation: IMPLEMENT
179+
180+
**Priority: HIGH** - This should be one of the easiest and most valuable integrations.
181+
182+
### Implementation Estimate
183+
184+
| Phase | Effort |
185+
|-------|--------|
186+
| Types | 15 min |
187+
| Client | 30 min |
188+
| Commands | 45 min |
189+
| Output | 20 min |
190+
| Testing | 30 min |
191+
| **Total** | **~2.5 hours** |
192+
193+
### Comparison with Other Services
194+
195+
| Service | Auth Complexity | Implementation Time | Value |
196+
|---------|-----------------|---------------------|-------|
197+
| RSS | None | 2.5 hours | High |
198+
| Discord | Low (token) | 3 hours | High |
199+
| Confluence | Medium (OAuth) | 16-20 hours | Medium |
200+
| Twitter | High (OAuth + $) | 8-12 hours | Medium |
201+
202+
## Sources
203+
204+
- [rss-parser - npm](https://www.npmjs.com/package/rss-parser)
205+
- [Feedsmith - GitHub](https://github.com/macieklamberski/feedsmith)
206+
- [@rowanmanning/feed-parser](https://github.com/rowanmanning/feed-parser)
207+
- [Building an RSS Feed Reader with TypeScript](https://www.timsanteford.com/posts/building-an-rss-feed-reader-with-typescript-and-axios/)

0 commit comments

Comments
 (0)