Skip to main content

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.

  1. Download and open LM Studio, load a model (Mistral, Llama, Gemma, etc.)
  2. Start the local server: Local Server tab → Start Server
  3. 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:

# RSS Digest — 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

rss_digest-0.0.4.tar.gz (128.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rss_digest-0.0.4-py3-none-any.whl (11.2 kB view details)

Uploaded Python 3

File details

Details for the file rss_digest-0.0.4.tar.gz.

File metadata

  • Download URL: rss_digest-0.0.4.tar.gz
  • Upload date:
  • Size: 128.9 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

Hashes for rss_digest-0.0.4.tar.gz
Algorithm Hash digest
SHA256 76a59ff08e217ec2e6f89ddbc762076cd1f750bbe7758211a73a4e671f355089
MD5 b5342236041bf2ea363a21ad63ec054f
BLAKE2b-256 7487f3e6b45ab5042b6ecc985e892d33426f8d8f6557055a7d7c6480ab68e025

See more details on using hashes here.

File details

Details for the file rss_digest-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: rss_digest-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 11.2 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

Hashes for rss_digest-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 cb078775b7f27e7f10e8410a5df791872c0a931780f22c4c9cbc4d1b52d6b9f1
MD5 224ac4d06bf5a25944ace97fe9bf2dda
BLAKE2b-256 0db8e09716f2404d3d90682a341d5b5ae7ba6678ff3b73e167a59c619214d52e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page