Skip to main content

RSS Part 10: Tiny Tiny RSS

I often see recommendations for Tiny Tiny RSS, a web-based RSS client that can be self-hosted. I have avoided it due to my No-PHP/Ruby rule. I am interested in trying it out, however, to see how well it meets my client requirements.

Impressions

It is very easy to install Tiny Tiny RSS thanks to Docker. I followed the static installation guide. With the following configuration change, the installation worked without any problems. Note that there was no need to even read any PHP.

$ diff .env-dist .env
13c13
< TTRSS_SELF_URL_PATH=http://localhost:8280/tt-rss
---
> TTRSS_SELF_URL_PATH=http://127.0.0.1:8280/tt-rss

After logging in as the default admin user, I tried to change the password. This attempt resulted in an error message, and I was then automatically logged out, but I was then able to login using the new password, so it apparently worked. I created a non-admin user, and the system assigns a default random password. (Be sure to copy it quickly, because it is not displayed for very long.) I logged in as that user and found a different place in the preferences to change the password. Changing the non-admin user password had no issues, and perhaps changing the admin password would have worked better using this way to change the password.

When first running the program, the admin user loads the Tiny Tiny RSS forum feed. This is probably a good way to keep up with release information, but I hope that people do not use the admin user all the time. Removing a feed is easy: select the feed and then select Unsubscribe in the hamburger menu.

Speaking of the hamburger menu, it is in an unfortunately location: at the top right of the screen. This places the menu right below the Firefox hamburger menu, and I have mistakenly opened the wrong one multiple times.

I was able to import my OPML file. A “busy” icon was displayed during the import, and then a log was displayed after the import completed. The hierarchy of folders loaded fine, and the nodes of the tree are automatically sorted. Feeds are displayed, so I tried to move them out the feed folders that I created in Thunderbird to work around poor design in that program. This is where I ran into my first issue. Sometimes, attempting to drag-and-drop a feed to a different folder (called a “category” in Tiny Tiny RSS) results in the following error:

Error: assertion failed in ItemFileWriteStore

Attempts to remove empty folders after successfully moving feeds by selecting them and using Categories | Remove selected also frequently failed with the same error. I eventually found that right-clicking an empty folder and selecting Remove category works all the time. By moving a feed and then immediately removing the empty folder, one at a time, I no longer had errors.

When moving a feed, it appears to move correctly but then suddenly appears in the Uncategorized category. This is annoying, but it seems to stay once the feed is moved back to the appropriate folder. I noticed something that is likely a clue to the cause of this bug. When I move a feed out of a folder, the plus icon disappears, indicating that the folder is empty, but the folder description still says “(1 feed)”. I suspect that the code is not updating all references when a feed is moved, leading to inconsistent state, which is probably the cause of the above error as well as the sudden move to the Uncategorized category. The behavior is not consistent; occasionally a feed will move in one step.

EDIT: A friend who uses Tiny Tiny RSS let me know that he moves feeds in the feed preferences. I tried this method out, and it moves the feed successfully as well as removes the newly empty folder, perhaps because that folder is in the same parent folder as the feed and has the same name in my case.

The text “Feeds with errors” appeared, in red! Clicking on it opens a (modal) window that displays a list of feeds with error messages. The error messages are very helpful! Other RSS clients that I have tried display an icon to indicate that a feed is broken but do not make such useful error messages (easily) available.

Feed titles default to the those specified in the feeds, but users can set a better name when desired. Great!

It looks like there is no way to manually check feeds in Tiny Tiny RSS, since it is always running and always periodically checking feeds. I prefer checking feeds when I process feeds (generally twice per day), and my feeds are configured to update every 8 hours when I leave my RSS client open while away for a weekend. I noticed that Tiny Tiny RSS defaults to checking feeds every 30 minutes! I do not like this because it puts an unnecessary load on people’s websites just to ensure that feeds are relatively up-to-date whenever people check them.

I generally use RSS clients in which items are listed separately from item content. GUI windows are generally separated into three panes, displaying a tree of categories, a list of items in the selected folder/feed, and the content for the selected item. In Tiny Tiny RSS, the window is split into two panes, displaying a tree of categories in the left pane and feed items in the right pane. Item content is displayed one on top of the other; there is no separate list of items. To process feeds, one generally uses keyboard shortcuts. For example, the n key is used to go to the next item in the feed, marking it read. One does not delete items, and there is no trash.

My intuition is that I can process feeds much more quickly using my current method because I filter the vast majority of items based on the just item titles, without looking at the content. A compact list of titles allows me to scan the titles and process the items very quickly, particularly in feeds where I rarely open any items. It seems that the interleaved content in Tiny Tiny RSS slows me down significantly, though I would need to get used to it before I could make a fair comparison.

Using my current method, I delete items as I process them. Sometimes I decide that I want to investigate a deleted item further, after seeing a related item afterwards, for example. In Thunderbird, I am able to locate items in the trash very quickly because I am able to search/filter the list based on just the item titles. The title: prefix can be used to only search titles in Tiny Tiny RSS, but the interleaved content in the search results is much more difficult to scan.

