I've been using elfeed as my primary RSS reader for a couple of years, but there were a few things I missed about my previous web-based reader. One annoyance was that items I read on my laptop weren't synced with whatever I read on my desktop. I also missed having an online view for when I was out of the office.

Fixing the second problem was easy: Tiny Tiny RSS is a web-based RSS reader that is free and open-source. I really like the interface, but I still wanted to read things in elfeed if possible. Thankfully there's a package called elfeed-protocols that allows elfeed to sync with tt-rss.


Getting everything setup is fairly straightforward:

(use-package elfeed
  :defer t
  (elfeed-use-curl t)
  (elfeed-feeds    '(("ttrss+https://user@my.ttrss.com"
		      :password "<password goes here>"))))

The elfeed-protocol-enable part turns on additional protocol support, and elfeed-feeds tells elfeed which tt-rss server to use.

Tidying up the view

The default view takes up the full width of the window, which I find hard to read on a large monitor. I use the following addition to narrow things down:

(use-package elfeed
  ;; <- Regular config goes here.
  (add-hook 'elfeed-show-mode-hook #'sodaware/enhance-elfeed-readability))

(defun sodaware/enhance-elfeed-readability ()
  "Clean up elfeed show buffer."
  (setq shr-width 80)
  (buffer-face-set 'fixed-pitch))

elfeed uses Simple HTML Renderer (shr) to display articles, so this function limits the width and sets the font to a fixed-width one.

Marking items as read

Here’s a simple function that marks all RSS items as read before fetching new posts:

(defun sodaware/elfeed-all-read-refresh ()
  (when (y-or-n-p "Really mark all items as read?")
    (elfeed-search-fetch nil)))