Why Bother With RSS in 2026?
There’s a quiet rebellion happening. While everyone scrolls through algorithm-curated feeds designed to keep them angry and clicking, a growing number of us are going back to something older, simpler, and radically better: RSS. Really Simple Syndication.
The problem? Google Reader died in 2013, and most replacements are either paid SaaS services or require more setup time than most people want to invest. The good news? You can host your own RSS aggregator in about 15 minutes, keep your reading habits completely private, and never let another algorithm decide what you see.
In this tutorial, we’ll set up FreshRSS — a self-hosted, lightweight, open-source RSS aggregator — running in Docker. By the end, you’ll have your own personal news hub accessible from any device, with no monthly fees and no tracking.
Prerequisites
- A Linux server (or Raspberry Pi) with Docker and Docker Compose installed
- Basic comfort with the command line
- A domain name pointing to your server (optional but recommended for mobile access)
- About 15-20 minutes
Don’t have Docker installed? Run curl -fsSL https://get.docker.com | sh and then sudo usermod -aG docker $USER followed by logging out and back in.
Step 1: Create the Project Directory
Let’s keep things tidy. Create a directory for FreshRSS:
mkdir -p ~/freshrss
cd ~/freshrss
Step 2: Write the Docker Compose File
Create docker-compose.yml:
cat <<EOF > docker-compose.yml
version: "3.8"
services:
freshrss:
image: freshrss/freshrss:latest
container_name: freshrss
restart: unless-stopped
ports:
- "8080:80"
environment:
- TZ=America/New_York
- CRON_MINUTE=13,43
volumes:
- freshrss_data:/var/www/FreshRSS/data
- freshrss_extensions:/var/www/FreshRSS/extensions
depends_on:
- db
db:
image: postgres:15
container_name: freshrss_db
restart: unless-stopped
environment:
- POSTGRES_DB=freshrss
- POSTGRES_USER=freshrss
- POSTGRES_PASSWORD=your_secure_password_here
volumes:
- db_data:/var/lib/postgresql/data
volumes:
freshrss_data:
freshrss_extensions:
db_data:
EOF
Why PostgreSQL? FreshRSS supports SQLite, but PostgreSQL gives you better performance if you’re following hundreds of feeds. It’s also trivial to back up and handles concurrent reads beautifully. If you prefer SQLite, you can remove the db service entirely — FreshRSS will use its built-in SQLite driver automatically.
Important: Replace your_secure_password_here with an actual password. You can generate one with openssl rand -base64 24.
Also, adjust the TZ variable to your timezone. Find yours with timedatectl list-timezones | grep YourCity.
Step 3: Launch the Container
docker compose up -d
Watch the logs to make sure everything started cleanly:
docker compose logs -f freshrss
You should see FreshRSS initializing the database. Once you see something like FreshRSS is ready, press Ctrl+C to stop following the logs.
Step 4: Run the Web Installer
Open your browser and navigate to http://your-server-ip:8080. You’ll see the FreshRSS setup page:
- Database: Select PostgreSQL, host
db(Docker’s internal DNS), databasefreshrss, userfreshrss, and the password you set. - Admin account: Choose a username and password for your admin account. Don’t use “admin” as a username — it’s the first thing bots try.
- Language: Pick your preferred language.
- Click Submit.
If everything goes well, you’ll be taken to the login page. Log in with your new admin credentials and you’re in!
Step 5: Add Your First Feeds
Once logged in, click the + button at the top left to add a feed. Start with a few of your favorites:
https://jerithai.com/feed/(hey, that’s us!)https://daringfireball.net/feeds/mainhttps://feeds.bbci.co.uk/news/rss.xml
FreshRSS will fetch the latest articles immediately. You can organize feeds into categories (News, Tech, Blogs, etc.) for easier browsing.
Step 6: Set Up Automatic Updates
RSS feeds need to be polled regularly. FreshRSS has a built-in cron system, but it needs an explicit trigger. The CRON_MINUTE environment variable we set earlier tells FreshRSS which minutes to run internal updates, but we still need an actual cron job to hit the update endpoint:
crontab -e
Add this line:
*/30 * * * * docker exec freshrss php /var/www/FreshRSS/app/actualize.php 2>>/dev/null
This runs the FreshRSS updater every 30 minutes. The 2>/dev/null suppresseses output so you don’t get emailed logs.
Alternative: If you prefer systemd timers (because of course you do — see our guide on this), you can create a timer instead.
Step 7: (Optional) Add HTTPS with Nginx Reverse Proxy
If you want to access FreshRSS from outside your home network securely, set up an Nginx reverse proxy with Let’s Encrypt. We covered this in detail in our Nginx reverse proxy guide, but here’s the quick version:
apt install nginx certbot python3-certbot-nginx -y
certbot --nginx -d rss.yourdomain.com
Then point an Nginx server block at localhost:8080. Done.
Step 8: Configure Mobile Access
FreshRSS has excellent mobile support through its responsive web interface or via compatible apps:
- iOS: FreshRSS official app or Reeder
- Android: FreshRSS official app or Feedly (with Fever API bridge)
To connect mobile apps, go to Settings > Profile > API in FreshRSS, enable the API access, and use the displayed API URL and credentials.
Common Pitfalls & Troubleshooting
“Database connection refused” error
The database container might still be starting up. Wait 30 seconds and try again. If it persists, check docker compose logs db for errors.
Feeds aren’t updating
Make sure your cron job is running: grep CRON /var/log/syslog | tail -20. Also verify the cron command works manually: docker exec freshrss php /var/www/FreshRSS/app/actualize.php
Permission errors on data volume
FreshRSS runs as www-data inside the container. If you see permission errors, run: docker exec -u root freshrss chown -R www-data:www-data /var/www/FreshRSS/data
Container won’t restart after reboot
Make sure restart: unless-stopped is set in your compose file. Verify with docker inspect freshrss --format '{{.HostConfig.RestartPolicy.Name}}'
Why This Matters
There’s something deeply satisfying about owning your information diet. When you self-host your RSS reader, you’re not renting attention from a platform — you’re building a tool that serves you. No sponsored posts. No “trending” sections designed to provoke outrage. Just the content you chose to follow, presented in chronological order.
FreshRSS is actively maintained, lightweight (runs happily on a Raspberry Pi with 512MB RAM), and has a thriving extension ecosystem. It’s one of those rare self-hosted tools that’s genuinely pleasant to use daily.
Go tend your digital garden. The feeds are waiting.
Leave a Reply