reader 3.24 released – help, multi-user updates
May 2026 ∙ four minute read ∙
Hi there!
I'm happy to announce version 3.24 of reader, a Python feed reader library.
What's new? #
Here are the highlights since reader 3.23.
Context-sensitive help #
In lieu of a tutorial mode, the web app now offers guidance to new users, and has a basic context-sensitive help system. Here's some screenshots:



Structured logging #
reader now uses structured logging internally, through structlog.
By default, output goes to stdlib logging, but you can opt into structlog-native logging:
import reader, structlog
reader.enable_structlog()
structlog.configure(...)
This was relatively challenging to do, since as a library, you cannot configure logging, nor change any global state. I hope I can contribute a variant of the solution upstream, but meanwhile here's a recipe you can use in your library (warning: brittle code).
Make update_feeds() parallel again #
It turns out the "extensive rework of the parser internal API" from 3.15 caused update_feeds() to retrieve feeds in the main thread regardless of the worker count.
Protip
If you have a parallel map() that returns @contextmanagers,
make sure the work you need to do in parallel
doesn't happen in __enter__. 😅
New contributors #
Thank you to the new contributors that submitted pull requests to this release!
Want to contribute? Check out the docs and the roadmap.
Hosted reader status update #
As I said last time, I'm working on a hosted version of reader. Background: Why another feed reader web app?, Why not just self-host it?.
Multi-user feed updates #
One of the bigger changes for hosted reader was handling multi-user feed updates.
For intentional but questionable reasons, users have their own dedicated databases, with the web app routing to the appropriate one based on session information.
However, updating feeds should happen in a single, shared database; this allows:
- retrieving feeds once, not once per user
- per-host rate limiting
- preserving a longer history for public feeds
This is now done, complete with a design document (to be published). As a teaser, here's a neat architecture / data flow diagram:
OK, so what now? #
Since I'm rapidly running out of technical things to do, a launch is imminent.
This is what is finished so far:
- multi-user version of the web app
- authentication via email
- infrastructure deployments using pyinfra
- (new) multi-user feed updates
- (new) tutorial mode – context-sensitive help should do
Remaining work to an MVP:
- public demo
- landing page
- give it a good name
- launch announcement + roadmap
Meanwhile, if this sounds like something you'd like to use, get in touch.
That's it for now. For more details, see the full changelog.
Learned something new today? Share it with others, it really helps!
What is reader? #
reader takes care of the core functionality required by a feed reader, so you can focus on what makes yours different.
reader allows you to:
- retrieve, store, and manage Atom, RSS, and JSON feeds
- mark articles as read or important
- add arbitrary tags/metadata to feeds and articles
- filter feeds and articles
- full-text search articles
- get statistics on feed and user activity
- import / export feeds as OPML
- write plugins to extend its functionality
...all these with:
- a stable, clearly documented API
- excellent test coverage
- fully typed Python
To find out more, check out the GitHub repo and the docs, or give the tutorial a try.
Why use a feed reader library? #
Have you been unhappy with existing feed readers and wanted to make your own, but:
- never knew where to start?
- it seemed like too much work?
- you don't like writing backend code?
Are you already working with feedparser, but:
- want an easier way to store, filter, sort and search feeds and entries?
- want to get back type-annotated objects instead of dicts?
- want to restrict or deny file-system access?
- want to change the way feeds are retrieved by using Requests?
- want to also support JSON Feed?
- want to support custom information sources?
... while still supporting all the feed types feedparser does?
If you answered yes to any of the above, reader can help.
The reader philosophy #
- reader is a library
- reader is for the long term
- reader is extensible
- reader is stable (within reason)
- reader is simple to use; API matters
- reader features work well together
- reader is tested
- reader is documented
- reader has minimal dependencies