>_ dev.tapun.site

feedmill

Python · latest v0.9.3 · updated

RSS/Atom to Discord and Telegram bridge with per-channel filters.

feedmill polls a list of RSS/Atom feeds, remembers what it has already seen in a small SQLite database and posts new entries to Discord webhooks or Telegram channels. Each target can have its own include/exclude filters, so one feed can fan out to several places.

Why

Most hosted feed-to-chat services either poll too rarely or want an account for every channel. This is a single process with a single config file, and it is happy on the smallest VPS you can buy.

Install

python3 -m venv /opt/feedmill
/opt/feedmill/bin/pip install feedmill-0.9.3-py3-none-any.whl
/opt/feedmill/bin/feedmill check -c /etc/feedmill.yaml

Config

interval: 10m
database: /var/lib/feedmill/state.db
user_agent: "feedmill/0.9 (+https://dev.tapun.site/projects/feedmill/)"

feeds:
  - url: https://blog.rust-lang.org/feed.xml
    targets: [discord:releases]
    include: ["Announcing Rust"]
  - url: https://lwn.net/headlines/rss
    targets: [telegram:news]
    exclude: ["[$]"]

targets:
  discord:releases:
    webhook: ${DISCORD_WEBHOOK}
  telegram:news:
    token: ${TG_TOKEN}
    chat: "@example_channel"

Commands

feedmill runpoll forever, honouring interval
feedmill checkvalidate the config and fetch every feed once, without posting
feedmill replay --since 24hre-post entries from the last day to a test target
feedmill vacuumdrop state for feeds that are no longer configured

Notes

Changes