My reading stack with Miniflux/RSS & Pocket

Published on

7 min read
Table of contents

I want to outline the tools I use to consume textual content, and why it perfectly fits my needs.

Who knows, maybe this can be helpful for you too.

RSS everywhere

(This should have been a pun on “HTTPS everywhere”…)

Been an avid RSS consumer for the past years.

But I’ve always encountered the following issues:

  • lost RSS feeds while distro-hopping (either forgot or lost backups of the config files)
  • didn’t like the RSS reader’s UI
  • needed to install an extra native application for reading my news (both on my PC and phone)

(Yes, I know you could use Feedly, Reedr and others, but it didn’t suit my needs)

Embrace the Web

I am a web-guy (whatever that means).

I almost exclusively use the Web, be it for apps one would have a native app for or browsing in general.

Lately I’ve found my perfect stack for keeping up to date with the latest news:

RSS for

  • blogs (obviously)
  • HackerNews frontpage (yes, there is an RSS for it)
  • Twitter (although I added only a few feeds, via Nitter RSS)

HackerNews frontpage

I found myself checking the HN frontpage way too often, only to make a visual diff in my brain to skim through the articles I already read.

This changed finally once I discovered HN-RSS:

E.g. I get all posts that make it to the HackerNews frontpage via this RSS feed

https://hnrss.org/frontpage

Tweets

And the tweets from a handful of Twitter users through Nitter’s RSS feeds:

https://nitter.eu/<TWITTER_HANDLE>/rss

You can host your own instance if you prefer, or choose one from any other public one’s

Miniflux to the rescue

Miniflux is a minimalist and opinionated feed reader.

The awesome part of miniflux is that I can

  • self-host it (a baby could run it via docker and set up a reverse-proxy with nginx)
  • Integrate Pocket (getpocket.com) for bookmarking articles or reading them later on
  • Read the whole article without leaving Miniflux

(The last point is because Miniflux will fetch the original article automatically if the RSS entry only contains a summary)

You want other reasons?

Privacy, simplicity, clean and no-frills UI, FOSS

This is how the UI looks like:

miniflux example

By clicking on the article I can read it in full.

I use the Save button to offload the articles to Pocket, and read them later.

Bookmarklet

Through a simple bookmark in my browser (both on PC and phone), I can simply subscribe to any website or blog that has an RSS feed.

This makes it super easy to subscribe to someone’s RSS feed.

You stumble upon an article, click on the bookmarklet, and Miniflux will find the RSS feed(s) for that website automatically.

No searching for the RSS icon no more.

miniflux bookmarklet

Pocket (#longreads)

I set up the Pocket integration mainly for reading longer articles, in a deferred fashion.

Pocket’s UI and reading experience suits me very well.

This part is totally optional, as you could get away with it by just using Miniflux.

You could also customize the CSS to make the font-rendering more pleasant and use custom fonts for example.

You want to try it too?

Below is the docker-compose.yml I am using.

(just generate a secure password for postgres, define an admin user, and optionally set the POCKET_CONSUMER_KEY variable)

version: '3.3'
services:
miniflux:
image: miniflux/miniflux:latest
container_name: miniflux
restart: always
ports:
- "127.0.0.1:3000:8080"
depends_on:
- db
environment:
- DATABASE_URL=postgres://miniflux:[email protected]/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=YOUR_ADMIN_USERNAME
- ADMIN_PASSWORD=YOUR_ADMIN_PASSWORD
- POLLING_FREQUENCY=30
- "POCKET_CONSUMER_KEY=YOUR_POCKET_CONSUMER_KEY"
- "BASE_URL=https://your-instance.example.com"
- "HTTPS=on"
- "DEBUG=on"
db:
image: postgres:latest
restart: always
container_name: postgres
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=YOUR_POSTGRES_PASSWORD
volumes:
- miniflux-db:/var/lib/postgresql/data
volumes:
miniflux-db:

My miniflux nginx configuration file (/etc/nginx/sites-available/miniflux):

(just change the server_name)

upstream miniflux {
    server 127.0.0.1:3000 max_fails=5 fail_timeout=60s;
}

server {
    server_name    your-instance.example.com;

    listen         80;
    listen         [::]:80;

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/activity+json application/atom+xml;

    client_max_body_size 16m;
    ignore_invalid_headers off;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
        proxy_pass http://miniflux;
    }
}

Boom. There you go.

Hope this was helpful, and let me know your thoughts in the comments!

PS: while writing this article I felt the need for donating to the creator of Miniflux, so I did :)