MyFeed RSS Reader
I wanted to get away from social media. I liked the idea of feeding directly from websites to consume their content not via a third party. Subscribing to the sections of a website I'm interested in, not mixed up with marketing posts. I also wanted a way to combine several sources into one, which RSS is perfect for. Luckily a lot of sites still publish RSS or Atom feeds.
Looking at the current RSS apps available they were all too fiddly and almost all required me to "sign up". I just want to have a list of feeds and have them presented nice and simple. Kind of like Hacker News, a list of titles, straight to the point, click the title and go to the article.
Privacy, I don't want to know what people are consuming.
Resilience, I don't want to maintain complicated build steps, servers, forced upgrades.
Ease of use, I want a simple UI that works across all devices.
Frictionless, I don't want to sign up to use something.
Speed, it should use as little resources as possible and run as fast as possible.
To maintain privacy things have to stay client side (browser), I don't want to maintain a database of peoples things, the browser already has personal databases it can use, IndexedDB. Unless it's assets, which are cached by the browser, all data is saved in IndexedDB, such as the list of feed sources, which sources are currently hidden, and potentially a custom proxy URL.
Unfortunately due to CORS (Cross-origin resource sharing) I wasn't able to achieve a purely browser based app, and had to create a CORS proxy to allow the browser to pull the feeds across different domains.
To get around this I opted for a simple Cloudflare Worker, which allows for 100,000 reqs / day for free. I've also published the code for this worker to allow anyone to run their own, and configure the app to use your own CORS proxy instead of the default, for the super privacy focused. The benefit of the proxy is also that unless you click one of the titles and therefore browse to the site, the site itself has no idea who requested the latest feed as all the site can see is the proxy. No more "we noticed you subscribe to our feed, can we sell you something".
Being a web project I wanted this to be native modern web, no build step, no ES5 ( super old devices don't justify a complicated build step in my opinion), pure ES6, no framework that will go out of fashion or maintenance in a year, plain HTML, CSS, and JS as much as possible.
Other than a small date helper library the project relies on lit-html, its a thin layer that builds on tagged template literals to provide functional UI.
Ease of use
The design of the app is very minimal, this was to focus as much on the content as possible. It also has automatic dark mode, enabled via CSS `prefers-color-scheme` which decides based on the current device settings whether the user prefers dark or light mode and adjusts the colour theme accordingly.
Without sign ups the app is ready to go as soon as you hit https://myfeed.jasongorman.uk. The other addition was making the site a PWA (Progressive Web App), which makes it easy to install on Linux, iOS, MacOS, Android and Windows, it's super light weight.
The whole app weighs in at 121kb (82.7kb compressed). Out of that JS accounts for 62kb, and CSS 1.9kb, the rest is desktop icon images. So no waiting around for app to install or update itself, even on a mobile connection. This is a result of the path taken in the resilience section. Leaning on standards and what's already baked in as much as possible, without carrying extra framework baggage.
Some improvements I'd like to make to the app are ways to make it easier to sync across devices, right now you have to manually adjust settings on each device.
Ideally I'd want this to be done also in a way that's privacy friendly (no sign ups). Potentially an export / import feature for the settings could be an answer, or something slightly smoother like a server syncing mechanism but with end to end encryption similar to how Bitwarden works. It's something I'll be looking to add in the future.
Another improvement would be a proper reader mode (similar to Firefox or Edge), which means when you click to read an article the article you can just read the article, rather than fight a website asking you about cookie preferences. The aim of the project however is to read articles from source, and reader mode would avoid actually viewing the page (CORS would require a proxy). But maybe this becomes a feature that can be turned on per source. Some sites on the web are actually quite nice and don't bombard you with questions and popups. :)
I've been using this app daily for almost a year now (Since July 2020), and enjoy the simplicity and ease at which I can consume content I enjoy. Feel free to use it yourself, though if you're using it a lot maybe spin up your own CORS proxy rather than hitting the shared default one.
If you're interested in the code, simply view source, and use dev tools to see what's going on. It should hopefully be quite readable :)
See the performance rework update.