FreshRSS: Self-Hosted RSS Reader Setup
Deploy FreshRSS on Docker to follow blogs, news, and podcasts through a single self-hosted feed reader, with multi-device sync and app support.
RSS never went away. The feeds are still there for most blogs, news sites, and podcasts. What died was the tooling that made them comfortable to use. FreshRSS brings it back — a self-hosted feed reader with a clean interface, multi-device sync via the Fever and Google Reader-compatible APIs, and no algorithm deciding what you read.
If you’re tired of relying on social media to discover content, or you just want to follow 30 blogs without checking 30 websites, FreshRSS is the solution.
What FreshRSS Does
FreshRSS aggregates RSS, Atom, and JSON Feed sources. You subscribe to a feed URL, and FreshRSS fetches new articles on a schedule. Everything is stored locally and presented in a clean reader interface.
The Fever and Google Reader API compatibility is the important part for multi-device use — most RSS reader apps (Reeder, NetNewsWire, ReadKit, Fluent Reader, Unread) support at least one of these APIs. Set up FreshRSS once, connect all your apps to it, and your read state stays synchronized across devices.
Installation
mkdir -p /opt/freshrss/data
Create /opt/freshrss/docker-compose.yml:
services:
freshrss:
image: freshrss/freshrss:latest
container_name: freshrss
environment:
- TZ=America/Chicago
- CRON_MIN=*/15
- FRESHRSS_ENV=production
volumes:
- /opt/freshrss/data:/var/www/FreshRSS/data
- /opt/freshrss/extensions:/var/www/FreshRSS/extensions
ports:
- "8060:80"
restart: unless-stopped
TZ — Set your timezone. Affects timestamps on articles.
CRON_MIN=*/15 — FreshRSS fetches new articles from all feeds every 15 minutes. Adjust to */30 or */60 if you want less frequent updates and lower resource usage.
cd /opt/freshrss
docker compose up -d
Access the interface at http://YOUR_SERVER_IP:8060.
Initial Setup
The setup wizard runs on first access:
- Language — select your language
- Database — choose SQLite (simple, no separate database container needed for a personal install) or MySQL/Postgres if you want a more robust option
- Admin account — create your username and password
After setup completes, you’re at the main FreshRSS interface.
Adding Feeds
Click Subscriptions > Add a subscription > paste a feed URL.
If you don’t have the feed URL, try appending /feed, /rss, /atom.xml, or /feed.xml to a blog’s homepage. FreshRSS also has an auto-discovery feature — paste the page URL and it’ll try to find the feed.
Common feed URL patterns:
- WordPress blogs:
https://example.com/feed - Substack newsletters:
https://author.substack.com/feed - YouTube channels:
https://www.youtube.com/feeds/videos.xml?channel_id=CHANNEL_ID - GitHub releases:
https://github.com/owner/repo/releases.atom - Podcasts: use the podcast’s RSS feed URL directly
Organize subscriptions into categories (create them under Subscriptions > Manage). Useful groupings: News, Blogs, Tech, Podcasts, YouTube.
Enabling the API (For App Sync)
To connect RSS apps to FreshRSS, enable the API:
Settings > Authentication — check “Allow API access.”
Settings > Profile — set an API password (can be the same as your login password, or different).
The API endpoints are:
- Google Reader API:
http://YOUR_SERVER_IP:8060/api/greader.php - Fever API:
http://YOUR_SERVER_IP:8060/api/fever.php
Most modern RSS apps support Google Reader API. Use that one unless your app specifically says Fever.
Connecting Apps
iOS/macOS — Reeder 5:
- Accounts > + > Freshrss > enter your server URL, username, and API password
iOS — Unread:
- Add Account > FreshRSS > enter URL and credentials
Windows/Linux — Fluent Reader:
- Accounts > + > FreshRSS > enter URL (use the full path to the greader endpoint)
Android — Read You or Capy Reader:
- Add source > FreshRSS > configure URL and credentials
Each app stores your read state back to FreshRSS, so marking something read on your phone marks it read everywhere.
Filtering and Rules
FreshRSS has a filter system for automatically marking items read, highlighting items, or hiding items based on rules:
Subscription > Manage > [feed name] > Filters
Useful filters:
- Mark as read: articles matching keywords you don’t care about (for noisy feeds)
- Mark as favorite: articles matching keywords you always want to see
This helps with high-volume feeds like tech news sites where you only care about specific topics.
OPML Import/Export
If you’re moving from another RSS reader:
Export from old reader: Find the OPML export option and download the file.
Import to FreshRSS: Subscriptions > Import/Export > Import an OPML file
FreshRSS imports all your subscriptions in bulk. This takes a minute for large import files.
Export your FreshRSS subscriptions periodically as OPML — it’s a backup of your feed list that works with any RSS reader.
Backups
Back up the data directory:
tar -czf /backup/freshrss-$(date +%Y%m%d).tar.gz /opt/freshrss/data/
The data directory contains your database (SQLite file), feed configurations, and read state. Back it up weekly at minimum.
Extensions
FreshRSS has an extension system for additional features. Add extensions by placing them in the /opt/freshrss/extensions directory (which is volume-mounted).
Notable extensions:
- Markdown — renders Markdown in article bodies
- Reading Time — estimates reading time per article
- Google News RSS Helper — fixes Google News feed URL encoding
Browse available extensions at the FreshRSS extensions repository.
Keeping It Updated
cd /opt/freshrss
docker compose pull
docker compose up -d
FreshRSS releases are infrequent and stable. Safe to let Watchtower handle this automatically.