1
0
Fork 0
mirror of https://codeberg.org/Reuh/feather.git synced 2025-10-27 10:09:32 +00:00
File-based RSS reader client for TT-RSS/FreshRSS/Miniflux/...
Find a file
2025-10-13 18:28:07 +02:00
src/feather fix: track directory changes in file watcher 2025-10-13 18:28:07 +02:00
.dockerignore refactor: everything into several files and a valid python package 2025-10-10 23:58:28 +02:00
.gitignore refactor: everything into several files and a valid python package 2025-10-10 23:58:28 +02:00
.python-version Initial commit 2025-10-09 13:50:18 +02:00
Dockerfile feat: reduce container size 2025-10-13 17:08:32 +02:00
LICENSE docs: add LICENSE 2025-10-09 16:55:35 +02:00
pyproject.toml feat: add watchfiles to daemon to trigger updates faster when reader directory is changed 2025-10-13 16:52:04 +02:00
README.md docs: offline mode 2025-10-13 14:36:13 +02:00
uv.lock feat: add watchfiles to daemon to trigger updates faster when reader directory is changed 2025-10-13 16:52:04 +02:00

Feather: file-based RSS reader client

Feather is a RSS reader client. It can:

  • connect to any server supporting the Tiny Tiny RSS API or the Google Reader API (FreshRSS, Miniflux, etc.) :D
  • read your feeds in a native interface, regardless of desktop environment, CLI or GUI :D
  • read your feeds fully offline :D
  • integrate with many other programs effortlessly :D
  • run on pretty much anything :D

That's right, using an innovative technology known as "plain files", Feather allows you to read your feeds in any file manager that exist or will exist in the future. See usage to admire it working.

Note however that Feather is meant to be used alongside a RSS reader server, meaning:

  • no grabbing feeds on its own, requiring a server to connect to :(
  • no feed management interface; Feather only support reading articles and marking them as read/unread :(

Usage

All demonstrations are done under Linux with GNOME Files, but a file manager is a file manager, use what you fancy.

Navigating feeds a.k.a. "using a file manager"

Navigating articles

Feed categories are directories, and each file in these directories is an article.

TODO

Sorting articles

TODO

search + sort

Searching

TODO

Tip: if you have nested categories, search "html" to list all the articles in the category and its sub-categories in the same view.

Reading an article

TODO

Marking articles as read

TODO

Deleting an article will toggle their read status (will take effect on the next synchronization to the server).

Handling read articles

Surprisingly, the read articles can be found in the trash. If you restore them before the next synchronization, it's be as if nothing happened.

TODO

Or, if you'd rather show read articles in the Feather reader directory directly, you could add to your configuration file:

# Grab both read and unread articles into the local directory
server.only_sync_unread_articles = false
# Add a checkmark in the article filename indicating the read status
html.filename_template = "{% if unread %}☐{% else %}☑{% endif %} [{{ feed_title }}]\t{{ title }} ({{ published }}).html"

Note that if you delete a read article from the reader directory, it will be marked as unread and the file will be recreated during the next synchronization.

mark_read_articles_unread

Updating with the server

Run feather sync to synchronize all local data with the server. The synchronization is done in two parts:

  • feather sync-up which upload local changes to the server (e.g. update read status of local articles);
  • feather sync-down which download all articles from the server into the local state. This might be a lot of data depending on how many articles you have on the server.

If you don't want to bother running feather sync manually, you can also start the Feather update daemon using feather daemon. The daemon will periodically call sync-up (by default every minute) and sync-down (by default every 15 minutes) for as long as it runs.

If you are offline

Nothing change, but all the synchronization commands will wait until the server become reachable again.

Configuration

Feather will try to load the configuration from the file config.toml by default. A lot of things can be configured, see the default configuration file for details. Most configuration options can also be set using environment variables - this is also detailed in the default configuration file (here's another link if your mouse is too far from the previous one).

If you already have local data but have changed configuration that affect how files are generated (like the HTML or filename templates), you can call feather regenerate to regenerate all local files with the new configuration.

If you changed to another remote server or if you somehow messed up your local files, you can also call feather clear-data to nuke all local data, likely followed by a full synchronization using feather sync.

Layer other things on top

Since, as the kids say, everything is a file, Feather can be easily integrated with any other program which operate on files (and there's a lot of those). A couple examples:

  • you can use Syncthing to synchronize the reader directory with other computer without having to install Feather on each one. You'd still have to install Syncthing on each one, but if for some unknown reason you prefer installing Syncthing to Feather, it works. Note that Syncthing real-time change detection can sometime miss changes when there's a lot of small files like with Feather, so you may want to reduce the Full Rescan Interval in the share settings unless you're fine with some of your feeds taking a whole hour to update;
  • you can process your feeds easily with regular scripts: find reader/ -iname 'trump' -delete will mark all feeds containing "Trump" in their filename as read; which I think is way easier than messing around with your feed reader API or convoluted filtering rules directly, but that's just my opinion.

Installation

Docker

TODO

docker run -d -v ./config.toml:/feather/config.toml -v feather-data:/feather/data -v ./reader:/feather/reader --name feather feather daemon

docker exec feather feather sync

If you're wondering how monstrous the resources required by Feather are, with my ~600 feeds on my Tiny Tiny RSS feather, it stays below ~50MB RAM usage and take ~4KB of disk space per article. The docker image is <200MB, which does not fit on a floppy disk but does easily on a CD.

Raw

Feather should be able to run on anything that can run Python 3.12 or newer (you might need to change html.max_filename_length and html.filename_replacement in the configuration if your filesystem has exotic limitations).

Once you have Python installed, download this repository and pip it up by running pip install inside it. You should be able to run feather sync or whatever command you want to run according to the (usage)[#usage] chapter. Although I personally use uv, so I'd just run uv sync and then uv run feather sync to run feather.

Configuration

In order for Feather to be able to do something useful, it needs to be able to connect to your RSS reader server. Here's some basic config.toml configuration files depending on what API you use:

Tiny Tiny RSS

[server]
api = "ttrss"
url = "https://ttrss.example.com"
user = "rsslad"
password = "hunter2"

[datetime]
timezone = "Europe/Bucharest"

Google Reader API (FreshRSS, Miniflux, and others)

[server]
api = "googlereader"
url = "https://freshrss.example.com/api/greader.php"
user = "rsslad"
password = "hunter2"

[datetime]
timezone = "Europe/Bucharest"

There's more you can change in the configuration file, see the default configuration file and the (configuration chapter)[#configuration] for details.

FAQ

TODO

Why

Name

What should I eat tonight

TODO

before publishing:

  • Write documentation
  • Share the fun somewhere
  • Test with FreshRSS
    • Feed & category order for googlereader ??

"i'll look into it later":

  • Get article attachments
  • Use inotify for real-time article mark-as-read action
  • Partial sync (using since_id for ttrss and start_time for googlereader)