FreshRSS Turned Out to Be a Great RSS Reader (With Installation Steps)
Table of Contents
It’s been about two weeks since I started using RSS.
The Internet Has Turned Into a Desert, So Let’s Use RSS
I’m completely hooked, so I decided to improve my setup even further.
Problems
Right now I’m using Inoreader as my RSS reader.
I feel it’s the most convenient of the easy-to-use RSS readers, but it came with the following problems.
Filters Are Paid-Plan Only
On Inoreader’s free plan, you can’t set up filters. You can’t hide articles that contain certain keywords, or show only articles that contain certain keywords.
This goes right to the heart of why I started using RSS in the first place.
The internet has become a wasteland where people fight over each other’s attention. It’s what’s known as the “Dead Internet theory.” Ads I have no interest in, fake news, stoking conflict, AI slop, and so on. I’m sick of all of it.
Hatena Bookmark’s hot entries feed (Hatena Bookmark is a Japanese social bookmarking service) is handy for keeping up with what’s trending on the internet, but it also contains plenty of articles that don’t exactly put me in a good mood. To be blunt, I want to filter out Togetter (a Japanese site that collects tweets into threads).
The “Read Full Article” Feature Is Half-Baked
Inoreader has a “Read full article” feature. For RSS feeds that only deliver part of an article, it fetches the full text of the original article and displays it.
It seemed quite handy at first, but it wasn’t perfect.
Depending on the source, this feature doesn’t work properly, and I end up having to open the original article anyway. In that case, the steps are:
- Look at the feed
- if I could read the full text:
- return
- Try “Read full article”
- if I could read the full text:
- return
- Open the original article
- return
That’s a lot of steps, and having a conditional branch in there is bad too.
If I’m coming from a pinned tab in Zen Browser, external-domain URLs automatically open in Glance, so I don’t need “Read full article” at all, and this is fewer steps and simpler:
- Look at the feed
- if I could read the full text:
- return
- Open the original article
- return
In this case “Read full article” becomes unnecessary.
But either way, opening the original article puts links leading to other content right in front of my eyes, so I still can’t achieve my original goal.
“Read full article” needed to work a lot more perfectly.
I’m Still Depending on a Company’s Service in the End
I want to stay true to my anti-capitalism. (I’m not a socialist/communist, just to be clear.)
Let’s Use FreshRSS
To solve these problems, I decided to use FreshRSS.
Here’s the demo.
FreshRSS is an open-source RSS reader that you have to install on a server yourself. Since you host it yourself, you can use the filter feature freely, and it looks like I can customize and improve the “Read full article” feature in much more detail.
The catch is that you have to manage the server yourself, so there are running costs in both time and money. Fortunately, FreshRSS provides a Docker image, so setup is super easy. Also, FreshRSS is quite lightweight, so the Google Cloud Compute Engine free tier should be plenty to run it.
By the way, Professor Gemini (the AI) recommended I use Oracle Cloud’s VM.Standard.A1.Flex, but even in the Osaka region there was no capacity at all, so I couldn’t try it.
Out of capacity for shape VM.Standard.A1.Flex in availability domain AD-1. Create the instance in a different availability domain or try again later. If you specified a fault domain, try creating the instance without specifying a fault domain, otherwise try creating the instance in a different availability domain. If that doesn’t work, please try again later.So why Compute Engine? I’ve rented VMs from all sorts of places over the years, but I’d never actually rented one on Google Cloud yet. I decided to use this as a chance to try it.
Creating a Free-Tier Compute Engine Instance
I followed this article (in Japanese).
Additional Notes
As the article itself says, read through the official information. The free-tier conditions may change in the future.
For the OS, I chose Ubuntu 24.04 LTS Minimal (x86/64, amd64). It’s the latest long-term support release, and the CPU architecture matches.
The disk setting defaults to “Balanced persistent disk,” but that isn’t covered by the free tier, so you need to change it to “Standard persistent disk.”