The title of each item is rendered as a link. Clicking on the title opens the link in a new tab. Right-clicking on the title does not open the browser popup menu, however; a Tiny Tiny RSS popup menu is displayed instead. Selecting Display article URL opens a (modal) window with the item link URL for copying. This is a bit annoying, but I do not need to copy item link URLs frequently enough to mind.

Podcast enclosures are more problematic. I need to be able to copy those URLs. Tiny Tiny RSS lists enclosures in an Attachments select box, which I think is a strange choice of user interface element. Selecting an attachment opens it in a new tab, which is not the behavior that I want. Unfortunately, the URL is not displayed until the server responds.

Item descriptions look fine. Japanese is displayed without issue, and tables and fonts look fine, as it is in my browser after all. Images are displayed by default, making items with large images particularly troublesome in the item list. There is an option to “do not embed media” per feed, though, so it is possible to disable images in problematic feeds. Showing the content in a separate pane is much better, IMHO.

Tiny Tiny RSS has support for authenticated feeds.

Since feeds are viewed in my browser, I assume that I have the benefits of the browser features, including add-ons. It is nice to be able to use 10ten, for example, but I have not missed that feature in Thunderbird because I generally only want to use such a plugin after I have opened the item in my browser anyway.

I added the feed that Thunderbird refuses to load due to validation issues, and Tiny Tiny RSS handles it without any problems.

The default update and purge settings are configured in the preferences, and these settings can be overridden in feed configuration. This is a good design. I read that purging messages can cause the messages to show up again if they are still in the feed. I wonder how this works with podcast feeds, which usually keep the whole catalog of episodes in the feed. Perhaps such feeds should use the Never purge setting to ensure that old episodes do not come back as new after they are automatically purged.

I do not see any configuration concerning notifications. The number of unread items is displayed in the tab title in the browser.

I do not see any information in the wiki about performing backups, but I noticed that one of the containers is named ttrss-docker-backups-1, so perhaps backup functionality is available. One can easily export an OPML file to serve as a lightweight backup, but I unfortunately do not see a way to do this via the API, so it may be difficult to automate.

I guess I should talk about PHP… I worked with PHP professionally many years ago. PHP had a poor reputation even then, but I convinced myself that it could be used to create high-quality software if the developers are strong developers who are security-conscious. Through numerous bad experiences, I came to understand that this is not true. I now believe that the language/ecosystem is inherently flawed, and I distrust any PHP code. I do not mind that others use it, and I might even recommend it to somebody in specific situations, but I personally do not want to even install it on my systems. (Perhaps this is a kind of developer PTSD?)

Since Tiny Tiny RSS is implemented using PHP, I do not trust it. I like how it uses Docker, however, which at least minimizes the blast radius by putting the untrusted code in a container. Since the application requires authentication, only the login screen is exposed to attackers. One can hide the endpoint to limit exposure. For even better security, basic access authentication could be configured to ensure that only authenticated users run the PHP code.

I checked out the resource usage in order to estimate server requirements. The low values were measured during an idle state (not even logged in), and the high values were measured while processing feeds.

Container CPU (%) Memory (MiB)
app 0~56 31
backups 0~1 1
db 1~72 98
updater 1~25 13~52
web-nginx 0 8

With a single user, I bet that it would work fine even on a $5 per month VPS. This results in an estimated expense of $60 per year for a dedicated VPS.

I would also like to measure the network/browser usage for comparison with other web-based RSS clients. The HTML and image content depends on feed items that are displayed, but I am most interested in the JavaScript anyway. In my test, Tiny Tiny RSS loads 21 scripts, transferring 1,784.28 KB in total.

My Client Requirements

How does Tiny Tiny RSS measure up to my client requirements?

Tiny Tiny RSS meets my essential requirements. I was impressed with the performance, and the keyboard shortcuts are good. It works with all of my feeds, even the invalid feed that Thunderbird refuses to load. The only significant issue that I ran into is the bug that occurs when organizing feeds.

I prefer a native application, but using a web application would be convenient for checking RSS feeds while away from my computer. I wish it was not implemented in PHP, but at least the untrusted code can be contained.

Since Tiny Tiny RSS is accessed via my web browser, the content is rendered well. The fonts look fine, it supports multiple languages, and HTML content is rendered well (including tables). Browser add-ons can be used! I do not like how it displays item content in the item list, especially when items contain images or are really long. Unfortunately, it makes it difficult to copy the link of an enclosure.

Tiny Tiny RSS allows me to organize feeds hierarchically, allowing me to optimize the order that I process them. The hierarchy is implemented much better than in Thunderbird. It only checks feeds periodically, and one does not delete items as they are processed, which is not my preferred way of processing feeds.

Overall, I am impressed with Tiny Tiny RSS. I am currently not considering switching to it because my focus is on efficiency, and I am more efficient using other RSS clients. (Note that this is due to the design, not application performance.) If I need a web-based RSS client in the future, however, I will consider using this one if I am unable to find a better one.