In a sea of information, staying up-to-date with the latest news, blogs and updates can be an endless task. After some time of surfing the web you gather a list of your preferred sources and you want to know when they publish something new.

I don’t really stay up-to-date much with generic news. From time to time, I might open a local news portal for a few seconds just to be reminded of how much nonsense is being pushed down everyone’s throat and how consumeristic our society has become. But that’s perhaps a topic for another time, or better yet, never.

Anyhow, for tech news, blogs, youtube channels even, update notifications for the software packages I use (Github has RSS feed for releases page BTW) I prefer RSS.

This is the most actionable flow for me. When going through list of titles, I remove/mark-as-read all of those I don’t plan on checking immediatelly. Those that are informative like “Release 1.2.3 of XYZ has been published” immediatelly get converted to a TO-DO in my Org Agenda.

Since most of the time I spend in front of my computer, and most of that time is spent in Emacs, it is natural that I also read all those articles and news inside of the Emacs. And let’s be honest, is there a better interface to work with text based content? Obviously not…

Enter Emacs

There are multiple packages within Emacs that can work well for this use-case, and perhaps the most popular one is Gnus, and you may be surprised, but I’m not using that one.

First one I tried and that stuck with me was Elfeed. “Why?” you might ask. Interface is simple, setup is simple, and it is extensible. And there’s something intangeable about it that I like.

I did try out Gnus, but I found it confusing and couldn’t really reproduce the same functionality I have in Elfeed. Main feature I was lacking there was sync with an external source using Fever or Google Reader API which is provided in Elfeed using elfeed-protocol. If you have some recommendations about Gnus and syncing across devices (including iPhone), drop me a line. I’d really like to try it out again.

My full Elfeed configuratiod, pieced together from various sources over the time, can be seen below:

(use-package elfeed

  :defer t
  :commands elfeed
  :hook ((elfeed-show-mode . tomica/readability))
  :config
  (setq elfeed-search-filter "+unread"
        elfeed-sort-order 'ascending
        elfeed-search-print-entry-function 'tomica/elfeed-search-print-entry
        elfeed-search-date-format '("%Y-%m-%d" 10 :right)
        elfeed-search-title-max-width 110
        elfeed-search-trailing-width 30
        )

  (defun elfeed-eww-open (&optional use-generic-p)
    "Open with eww"
    (interactive "P")
    (let ((entries (elfeed-search-selected)))
      (cl-loop for entry in entries
               do (elfeed-untag entry 'unread)
               when (elfeed-entry-link entry)
               do (eww-browse-url it))
      (mapc #'elfeed-search-update-entry entries)
      (unless (use-region-p) (forward-line))))

  (defun elfeed-firefox-open (&optional use-generic-p)
    "Open with Firefox"
    (interactive "P")
    (let ((entries (elfeed-search-selected)))
      (cl-loop for entry in entries
               do (elfeed-untag entry 'unread)
               when (elfeed-entry-link entry)
               do (browse-url-firefox it))
      (mapc #'elfeed-search-update-entry entries)
      (unless (use-region-p) (forward-line))))

  :bind (("C-c f" . elfeed)
         :map elfeed-search-mode-map
         ("H" . tomica/elfeed-refresh)
         ("G" . tomica/elfeed-fetch)
         ("w" . elfeed-eww-open)
         ("f" . elfeed-firefox-open)
         :map elfeed-show-mode-map
         ("v" . tomica/elfeed-open-link)
         ("R" . tomica/readability)))

And elfeed-protocol configuration is as follows:

(use-package elfeed-protocol
  :defer t
  :commands (elfeed-protocol-fever-reinit)
  :after elfeed
  :config
  (setq elfeed-use-curl t
        elfeed-curl-extra-arguments '("--disable")
        elfeed-feeds '(("fever+https://USERNAME@MINIFLUXINSTANCEURL"
                        :api-url "https://MINIFLUXINSTANCEURL/fever/"
                        :use-authinfo t)))
  (elfeed-set-timeout 36000)
  (elfeed-protocol-enable))

Credentials for logging in using Fever protocol are configured in my .authfile.gpg.

There are also a few functions that make fetching articles, syncing and reading more pleasant. For example my readability function uses olivetti-mode to center the text and changes the text size. It is automatically triggered once I open the article.

(defun tomica/readability ()
  (interactive)
  (olivetti-mode 1)
  (olivetti-set-width 80)
  (text-scale-set 1.5)
  (cond (
         (eq major-mode 'eww-mode) (eww-readable)
         )
        )
  )

I am planning to rework this simple hacked-together function with “the real readability-mode” at some point in future but there are only 24 hours in a day and too many things that shift my attention :-)

Syncing things

As noted earlier, in order to sync feeds, status of the read articles etc. I’m using amazing piece of software called Miniflux. I cannot give it enough praise. It is simple, yet very powerful utility written in Golang. Very simple interface, yet it supports many APIs which can be enabled in the settings. Very low memory requirements, yet very performant. All around amazing basically :-)

So all of my computers do run Emacs in one shape or the other, so they all interface with this Miniflux instance. When there was a machine not running Emacs, I simply used web interface which is quite usable.

As any (in)sane person, I also have a mobile phone, and my poisonphone of choice is iPhone. Best app I’ve found for iPhone to support syncing yet have amazing reading experience was Reeder. It is a paid app, but it is worth every penny. And even if you don’t use Miniflux, Emacs, etc. and are within the Apple ecosystem, there’s a desktop app you can use on your Mac(Book) and even sync feeds via iCloud and some other services.