RSS feed generator and aggregator built with FastAPI, SQLModel, SQLite, and Jinja2. It is not a feed reader.
RSSGlue is inspired by RSSHub, Kill-the-newsletter, and Miniflux.
- Schedules and caches updates. Many feed generators (like RSSHub) just reach out to external sources on every fetch. For metered APIs or trigger-happy IP ban systems, this can cause problems. Get your news a little slower, it will be fine.
- Social media aware. Feed posts can set "score" (such as from up-vote & like counts) used to sort and filter downstream (such as in a "top" digest).
- Extensible. New feed sources take advantage of these features.
- Rich media and formatting. Feed generators can decide, for example, to include the top comment from a thread or embed metadata in the post body. Reddit's native feeds (for example) do not bother with rich embeddings and are generally unpleasant to read.
- Cache images and enclosures. Some feeds include images using reference links that expire or break quickly. RSSGlue will optionally cache discovered images.
- Any RSS/Atom Feed
- Instagram Accounts (Example)
- Facebook Groups
- Email Newsletters
- Hackernews (Example)
- Wordpress "MEC" Plugin Calendars
- Wordpress "The Events Calendar" Plugin Calendars
- Squarespace Calendar API
| Variable | Description |
|---|---|
ENABLE_BACKGROUND_WORKER |
0 or 1 |
SECRET_KEY |
For cookie signing, required |
MEDIA_DIR |
Path to media downloads |
DISPLAY_TIMEZONE |
Time zone for rendering times and interpreting cron schedules |
# Install dependencies
uv sync
# Show commands
poe help
# The server runs at http://localhost:8000 (and listens on all interfaces).
poe dev
# To run **only** the background worker with or without the web server:
poe worker
poe devworkerAn email feed turns messages delivered to one address into posts. All email
feeds share a single IMAP mailbox that you supply — RSS Glue never mints
addresses, so you set up plus-addressing (or a catch-all) with your own
provider.
- In Config → IMAP Inbox, set the host, port, username and an app password (not your account password), then save.
- Click Test Connection. It reports the message count and every folder it can see, which is the fastest way to catch a wrong password or folder name.
- Create a feed of type
emailand give it an address such asyou+newsletter@example.com. The form prefills it from the feed id. - Subscribe to the newsletter with that exact address.
| Setting | Notes |
|---|---|
| Folder | Defaults to INBOX. A provider-side filter into a dedicated folder scans much faster. |
| Lookback (days) | Each poll re-scans this window. Mail older than the window never appears, even after a reset. |
| Max message size | Larger messages are skipped rather than downloaded. Defaults to 2 MiB. |
Matching happens client-side against Delivered-To, X-Original-To,
Envelope-To, X-Forwarded-To, To, Cc, Bcc and the for <addr> clause
of Received — Gmail's IMAP SEARCH normalizes plus-tags away, so it can't be
trusted for this. Messages are deduped by Message-ID and fetched with
BODY.PEEK, so nothing is ever marked read.
Attachments and inline cid: images are not rendered. Newsletter styling is
stripped by the shared HTML sanitizer, leaving text, links, tables and images.
Each post gets a permalink at /post/{feed_id}/{external_id}, which — like the
RSS endpoints — is readable without logging in.
