Say Hello to Journalist v1, the complete rewrite of Journalist, an open source RSS aggregator!
Back in November 2020 I set out to finally replace Feedly, a commercial RSS aggregation service, with something that was open source, self-hosted and ideally as lightweight as possible. After considering the options that were available back at the time I decided to build something on my own: Journalist.
Back at the time I was primarily using a MacBook Pro and an iPhone. My primary goal was to implement something that was lightweight, offered full article feeds and could be used with Reeder, a macOS/iOS app for reading RSS feeds. I wanted to be able to read things on the MacBook, mark them as read and continue reading on the iPhone without having to go over the already read articles again. Since Reeder still supported the outdated but easy to implement Fever API, I decided to make it the primary API for Journalist. In hindsight that probably was not the best idea.
Fast forward two years to today, I have switched back to Linux and I’m barely using the MacBook or the iPhone anymore. Instead, I moved to a Linux workstation as well as a Samsung phone running /e/OS as daily drivers. On the workstation I use Canard, on the phone however I switched to Feeder, which is an open source Android feed reader. Unfortunately Feeder doesn’t support the Fever API or any other API for synchronizing read items. In general most RSS clients seem to solely support subscribing directly to RSS feeds. And if they do support an API, it’s usually one of their own (non open source) service.
With all this in mind, I decided to rebuild Journalist to make it better fit my
(and presumably other people’s) needs. The first question that came to my
mind when I began planning the rebuild was: If most RSS clients don’t support
any API and only allow for direct feed subscriptions, then why bother to
implement an actual API in first place?
I decided to build Journalist so that it would serve pure RSS feeds to clients, yet still offer features like feed synchronization, read/unread states and starred items.
Today I’m happy to announce that Journalist v1.0.0 is
available for everyone to download and try. It’s a complete rewrite that’s
built on top of the Go ent framework and Fiber. Journalist now
supports a variety of databases (SQLite, PostgreSQL, MySQL) and it’s possible to
run it as standalone daemon (for example via
systemd or Docker), as
Heroku Dyno, Lambda function, Google Cloud function, DigitalOcean App and soon
as DigitalOcean function. Especially for single-/few-user setups, the serverless
approach can benefit the cost side, with Journalist running only when needed. If
paired up with an Aurora Serverless RDS for example, it’s possible to run a
low-load deployment of Journalist for virtually no cost.
With Journalist v1.0.0 there’s no need for specific clients that support any sort of APIs. Journalist allows you to subscribe to all your feeds using just a single RSS feed, under which it aggregates each one of your subscriptions. By injecting an own menu on the top of each article view, it’s possible for you to mark items as read with just a tap of a link. Journalist will remove read articles from the main feed, therefore when you launch another client (for example on your phone) and have it sync the Journalist feed, it won’t see the items that were marked as read previously!
Journalist however does implement a lightweight to use yet efficient API for managing users and subscribing to feeds. Over time, its API will grow to become more powerful and allow for more features on top of the essential one that is aggregation and synchronization of feeds/articles.
Journalist v1.0.0 can be downloaded from GitHub today. Pre-built binaries for Android, Darwin (macOS), DragonFly BSD, FreeBSD, Linux, NetBSD, OpenBSD, and Windows are available. For in-depth information on how to setup/run Journalist v1.0.0 please refer to its README.md. Journalist v1.0.0 isn’t an upgrade to the pre-v1.0.0 versions but a full rewrite. Therefore it’s impossible to upgrade your existing database – sorry!Journalist on GitHub
published [ ] · updated [ ]