Web application

reader comes with a web application based on Flask, Bootstrap, and htmx, intended to work across all browsers, including mobile and light-weight / text-only ones.

Features, as of reader version 3.24:

  • add / list / filter / delete feeds

  • list / filter articles

  • mark articles as read / (un)important

  • article view

  • custom feed titles

  • dark mode

More features already implemented in the library and the legacy web app should be added in the next releases; see the roadmap for details.

Screenshots

_images/entries.png

main page (dark mode)

_images/entries-filters-light.png

main page – more filters (light mode)

_images/feed.png

feed page (dark mode)

_images/feeds.png

feeds page (dark mode)

_images/entry.png

article view (dark mode)

_images/entry-image-light.png

article view (light mode)

_images/import-select.png

import feeds (select)

_images/import-result.png

import feeds (result)

Serving the web app

Note

The web application is optional, use the app extra to install its dependencies.

reader exposes a standard WSGI application as reader._app.wsgi:app. See the Flask documentation for more details on how to deploy it. The path to the reader database can be configured through the config file or the READER_DB environment variable.

Warning

The web application has no authentication / authorization whatsoever; it is expected a server / middleware will provide that.

An example uWSGI configuration file (probably not idiomatic, from here):

[uwsgi]
socket = /apps/reader/uwsgi/sock
manage-script-name = true
mount = /reader=reader._app.wsgi:app
plugin = python3
virtualenv = /apps/reader/
env = READER_CONFIG=/apps/reader/reader.toml

You can also run the web application with the web command. web uses Werkzeug’s development server, so it probably won’t scale well past a single user.

Note

For privacy reasons, you may want to configure your web server to not send a Referer header (by setting Referrer-Policy header to same-origin for all responses; nginx example). The web command does it by default.

If running on a personal computer, you can use cron to run it at boot:

@reboot     sleep 60; reader web -p 8080 2>&1 ) >>"/tmp/$LOGNAME.reader.web.run.boot.log"

Legacy web app

Before the current web application, there was another one, serving as test bed for new features. It is usable, if a bit unpolished, but was never meant to be a long-term thing, hence the new app; you can find screenshots here.

The WSGI entry point is reader._app.legacy.wsgi:app.

The legacy web app should remain available until the new app reaches feature parity.