Skip to main content

RSS Part 11: FreshRSS

Another web-based RSS client that I find many recommendations for is FreshRSS. Like Tiny Tiny RSS, it is implemented in PHP and can be self-hosted. I am trying it out to see how it compares to Tiny Tiny RSS as well as see how well it meets my client requirements.

Impressions

FreshRSS also provides a Docker image. The Docker documentation provides installation instructions. For my test, I did not need an isolated network, volumes, or a reverse proxy, so I ran the server using the following command:

$ docker run -d \
  --name freshrss \
  --log-opt max-size=10m \
  -e 'CRON_MIN=4,34' \
  -e 'TZ=Asia/Tokyo' \
  -p 8888:80 \
  freshrss/freshrss

The cron configuration is passed to the container using an environment variable, and I wonder if this alone determines when feeds are checked or if configuration options are exposed as well. The time zone is probably passed as an environment variable so that the system logs are in the specified time zone. If this is an accurate guess, nice!

Browsing to the exposed endpoint (localhost:8888 in my test), you are presented with an installation wizard. It lets you select from three database backends: SQLite, MySQL, and PostgreSQL. This is really nice, as it allows you to select the database that is appropriate for your specific needs. Here is my brief take on these three options:

  • SQLite might be a good choice for small installations. The primary benefit is low resource usage. The primary drawback is likely lower performance. If I use FreshRSS, the instance will be just for me, so I would consider just using SQLite and only switch to a different option if I run into issues. I am using SQLite for this test.
  • MySQL is a database that sacrifices safety for better performance. It might be a good choice for installations that need to support many users on minimal hardware in situations where bugs are acceptable.
  • PostgreSQL is a database that opts for a high degree of safety. The performance is still good, and this is usually my relational database of choice.

You set the username and password for the initial user in the installation wizard. This user is given administrative privileges, so you may want to create a special administrative user and then use that user to create the user that you use regularly.

New users are subscribed to the FreshRSS releases feed. This is a good way to keep up with release information.

FreshRSS displays a settings icon (gear) when the mouse is over a feed name. Pressing this icon presents a popup menu with various items. I like this better than hijacking right mouse clicks (like Tiny Tiny RSS does) because it makes the user interface more consistent. The application settings menu is similarly selected using a gear icon at the top right. I like this much better than the hamburger icon used by Tiny Tiny RSS because the gear icon cannot be confused with the browser hamburger icon near the same location on the screen.

Removing a feed is straightforward. Select Manage in the settings popup menu for the feed and click on the Remove button to remove the feed.

I was able to import my OPML file without issue. It took a long time, and the only indication that it was still working was the browser tab icon. After the import completed, all of the feeds were checked. The interface makes it look like this is done serially (one feed at a time), but perhaps that is just an artifact of the UI. It took about the same time to check all feeds as other clients.

FreshRSS has support for categories, but it does not have support for sub-categories. My Thunderbird hierarchy requires a folder per feed since the client does not display feeds separately, and this results in a mess in FreshRSS. (This annoyance is due to Thunderbird’s poor design.) All of the folders are loaded, but the category folders are not displayed (by default) since they do not contain any feeds. You can change the settings to display categories and feeds with no unread items, but empty categories are still not displayed in the main interface. I thought that this might be a bug at first, but I then found that the empty categories are displayed and can be deleted on the “Subscription management” page. I now realize that not showing empty categories in the feed list is best. Reorganizing the feeds using this interface is pretty time-consuming. If I decide to use FreshRSS, I would first reorganize my feeds in QuiteRSS and export a new OPML file from that client for importing into FreshRSS.

The categories are automatically sorted. Nice! Feed titles default to the those specified in the feeds, but users can set a better name when desired. Great!

In the “Archiving” section of the configuration, there is an option to specify the length of time to not automatically refresh, with a default of one hour. This setting can also be specified per feed. The user interface has an update icon, and there is an Update menu item in the popup menu for feed settings. This allows users to choose when to update but prevents doing so too frequently. I like this design much better than that of Tiny Tiny RSS! If I were to install FreshRSS, I would configure automatic updates for every eight hours and still be able to check for new feeds when I want.

There are three different user interfaces available for processing feeds in FreshRSS. The “normal view” shows the categories/feeds in a pane on the left and the list of items in the selected category/feed in a pane on the right. This is similar to the Tiny Tiny RSS user interface with significant difference: items are collapsed by default! The content for an item is only displayed when the item is opened (using the mouse or a keyboard shortcut). When opened, the content of the item is interleaved in the list.

