Generate an RSS digest from any GReader-compatible feed reader using an LLM
Project description
══════════════════════════
R S S D I G E S T
══════════════════════════
Generates a daily digest from your self-hosted RSS reader using an AI language model. Instead of scrolling through hundreds of unread articles, you get a single readable summary grouped by theme — delivered as a Markdown or HTML file.
What you need
- A self-hosted RSS reader that supports the GReader API (FreshRSS, Miniflux, etc.)
- An API key for an AI service (Anthropic, OpenAI, or a local model — see Choosing a model)
- uv or pipx for installation
Installation
# with uv
uv tool install rss-digest
# with pipx
pipx install rss-digest
Quick start
# Set your credentials
export GREADER_URL=https://freshrss.example.com
export GREADER_USERNAME=yourname
export GREADER_PASSWORD=yourpassword
export ANTHROPIC_API_KEY=sk-ant-...
# Generate a digest of the last 24 hours
rss-digest
The digest is written to ~/Desktop/digest-YYYY-MM-DD.md. Pass --html to get an HTML file instead.
Configuration
All options can be set on the command line. Credentials fall back to environment variables (or a .env file in the project root) if not provided.
| Option | Env var | Default |
|---|---|---|
--url URL |
GREADER_URL |
(required) |
--username USER |
GREADER_USERNAME |
(required) |
--password PASS |
GREADER_PASSWORD |
(required) |
--api-path PATH |
GREADER_API_PATH |
/api/greader.php |
--hours N |
24 |
|
--model MODEL |
anthropic/claude-sonnet-4-6 |
|
--html |
off | |
--system-prompt-file FILE |
built-in prompt | |
--mark-read |
off | |
--output PATH |
./digest-YYYY-MM-DD.md |
|
--quiet |
off | |
--log-file FILE |
off |
# Last 48 hours, HTML output
rss-digest --hours 48 --html
# Use a different model
rss-digest --model openai/gpt-4o
# Pass credentials on the command line (not recommended for shared machines)
rss-digest --url https://freshrss.example.com --username alice --password s3cr3t
Choosing a model
rss-digest uses LiteLLM, so any model it supports works. Set the --model flag to a LiteLLM model string and export the corresponding API key.
Anthropic (default)
export ANTHROPIC_API_KEY=sk-ant-...
rss-digest --model anthropic/claude-sonnet-4-6
OpenAI
export OPENAI_API_KEY=sk-...
rss-digest --model openai/gpt-4o
Local model via LM Studio
LM Studio lets you run models on your own machine with no API key or usage costs.
- Download and open LM Studio, load a model (Mistral, Llama, Gemma, etc.)
- Start the local server: Local Server tab → Start Server
- Copy the model identifier shown in the UI (e.g.
mistral-7b-instruct-v0.3)
export OPENAI_BASE_URL=http://localhost:1234/v1
export OPENAI_API_KEY=lm-studio
rss-digest --model openai/mistral-7b-instruct-v0.3
The OPENAI_API_KEY value is ignored by LM Studio but required by the LiteLLM library — set it to anything. The model name after openai/ must match the identifier shown in LM Studio's server tab.
For digest-length tasks, a 7B–14B instruction-tuned model works well. Larger context windows (32k+) are helpful if you have many unread articles.
Customizing the prompt
The built-in prompt decides how articles are grouped and how much to include. For ≤25 articles it lists everything; for larger batches it writes a curated prose summary.
You are producing a digest of RSS articles.
Format rules:
- ≤25 articles: Reading queue. Group by theme under ### headings. List every
article as a bullet with a markdown link. Include the feed name.
- >25 articles: Curated TL;DR. Themed prose under ### headings. Cover roughly
⅓ of articles. Drop filler (sponsored posts, job listings, police blotters,
sub-100-word link-outs). Dense single-feed clusters (6+ posts): pick 2–3
representatives, then "and N more from [feed name]".
Every article title you mention must be an inline markdown link. Be concise.
To use your own prompt, write it to a text file and pass it with --system-prompt-file:
rss-digest --system-prompt-file my-prompt.txt
Example prompt that keeps things very short:
You are summarizing RSS articles for a busy reader.
Write a single short paragraph (5–8 sentences) covering the most important stories.
Do not use bullet points or headings. Every article title must be a markdown link.
The user message sent to the model is always a structured list of articles grouped by feed, so your prompt only needs to describe the desired output format.
Please send prompts you like as PRs and I will add them to a prompt example directory!
Example output
See example.md for a real digest. A short excerpt:
══════════════════════════
R S S D I G E S T
══════════════════════════
2026-06-10
47 articles · 12 sites
### Space & Science
NASA announced the four-person Artemis III crew, though experts question whether a
2028 moon landing is truly achievable given dependence on Musk and Bezos. SpaceX's
coming IPO will mint 4,400 employee millionaires. On the science side: new research
shows quantum physics can generate truly random numbers for encryption, and a study
finds Indonesia's landslides wiped out more than 5% of an endangered orangutan population.
### Culture & Ideas
3QD's essay on Ray Johnson and John Cage explores the MoMA collage room. Dina Nayeri
writes in The Guardian about Iran's stolen revolution and the fractured diaspora.
Iron & Wine's Sam Beam speaks to The Creative Independent about fear, privacy, and
always developing as an artist. And 404 Media reports that scientists accidentally
discovered people in crowds spontaneously walk counterclockwise — everywhere in the world.
Running on a schedule
To get a fresh digest every morning, add a crontab entry. Because cron runs with a minimal environment, use the full path to the binary and set credentials directly in the crontab.
# find the full path first
which rss-digest
Then open your crontab with crontab -e and add:
GREADER_URL=https://freshrss.example.com
GREADER_USERNAME=yourname
GREADER_PASSWORD=yourpassword
ANTHROPIC_API_KEY=sk-ant-...
# Run at 6am every day, write an HTML digest to a specific folder
0 6 * * * /Users/yourname/.local/bin/rss-digest --html --quiet --log-file /tmp/rss-digest.log --output /Users/yourname/Documents/digest.html
Crontab env-var lines apply to all jobs below them in the file, so you only need to set them once.
Compatible readers
Any RSS reader that implements the GReader API should work:
| Reader | Notes |
|---|---|
| FreshRSS | Enable the GReader API in Settings → Authentication |
| Miniflux | Enable Google Reader API in Settings |
| Tiny Tiny RSS | Requires the News+/GReader plugin |
| The Old Reader | Hosted service with GReader-compatible API |
The default --api-path (/api/greader.php) is correct for FreshRSS. Other readers may use a different path — check their documentation.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rss_digest-0.0.3.tar.gz.
File metadata
- Download URL: rss_digest-0.0.3.tar.gz
- Upload date:
- Size: 127.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87d00b3b262980ded8b97afbcb58a8b6da1b870b79b89dbf5a79d45d0bffb382
|
|
| MD5 |
af84d19d23701931c9f40f1b48dbc9e6
|
|
| BLAKE2b-256 |
c5ca02e5288279650baa276c6160dcb4852d58b176d1e45704abf2bf20f41e12
|
File details
Details for the file rss_digest-0.0.3-py3-none-any.whl.
File metadata
- Download URL: rss_digest-0.0.3-py3-none-any.whl
- Upload date:
- Size: 11.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8d19649641c5418c0819a49a4bcf30352846e34be152d2b4141892d4a02176a9
|
|
| MD5 |
d10562e050c79dcada7651ba65c8fcbc
|
|
| BLAKE2b-256 |
10a8036fe8f8ff0077a162541468e2416ea3546a66997fbe4e13e9ea78a437b8
|