No description
  • Go 98.6%
  • Dockerfile 1.4%
Find a file
Mike Gerber 73ad28ca98
Some checks are pending
Build / build (push) Waiting to run
Test tagged, rule with no condition
2026-09-20 20:05:51 +02:00
.github Add a first test 2026-09-20 17:54:44 +02:00
.pre-commit-config.yaml 🛠️ Add pre-commit configuration 2026-09-20 17:34:54 +02:00
config.go 🎨 Return errors where appropriate (WIP) 2026-09-20 16:42:59 +02:00
Dockerfile ⬆️ Container image: Update base image 2026-09-19 16:44:40 +02:00
go.mod 🚧 go.mod: go-yaml + miniflux.app are not indirect imports 2026-09-20 16:59:42 +02:00
go.sum Initial commit 2026-09-18 23:13:57 +02:00
helpers.go 🎨 Return errors where appropiate (WIP) 2026-09-20 15:34:25 +02:00
main.go 🎨 Add package comment 2026-09-20 18:52:38 +02:00
README.md 📝 README: Compare to Miniflux' own filtering caps 2026-09-20 04:00:00 +02:00
rules.go 🧹 Remove unreachable code 2026-09-20 18:52:08 +02:00
rules_test.go Test tagged, rule with no condition 2026-09-20 20:05:51 +02:00
stringlist.go 🧹 Remove unreachable code 2026-09-20 18:52:08 +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/"