https://github.com/ximilalaxiang/yourrss
AI-powered RSS digest from FreshRSS with Cortex Memory personalized recommendations. Smart scoring, preference learning, Blinko integration. Works with OpenClaw, Cursor, Claude Code.
https://github.com/ximilalaxiang/yourrss
ai-agent ai-digest ai-summary blinko claude-code cortex-memory cursor freshrss google-reader-api mcp news-digest openclaw openclaw-skill personalized-recommendations rss rss-aggregator rss-reader self-hosted
Last synced: 1 day ago
JSON representation
AI-powered RSS digest from FreshRSS with Cortex Memory personalized recommendations. Smart scoring, preference learning, Blinko integration. Works with OpenClaw, Cursor, Claude Code.
- Host: GitHub
- URL: https://github.com/ximilalaxiang/yourrss
- Owner: XimilalaXiang
- Created: 2026-04-06T08:48:00.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-04-06T11:13:43.000Z (3 months ago)
- Last Synced: 2026-04-06T11:20:40.710Z (3 months ago)
- Topics: ai-agent, ai-digest, ai-summary, blinko, claude-code, cortex-memory, cursor, freshrss, google-reader-api, mcp, news-digest, openclaw, openclaw-skill, personalized-recommendations, rss, rss-aggregator, rss-reader, self-hosted
- Language: JavaScript
- Size: 64.5 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# YourRSS
[English](./README.md) | [中文](./README_CN.md)
Your personal AI-powered RSS digest — built on self-hosted FreshRSS.
YourRSS fetches articles from your FreshRSS instance, scores them by relevance and quality with AI, generates concise summaries, and learns your reading preferences through [Cortex](https://github.com/rikouu/cortex) Memory. Every digest gets smarter.
Works with **OpenClaw**, **Cursor**, **Claude Code**, **OpenCode**, and any AI agent that can run shell scripts.
## Features
- **Smart Digest** — AI scores and ranks your RSS articles into a daily briefing
- **Flexible AI Provider** — Use the current Agent or an external model (OpenAI, Gemini, DeepSeek, Qwen, Ollama, or any OpenAI-compatible gateway)
- **Full-text Analysis** — Scores based on complete article content, not just summaries
- **Concurrent Processing** — Configurable batch size and concurrency for fast scoring (300 articles in ~3min)
- **Two-phase Scoring** — Lightweight scores for all articles + detailed summaries for top N
- **Personalized Recommendations** — Cortex Memory `reader` agent learns what you like
- **Preference Learning** — Like/dislike to teach the system; explicit `/prefer` commands
- **Feed Management** — Subscribe/unsubscribe feeds directly via commands
- **Blinko Integration** — Save highlights to your Blinko knowledge base
- **Multi-language** — Chinese and English output
- **Category Filtering** — Focus on specific FreshRSS categories
- **100% Self-hosted** — FreshRSS + Cortex + Blinko = your infrastructure, your data
## Quick Start
### OpenClaw
```bash
clawhub install yourrss
```
Then: `/digest`
### Cursor / Claude Code / Other Agents
```bash
git clone https://github.com/XimilalaXiang/YourRSS.git
```
Reference the `SKILL.md` in your agent configuration.
## Setup
### 1. FreshRSS (Required)
```bash
export FRESHRSS_URL="https://your-freshrss-instance.com"
export FRESHRSS_USER="your-username"
export FRESHRSS_API_PASSWORD="your-api-password"
```
Or create a `.env` file in the project root (see `.env.example`).
### 2. Cortex Memory (Required)
```bash
export CORTEX_URL="http://localhost:21100"
export CORTEX_TOKEN="your-auth-token" # optional
export CORTEX_AGENT="reader" # isolated namespace for RSS
```
The `reader` agent is auto-created on first use. Your RSS preferences are isolated from other Cortex agents.
### 3. AI Scoring Provider (Optional)
```bash
# "agent" = Agent handles scoring (the AI agent in your current session)
# "openai" = external OpenAI-compatible API (saves Agent tokens)
export AI_PROVIDER="agent"
export AI_BASE_URL="https://api.openai.com/v1" # or your gateway
export AI_API_KEY="sk-..."
export AI_MODEL="gpt-4o-mini"
```
Compatible with: OpenAI, Gemini, DeepSeek, Qwen, Ollama, or any OpenAI-compatible proxy (e.g. [vercel-gateway-tools](https://github.com/XimilalaXiang/vercel-gateway-tools)).
### 4. Blinko (Optional)
```bash
export BLINKO_URL="https://your-blinko-instance.com"
export BLINKO_TOKEN="your-api-token"
```
## How It Works
```
FreshRSS API → Fetch Articles → Cortex Preferences → AI Scoring → AI Summary → Digest
│ │ │ │ │ │
Google Reader fetch-freshrss.mjs REST API to relevance/ 2-3 sentence Telegram
API (zero deps) reader agent quality/ summaries message
/api/v1/recall timeliness
```
**Personalization loop:**
```
User reads digest → /like or /dislike → Cortex stores preference
↓ ↓
Next digest ← scores biased by preferences ← Cortex recalls
```
## Commands
| Command | Description |
|---------|-------------|
| `/digest` | Generate AI digest (default: last 24h) |
| `/digest 48h` | Digest from last 48 hours |
| `/recommend` | Personalized recommendations from Cortex |
| `/like 3` | Like article 3 → stored in Cortex |
| `/dislike 2` | Dislike article 2 → stored in Cortex |
| `/save 1` | Save article 1 to Blinko |
| `/prefer topic:AI security` | Explicit preference |
| `/forget topic:crypto` | Remove a preference |
| `/feeds` | List FreshRSS subscriptions |
| `/categories` | List FreshRSS categories |
| `/subscribe ` | Subscribe to a new feed |
| `/unsubscribe ` | Unsubscribe from a feed |
## Scripts
| Script | Purpose |
|--------|---------|
| `scripts/fetch-freshrss.mjs` | FreshRSS Google Reader API client |
| `scripts/cortex-api.mjs` | Cortex Memory REST API client |
| `scripts/score-articles.mjs` | AI scoring: agent passthrough or external OpenAI API |
| `scripts/load-env.mjs` | Load .env config (shared by all scripts) |
### fetch-freshrss.mjs
```bash
# Fetch unread articles from last 24h
node scripts/fetch-freshrss.mjs --hours 24 --count 50 --unread
# Filter by category
node scripts/fetch-freshrss.mjs --hours 24 --category "Technology" --unread
# List categories / feeds
node scripts/fetch-freshrss.mjs --categories
node scripts/fetch-freshrss.mjs --feeds
# Subscribe / unsubscribe
node scripts/fetch-freshrss.mjs --subscribe "https://example.com/feed.xml" --subscribe-category "Tech"
node scripts/fetch-freshrss.mjs --unsubscribe "feed/123"
```
### score-articles.mjs
```bash
# Score via external OpenAI-compatible API (saves Agent tokens)
node scripts/fetch-freshrss.mjs --hours 24 --count 100 \
| node scripts/score-articles.mjs --top 15 --language zh
# With user preferences from Cortex
node scripts/cortex-api.mjs preferences > /tmp/prefs.json
node scripts/fetch-freshrss.mjs --hours 48 --count 200 \
| node scripts/score-articles.mjs --top 15 --preferences /tmp/prefs.json
# Tune batch size and concurrency
node scripts/fetch-freshrss.mjs --hours 72 --count 300 \
| node scripts/score-articles.mjs --top 20 --batch-size 10 --concurrency 20
# Override model on-the-fly
... | node scripts/score-articles.mjs --provider openai --model google/gemini-3-flash
```
### cortex-api.mjs
```bash
# Initialize reader agent (run once)
node scripts/cortex-api.mjs init
# Get user preferences
node scripts/cortex-api.mjs preferences
# Record a like
node scripts/cortex-api.mjs like "Article Title" --source "Blog" --topics "AI,Go"
# Search memories
node scripts/cortex-api.mjs recall "favorite topics"
# Store a memory
node scripts/cortex-api.mjs remember "User prefers Go articles" --category preference
# Log a digest session
node scripts/cortex-api.mjs digest-log "2026-04-06" --topics "AI,Security" --articles 10
```
## Project Structure
```
YourRSS/
├── SKILL.md # Skill definition (AI workflow + Cortex + Blinko)
├── README.md
├── .env.example # Environment variable template
├── scripts/
│ ├── fetch-freshrss.mjs # FreshRSS API client (Node.js, zero deps)
│ ├── score-articles.mjs # AI scoring: agent passthrough or external API
│ ├── cortex-api.mjs # Cortex Memory REST API client (zero deps)
│ └── load-env.mjs # .env loader (shared by all scripts)
└── references/
└── sources.json # Fallback static sources
```
## Comparison
| Feature | freshrss-reader | rss-digest | ai-daily-digest | **YourRSS** |
|---------|----------------|------------|-----------------|-------------|
| FreshRSS API | ✅ | ❌ | ❌ | ✅ |
| AI Scoring | ❌ | ✅ | ✅ | ✅ |
| AI Summaries | ❌ | ✅ | ✅ | ✅ |
| Cortex Memory | ❌ | ❌ | ❌ | ✅ REST API |
| Preference Learning | ❌ | ❌ | ❌ | ✅ Like/Dislike |
| Personalized Recs | ❌ | ❌ | ❌ | ✅ |
| Blinko Save | ❌ | ❌ | ❌ | ✅ |
| Full-text Scoring | ❌ | ❌ | ❌ | ✅ |
| Concurrent Processing | ❌ | ❌ | ❌ | ✅ |
| Flexible AI Provider | ❌ | ❌ | ❌ | ✅ |
| Multi-client | ✅ | OpenClaw | OpenClaw | ✅ Any |
## Requirements
- Node.js 18+
- Self-hosted FreshRSS with API access enabled
- Self-hosted Cortex Memory server
- (Optional) Blinko for knowledge retention
- (Optional) OpenAI-compatible API for external scoring
## License
MIT
## Credits
- Forked from [ai-daily-digest](https://github.com/HarrisHan/ai-daily-digest) by HarrisHan
- Memory powered by [Cortex](https://github.com/rikouu/cortex) by rikouu
- FreshRSS API inspired by [freshrss-reader](https://github.com/openclaw/skills/tree/main/skills/nickian/freshrss-reader)