A personalized dev digest generator powered by RSS feeds and Claude Code. Collects articles from 20+ sources, filters by keyword relevance, then uses Claude Code skills to analyze content and produce a curated Markdown digest tailored to your interests.
sources.json topics.json
│ │
▼ ▼
collector.py ──► SQLite ◄── filter.py
│
▼
Claude Code /digest skill
│
▼
digest/weekly_dev_digest_YYYY-MM-DD.md
- Collect —
collector.pyfetches RSS/Atom feeds defined insources.jsonand stores articles in a local SQLite database. Feeds that fail 3+ times in a row are auto-disabled. - Filter —
filter.pyscores each article against keywords derived fromtopics.jsonand removes low-relevance ones before they reach Claude. - Analyze — The
/digestClaude Code skill reads the surviving articles, fetches full content where needed, evaluates each against your interest profile, and writes a Markdown digest todigest/.
- Python 3.9+
- Claude Code CLI installed and authenticated
git clone <repo-url> && cd ai-learning-explorer
pip3 install -r requirements.txtOpen Claude Code in the project directory and run:
/digest
This collects the last 7 days of articles by default. Pass a number to change the window:
/digest 14
The generated digest is saved to digest/weekly_dev_digest_YYYY-MM-DD.md.
/explore
This searches for new RSS feeds matching your interests, validates them, and lets you pick which ones to add to sources.json.
You can run the Python scripts directly without Claude Code:
python3 collector.py --days 7 # Fetch articles from last 7 days
python3 filter.py # Apply keyword filterThe articles are stored in db/articles.db (SQLite). You can query them directly:
sqlite3 -json db/articles.db "SELECT title, source, url FROM articles WHERE status = 'new';"Each source has a name, RSS feed URL, category, and enabled flag:
{
"name": "Simon Willison's Blog",
"url": "https://simonwillison.net/atom/everything/",
"category": "AI Tooling",
"full_content_rss": true,
"enabled": true
}- Set
"enabled": falseto disable a feed without removing it. - Set
"type": "newsletter"for curated link roundups (e.g., JavaScript Weekly). The digest skill extracts individual items from these rather than treating them as single articles. - Set
"full_content_rss": truefor feeds that include the full article text in their RSS entries. This skips the web fetch step.
Define your roles and topic priorities. Claude uses this to decide which articles make the cut:
{
"profile": {
"roles": ["Frontend Engineer", "Node.js Backend Engineer"],
"topics": {
"high_priority": ["React", "TypeScript", "Node.js internals"],
"medium_priority": ["Web performance", "Developer tooling"],
"low_priority": ["Mobile development"],
"exclude_if": ["Job listings", "Beginner tutorials"]
}
}
}High-priority keywords are weighted 3x during the pre-filter step. Articles need a score of 3+ to pass through to Claude for analysis.
├── collector.py # RSS feed fetcher
├── filter.py # Keyword pre-filter
├── sources.json # Feed definitions
├── topics.json # Interest profile
├── requirements.txt # Python dependencies
├── db/ # SQLite database (gitignored)
├── digest/ # Generated digests
└── .claude/skills/ # Claude Code skill definitions
├── digest/ # /digest — generate a curated digest
└── explore/ # /explore — discover new feed sources