The “global view” presents a grid of feeds grouped by category. Selecting a feed or category opens a modal window with the list of items, like in the right pane of the normal view. The benefit of this view is that you can use the full width of a small screen to view content. The content is displayed in a very narrow column by default, but this can be changed in the configuration. Unfortunately, there are two major issues with this view. The most significant issue is that automatic scrolling hides part of an opened item, making it impossible to just use the keyboard since you frequently need to scroll back up using the mouse. The up arrow key does not work, which brings us to the second major issue: double scroll bars. The double scroll bars cause significant usability issues for both the mouse and keyboard because the browser cannot know what the user is thinking. In the above example, I want the up arrow key to scroll the inner window (with the content), but it does not work because the browser interprets it as a command to scroll the browser window (already at the top). With these usability issues, I doubt I would ever use this view.

The “reading view” is a single screen with items interleaved with content. Note that you must select the category/feed in the normal view, as the reading view does not provide a way to do so. While this view is not one that I would use regularly, I would be very happy to have it available for the times that I want it!

To process feeds, I would use the normal view. It is not as efficient as my current workflow, where item content is displayed in a separate pane, but I found that it is not too bad when I tried it out. In FreshRSS, the next item is opened using the j keyboard shortcut. (Vim key bindings: very nice!) In many cases, however, I do not want to open items because I can filter them just based on the title. This is possible using the n keyboard shortcut to select the next item without opening it and then using the r keyboard shortcut to mark it as read. For some feeds, I could scan the titles (visually or using the n key) and simply hit the Mark all as read checkbox when finished.

I noticed that marking all as read causes the UI to automatically switch to the next feed with unread items. The keyboard shortcuts are also able to jump to the next feed. Nice!

FreshRSS does not have trash functionality. Like Tiny Tiny RSS, items are marked as read, not deleted. Searching works well, but the full content is searched. I was unable to find a way to just search item titles.

The title of each item is rendered as a link. Clicking on the title opens the link in a new tab. Since right-clicking on the title opens the browser popup menu, it is easy to copy the URL. I like this much better than the Tiny Tiny RSS design. Podcast enclosures are displayed using a floppy disk icon, and the URL can be easily copied via a right click.

Item descriptions look fine, especially after changing the column width in the preferences. Japanese is displayed without issue, and fonts look fine, as it is in my browser after all. Tables look great! Images are displayed, and I do not see an option to disable them. It is not a huge issue since items are collapsed by default, but showing content in a separate pane is much better, IMHO.

FreshRSS has support for authenticated feeds. As with Tiny Tiny RSS, you get the benefits of browser features (including add-ons) since FreshRSS is used in the browser.

FreshRSS has a feature that is similar to something I have wanted for a long time but have never seen implemented! In the settings popup for a feed, select Statistics to open statistics about the feed. This shows some counts as well as graphs that visualize the average number of feeds written per hour of the day, day of the week, and month. This information is only marginally interesting, unfortunately. I really wish that the application implemented more useful statistics such as an open/favorite ratio over time…

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

FreshRSS has purge settings for deleting old items, similar to Tiny Tiny RSS. I do not see any configuration concerning notifications, but I did get a prompt from my browser and selected to block all notifications. The number of unread items is displayed in the tab title in the browser.

FreshRSS has nice documentation! There is a section on backup that describes various ways to backup. One option that I really like is a CLI command for exporting to OPML, which provides a very easy way to implement automatic, lightweight backups of the configured feeds! Excellent!

Like Tiny Tiny RSS, FreshRSS is unfortunately implemented in PHP. I do not trust it, but at least I can use Docker to minimize the blast radius as well as follow the same precautions described in my Tiny Tiny RSS impressions.

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)
freshrss 0~9 170

The CPU usage is generally very low, with some small spikes (~9%) when I process feeds very quickly. With such low resource usage, I could run this software on an existing server, not adding any additional expenses.

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. The size is so low that I had to double-check. I cleared all of my browser cache and tried again. The login screen loaded three scripts, transferring a total of 25.12 KB. Logging in subsequently loaded one script, transferring a total of 10.93 KB. This is really great!

My Client Requirements

How does FreshRSS measure up to my client requirements?

FreshRSS meets my essential requirements. I was impressed with the performance, and I was really happy with the small JavaScript size. The keyboard shortcuts are good. It works with all of my feeds, even the invalid feed that Thunderbird refuses to load. I did not spot any bugs during my test.

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 FreshRSS 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! While I prefer displaying item content in a separate pane, at least FreshRSS collapses items by default, making them much easier to process than with Tiny Tiny RSS.

FreshRSS supports a single level of categories, which meets my requirements. This allows me to optimize the order that I process feeds. Importing an OPML file with more than one level of folders is problematic, but this is a one-time nuisance and can be mitigated by first reorganizing the feeds in a different client.

FreshRSS allows users to check feeds manually, with settings to prevent checking too frequently. One does not delete items as they are processed, which is not my preferred way of processing feeds.

Overall, I am impressed with FreshRSS. 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. I like FreshRSS better than Tiny Tiny RSS.