That should probably satisfy the free-tier conditions.
Setting Up the VM Environment
Below is a summary of the commands I ran, which I had Gemini write up from my command history. There’s no guarantee it’s correct, but I hope it’s useful as a reference.
All the Command Steps for Setting Up FreshRSS on a GCP VM
[Prerequisites]
- A VM instance has already been created on GCP Compute Engine (OS: Ubuntu 24.04 LTS Minimal, etc.).
- You are connected to the VM over SSH.
Phase 1: Initial Server Setup
# === 1. Update the package list and bring the system up to date ===sudo apt updatesudo apt upgrade -y
# === 2. Install the necessary tools ===# Install the text editor "nano"sudo apt install nano -y# Install the version control system "git" (used for downloading extensions)sudo apt install git -yPhase 2: Installing Docker
# === 1. Install the packages needed to set up the Docker repository ===sudo apt install -y ca-certificates curl gnupg
# === 2. Add Docker's official GPG key ===sudo install -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgsudo chmod a+r /etc/apt/keyrings/docker.gpg
# === 3. Write the Docker repository to the config file ===echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# === 4. Update the package list again ===sudo apt update
# === 5. Install Docker Engine itself and the Compose plugin ===sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# === 6. Test run to check that Docker was installed correctly ===# If it prints "Hello from Docker!", it workedsudo docker run hello-worldPhase 3: Setting Up FreshRSS
# === 1. Create a working directory for FreshRSS and move into it ===mkdir ~/freshrsscd ~/freshrss
# === 2. Also create a directory to hold extensions ===mkdir ./extensions
# === 3. Create and edit the docker-compose.yml file ===nano docker-compose.yml↓ Once the nano editor opens, copy everything below and paste it in.
version: '3'services: freshrss: image: freshrss/freshrss container_name: freshrss restart: unless-stopped ports: - "8080:80" volumes: - ./data:/var/www/FreshRSS/data - ./extensions:/var/www/FreshRSS/extensions environment: 'CRON_MIN' : '*/30'↑ After pasting, press Ctrl + X → Y → Enter to save and exit.
# === 4. Start the Docker container ===# This starts FreshRSS, and you can do the initial setup from your browsersudo docker compose up -d(At this point, access http://<server IP address>:8080 from your browser and finish FreshRSS’s initial setup, such as creating a user.)
Phase 4: Setting Up Extensions
From FreshRSS’s “Extensions” tab, find the extensions you’re interested in and install them.
# === 1. Stop the FreshRSS container for now, so we can work ===# Make sure the directory is ~/freshrsscd ~/freshrsssudo docker compose stop
# Move into the extensions foldercd ./extensions
# === 2. Download a third-party extension ===# Example: freshrss-af-readabilitygit clone https://github.com/Niehztog/freshrss-af-readability.git
# === 3. Start the FreshRSS container again to apply all the changes ===cd ~/freshrsssudo docker compose up -d(After this, reload FreshRSS’s extensions page in your browser and turn on the toggle switch for each extension you want to use.)
Setting Up a Custom Domain
Next, I want to make the GCP server’s IP address reachable through a subdomain of my own domain (for example rss.your-domain.com) using Cloudflare.
This also worked out fine when I followed a step-by-step guide from Professor Gemini.
Guide to Pointing a Custom Domain at FreshRSS with Cloudflare
[Goal]
To make the server’s http://<IP address>:8080 URL reachable at an easy-to-remember, secure URL: https://rss.your-domain.com.
[Prerequisites]
- Your own domain (for example
your-domain.com) is already registered with Cloudflare. - You know the external IP address of the GCP server where FreshRSS is running.
Step 1: Add a DNS Record (Linking the Domain to the IP Address)
First, set things up so that the subdomain you want to create points to your GCP server.
- Log in to Cloudflare and select the target domain.
- Click “DNS” in the left menu.
- Press the “Add record” button.
- Create a record with the following contents.
- Type:
A - Name:
rss(or enter whatever subdomain name you want to use, such asfreshrss) - IPv4 address: Enter your GCP server’s external IP address.
- Proxy status: Be sure it is set to **“Proxied” (the orange cloud icon)**. This is the most important point.
- Type:
- Click the “Save” button.
Step 2: SSL/TLS Settings (Encrypting the Connection)
Next, set the connection between the user and Cloudflare to secure HTTPS.
-
Click “SSL/TLS” in the left menu and open the “Overview” tab.
-
Set the SSL/TLS encryption mode to “Flexible”.
- (This means you no longer need to prepare an SSL certificate on the server side.)
-
Next, switch to the “Edge Certificates” tab.
-
Turn the “Always Use HTTPS” switch on.
- (This automatically redirects
http://access tohttps://.)
- (This automatically redirects
Step 3: Origin Rules Settings (Hiding the :8080 Port Number)
This setting lets you remove the port number from the URL.
- Click “Rules” in the left menu and select the “Origin Rules” tab.
- Press the “Create rule” button.
- Create a rule with the following contents.
- Rule name:
FreshRSS Port Forward(or any easy-to-understand name) - Condition (“When incoming requests match…”):
- Field:
Hostname - Operator:
equals - Value:
rss.ilapaj.com(enter the subdomain name you set in Step 1)
- Field:
- Action (“Then…”):
- Find the item called “Override destination port”.
- Select “Port” and enter
8080in the input field on the right.
- Rule name:
- Click the “Deploy” button to save and enable the rule.
Final Check
That completes all the settings. It can take anywhere from a few minutes to about 10 minutes for DNS changes to propagate across the entire internet.
After waiting a little while, try accessing the following URL in your web browser.
https://rss.your-domain.com
(*Replace the rss.your-domain.com part with the subdomain name you set up.)
If the FreshRSS login screen shows up and there’s a padlock icon in your browser’s address bar, you’re good!
Configuring FreshRSS
After that, I tweaked a bunch of settings in FreshRSS, and ended up with this.

I got “Read full article” working by installing the “Readability” extension, and it’s seriously good. It can now fetch the full text of the original article for almost every feed. And the amazing part is that it displays the full text automatically, without me pressing a button.
The steps I laid out earlier now boil down to just:
- Look at the feed
- return
The filter feature is also mine to use freely, and it’s more comfortable than Inoreader.
I had some concerns about the VM’s performance and network speed, but in actual use there’s no problem at all. It hasn’t even been 24 hours since I spun up the instance, so I can’t say much yet, but so far it runs just fine within the free tier.

Honestly, it’s so convenient it’s almost funny, and I can’t believe I went all this time without using something this good! If the free tier stops being enough down the line, I’d happily pay around 1,000 yen (about $7) a month.
If you’re looking for an RSS reader, please give FreshRSS a try. Hosting it yourself is a bit of a hassle, but it’s more than worth it.
More articles
- The Internet Has Turned Into a Desert, So Let's Use RSS• #RSSA look at the charm of RSS, a technology for efficiently collecting only the information you actually want to see. Break free from the algorithm and get the good old days of web surfing back.
- I Went Looking for Legal Absinthe, Drank Sage Tea Instead, and Ended Up Staring Into the Abyss of Herbs• #Life HacksA diary entry, my first in a while, about how I'm getting drawn into the world of herbs like sage and basil.
- LSENLTY's CO2 Monitor Came Back to Life Thanks to Godlike Support, So I Hooked It Up to Homepage• #HomelabMy smart CO2 monitor stopped connecting to the network, I contacted support, and they went above and beyond. Now I can view its metrics from Homepage.
- Falling into the Self-Hosted Rabbit Hole (Setup Notes for FreshRSS, RSSHub, Memos, Uptime Kuma, Netdata, and Nginx Proxy Manager)• #Self-hostedThoughts on building a self-hosted environment.
Notes on games, radio and technology, translated from the Japanese blog.



