RSSgate.

A self-hosted RSS feed manager with an AI-transcribed reader. One local Python web app, one YAML file, any OpenAI-compatible or hosted LLM.

Source on GitHub Quick start HTTP API

What it is

RSSgate runs as a local Python web app (default http://0.0.0.0:8088), fully configured from a single YAML file. It is desktop and mobile responsive and follows your OS dark-mode setting automatically. There are two sides:

Feed types

TypeExamplesBehavior
feedGizmodo, Ars Technica, NPR, your blog Parsed with feedparser. Conditional GET (ETag/Last-Modified) plus guid dedupe. Feed-declared <category> tags are captured and shown as chips.
pagehttps://lite.cnn.com/ No structured feed: article links are extracted from the page with an LLM and treated like feed items. Skipped entirely when the page bytes haven't changed.
autoany URLProbed once; result stored.

Paste a homepage instead of a feed and RSSgate probes it first, verifies every candidate feed by fetching and parsing it as XML, and only then offers it. A bare page is never added silently.

Token efficiency is the design

LLM providers

llm.providerBase URLNotes
localany OpenAI-compatible server vLLM, SGLang, llama.cpp, Ollama, LM Studio. A single-model server is auto-selected.
openaiapi.openai.com/v1needs api_key
openrouteropenrouter.ai/api/v1needs api_key
anthropicMessages APIneeds api_key

llm.api_key accepts env:VARNAME so secrets stay out of the file, and the key is never echoed back to the browser. Digesting is extractive work, so on local reasoning servers RSSgate disables thinking tokens by default — on the author's hardware that took a Gizmodo digest from 51.8 s / 3,127 output tokens to 7.4 s / 405 at equal quality. Per-purpose model overrides let a cheap instruct model do the digesting while a reasoning model handles bare-page discovery.

Also in the box

Install and run

python -m venv .venv && .venv/bin/pip install -r requirements.txt
cp config.example.yaml config.yaml     # optional; run.py generates defaults
.venv/bin/python run.py                # serves on 0.0.0.0:8088

Tests are offline by design:

.venv/bin/python -m pytest             # 84 tests, no network required

Before you put it on the internet

RSSgate has no authentication and binds 0.0.0.0 by default: it is meant for trusted networks. Set server.host: 127.0.0.1 or put it behind a reverse proxy with auth if others can reach the port — the admin panel, and the LLM spend behind it, is open to anyone who can.