No description
  • Go 97.6%
  • Dockerfile 2.4%
Find a file
Mike Gerber 5f339e293a
Some checks failed
Build / build (push) Has been cancelled
🎨 Remove extra newline
2026-09-25 16:05:58 +02:00
.github 🚧 GHA: Set permissions for build workflow 2026-09-21 17:41:10 +02:00
.pre-commit-config.yaml 🛠️ Add pre-commit configuration 2026-09-20 17:34:54 +02:00
config.go ⚙️ Default interval → 20 minutes 2026-09-25 16:05:06 +02:00
Dockerfile 🚧 Multi-stage container image build 2026-09-21 17:22:48 +02:00
go.mod 🚧 deps 2026-09-25 16:05:43 +02:00
go.sum 🚧 deps 2026-09-25 16:05:43 +02:00
helpers.go 🎨 Return errors where appropiate (WIP) 2026-09-20 15:34:25 +02:00
LICENSE 📝 Add AGPLv3 license 2026-09-23 16:14:39 +02:00
main.go 🎨 Remove extra newline 2026-09-25 16:05:58 +02:00
README.md 📝 README: Compare to Miniflux' own filtering caps 2026-09-20 04:00:00 +02:00
rules.go 🐛 Make "tagged" case-insensitive 2026-09-25 16:02:22 +02:00
rules_test.go 🐛 Make "tagged" case-insensitive 2026-09-25 16:02:22 +02:00
stringlist.go 📝 Fix a typo in StringList comment 2026-09-24 11:54:34 +02:00

miniflux-sieve

Mark unwanted entries read in your Miniflux RSS reader. The elderly AKA Gen X would call it a killfile, but for Miniflux.

There a few solutions for this, but I wanted more expressive filters, to do something like "mark everything older than 7 days as read, unless the title contains any of 'ernie', 'bert', 'oscar' or 'tiffy'".

How does this compare to Miniflux' own filtering rules?

Miniflux applies filtering at ingestion, while miniflux-sieve can do rolling expiry, e.g. keep articles unread, but mark them read after 14 days. miniflux-sieve also adds flexibility, say to expire unread articles after a time, but keep some in unread state if title matches certain keywords. There is some overlapping functionality.

Progress

Currently working functionality:

  • Filter based on
    • age (e.g. anything older than 7 days)
    • tags (e.g. "Sponsor")
    • title match
    • title non-match, as in "but not if title matches"
    • article URL (e.g. filter "/sport/" articles)
  • and combinations

In progress:

  • Filter based on
    • content (e.g. filter newspaper "plus" articles)
  • Documentation
  • More examples
  • Daemon mode
  • Container image

Example config

# ~/.config/miniflux-sieve/config.yml
MINIFLUX_URL: "https://miniflux.example.com"
MINIFLUX_API_KEY: "My secret token"  # Settings → API Keys → Create a new API key

Example rules

# ~/.config/miniflux-sieve/rules.yml
version: 1
rules:
  - name: Expire old Ars Technica entries
    feed: "http://feeds.arstechnica.com/arstechnica/index"
    when:
      older_than: 14d
  - name: Not interested in Patreon
    feed: "https://example.com/feed"
    when:
      tagged: "patreon"
  - name: Expire old HN entries, with exceptions
    feed: "https://hnrss.org/newest?points=200"
    when:
      older_than: 30d
      not_title_matches:
        - '(?-i)Elmo\b'  # Elmo is case-sensitive, and must end with a word boundary
        - ernie
        - bert
        - oscar
  - name: Not interested in sport news
    feed: "https://www.tagesspiegel.de/contentexport/feed/home"
    when:
      url_matches: "/sport/"