↓ Skip to Content Start of content

Managing RSS subscriptions with elfeed and Tiny Tiny RSS

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)))

Groundhog Day Resolutions - July 2021

The intro to these posts always seems to be the same: things were busy and I didn't get as much done as I wanted. May June was no different.

June's primary goals

1. Complete one secondary goal

I completed this goal by accident. At the start of every month I import my finances into ledger using reckon, but the process was a little unwieldy. Each account uses different CSV formats, so I'd have to remember the correct commands to use when importing (which I'd usually forget by the first of the month).

So I wrote a little wrapper script that uses the CSV file to decide on what import command to run, as well as which output file to append it to. It's not exactly a revolutionary tool, but it removes some of the friction from the process.

2. Complete one session of deliberate practice

I wrote some new game libraries using a purely TDD approach. I've written plenty of tests for other projects, but I've never done it from a strict TDD way before. It went well and gave me plenty of ideas for improving my daily development processes.

3. Plan my three bodyweight skill goals

I took some time off exercising after my marathon, but I'm back on my routine of running and bodyweight workouts. My strength is slowly coming back and I've started working on basic progressions.

June's secondary goals

1. Write more

Writing did not go well.

Primary goals for July

1. Complete another secondary goal

There are a few little projects I'm working on that I'd like to wrap up. For July I'd like to complete one of them.

2. Complete another session of deliberate practice

Last month's session went really well and I'd like to try another one in July.

3. Write more

Let's try this again, but as a primary goal. I'd like to publish at least 4 posts before my next GHD summary.

Secondary goals for July

1. Release a playable demo of my Atari ST text adventure

Development on this has stalled the last few months, but the pieces are all there. I'd like to have something playable by August.

2. Release an update to one of my other side projects

There are a couple of BlitzMax tools I've been working on that I'd like to update this year. I'd like to publish a small update to one in the next month.

June was another busy month, with the added complication that I spent a week of it feeling pretty ill.

My biggest disappointment was how little writing I did. I've found that my writing relies a lot on momentum; it takes me a while to get going, but once I'm in the groove I can write a lot more. Lately I haven't really had the inspiration to write, but I noticed that ideas started to flow once I started working on non-work projects.

Groundhog Day Resolutions - June 2021

The intro to these posts always seems to be the same: things were busy and I didn't get as much done as I wanted. May was no different.

May's primary goals

1. Run a marathon

This was one of my largest goals for the year and I'm really pleased with how it went. It was a lot more enjoyable than my first marathon; there were people clapping and cheering for parts of the course which really helped.

And as an added bonus I took an hour off my previous time.

May's secondary goals

1. Write more

I wrote a whole two posts in May. Not good.

2. Finish my Atari ST text adventure

Another failure here. I added a couple of extras to the engine, but it's nowhere playable.

Primary goals for June

1. Complete one secondary goal

I have a nasty habit of leaving my secondary goals until autumn, so I want to try and get more done before then.

2. Complete one session of deliberate practice

I've been neglecting this goal for the last couple of months. Having an outlet to try small projects is something that I find helpful and I've missed having it.

3. Plan my three bodyweight skill goals

Now that I'm not running a bunch of miles every week I want to concentrate on my bodyweight skills. My back really ached towards the end of my marathon, so I'd like to work on strengthening that before I start training again.

Secondary goals for June

1. Write more

I'd like to publish at least 6 posts before my next GHD summary.

I did a lot of work during May but didn't complete many personal goals. Marathon training has taken up a lot of my focus so far, so now that I've completed that goal I'm hoping to spread some energy to other areas.

MicroEMACS for the Atari ST

One of my goals this year is to create some software for the Atari ST. For my first project I wanted to use an environment that was close to the one I used growing up, but with improvements where possible.

The first thing I wanted to improve was text editing. The original BASIC editor I used lacks a lot of features I'm used to: it can only edit one file at a time, doesn't have copy/paste support, and navigating with a keyboard is quite limited.

A full-blown Emacs installation is a little large for the humble ST, but there is an alternative: MicroEMACS.

Editing this post with MicroEMACS

It doesn't have the full range of Emacs features, but it does have some handy functionality:

  • Supports multiple buffers.
  • Can mark regions and cut/yank them.
  • Has tab completion for commands and filenames.
  • Has much better keyboard support for moving around a buffer.
  • Can use C-s to search and .
  • Can record keyboard macros.

It doesn't do everything that modern Emacs does, but it's certainly an improvement on the editor I originally used.

MicroEMACS for the ST can be found on atariuptodate.de.

Distraction free writing with Emacs

I use Emacs for all of my writing (including this blog). For a long time I used the default environment, but I really missed the more focused approach of applications like WriteRoom. So a few years ago I made an effort to streamline my Emacs writing environment.

With a few additional modes - and a small amount of elisp - I was able to get Emacs looking like this:

Writing this post with Emacs

(The theme is doom-nord and font is Ubuntu.)

It's a fairly simple setup with only a few different parts.

Removing distracting UI elements

I don't think a toolbar or menu is particularly distracting, but it's visual clutter that I don't use. This code comes from my minimal Emacs configuration and hides these elements:

;; Hide the menu bar, tool bar, and scroll bars.
(when (fboundp 'menu-bar-mode)   (menu-bar-mode   -1))
(when (fboundp 'tool-bar-mode)   (tool-bar-mode   -1))
(when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))

Centering and enlarging the text

The majority of my writing is done inside org-mode, but I also use org-mode to manage projects so I don't want every buffer to use these settings. For writing projects I use a .dir-locals.el file to automatically enable specific modes and to increase the font size.

((org-mode . ((eval . (progn (turn-off-auto-fill)
			     (text-scale-set 1)))
	      (fill-column              . 80)
	      (visual-fill-column-width . 80)
	      (olivetti-body-width      . 80)
	      (mode . olivetti)
	      (mode . visual-line)
	      (mode . visual-fill-column))))

The code in the eval block turns off hard-wrapping, increases the font size, and enables olivetti-mode.

I use olivetti to narrow the writing area to 80 characters which I find easier to work with. darkroom is a good alternative to olivetti; it provides similar functionality, but also more options and can even set an entirely different font face when enabled.

2021-08-11 edit - Updated .dir-locals.el with new activation as olivetti has removed the turn-on-olivetti-mode function.

If you found this helpful and would like to read more content like it, follow me on Twitter.