Self-Host FreshRSS: Open Source RSS Aggregator 2026
TL;DR
FreshRSS (AGPL 3.0, ~10K GitHub stars, PHP) is a self-hosted RSS/Atom/JSON Feed aggregator — the mature Google Reader replacement. It handles hundreds of feeds, runs on SQLite or PostgreSQL, has a polished web UI, supports the Fever and Google Reader APIs (enabling third-party clients like Reeder, NetNewsWire, ReadKit), and can fetch full article text even when feeds only show summaries. Replace Feedly, Inoreader, or NewsBlur for free, with your data on your server.
Key Takeaways
- FreshRSS: AGPL 3.0, ~10K stars, PHP — full-featured RSS aggregator, mature and stable
- API compatibility: Fever API + Google Reader API → works with Reeder, NetNewsWire, ReadKit, Fluent Reader
- Full-text: Fetches full article content when feeds truncate (via XPath rules)
- Multi-user: Each user has their own feeds, categories, and read state
- Extensions: 100+ community extensions — filters, plugins, additional sources
- OPML import: Import your Feedly/NewsBlur/Inoreader subscriptions instantly
FreshRSS vs Alternatives
| Feature | FreshRSS | Miniflux | Tiny Tiny RSS |
|---|---|---|---|
| License | AGPL 3.0 | AGPL 3.0 | GPL 2.0 |
| GitHub Stars | ~10K | ~6.3K | ~2.2K |
| Language | PHP | Go | PHP |
| Database | SQLite/PostgreSQL/MySQL | PostgreSQL only | PostgreSQL |
| Web UI | Rich | Minimal | Rich |
| Mobile apps | Via API (Reeder etc.) | Via API | Native Android app |
| Google Reader API | Yes | Yes | No |
| Fever API | Yes | No | Yes |
| Full-text fetch | Yes | Yes | Yes (plugins) |
| Extensions | 100+ | No | Yes |
| RAM | ~50MB | ~30MB | ~100MB |
Part 1: Docker Setup
# docker-compose.yml
services:
freshrss:
image: freshrss/freshrss:latest
container_name: freshrss
restart: unless-stopped
ports:
- "8080:80"
volumes:
- freshrss_data:/var/www/FreshRSS/data
- freshrss_extensions:/var/www/FreshRSS/extensions
environment:
TZ: America/Los_Angeles
CRON_MIN: "*/15" # Refresh feeds every 15 minutes
FRESHRSS_INSTALL: |-
--api_enabled
--db-type sqlite
--language en
FRESHRSS_USER: |-
--username admin
--password "${ADMIN_PASSWORD}"
--api_password "${API_PASSWORD}"
--email "admin@yourdomain.com"
volumes:
freshrss_data:
freshrss_extensions:
# .env
ADMIN_PASSWORD=your-secure-password
API_PASSWORD=your-api-password # Used for mobile app API access
docker compose up -d
Visit http://your-server:8080 → log in as admin.
Part 2: HTTPS with Caddy
rss.yourdomain.com {
reverse_proxy localhost:8080
}
Part 3: PostgreSQL for Production
For large feed libraries (1000+ feeds) or multiple heavy users:
services:
freshrss:
image: freshrss/freshrss:latest
environment:
FRESHRSS_INSTALL: |-
--api_enabled
--db-type pgsql
--db-host postgres
--db-user freshrss
--db-password "${POSTGRES_PASSWORD}"
--db-base freshrss
depends_on:
- postgres
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: freshrss
POSTGRES_USER: freshrss
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
freshrss_data:
freshrss_extensions:
postgres_data:
Part 4: Import Feeds (OPML)
Import your existing subscriptions:
- Export OPML from Feedly: Settings → Import & Export → Export OPML
- In FreshRSS: Subscription → Import / Export → OPML
- Upload your
.opmlfile - FreshRSS imports all feeds and categories, starts refreshing immediately
Add Individual Feeds
- Subscription → + Add a feed
- Paste a URL (article URL or RSS URL — FreshRSS auto-detects the feed)
- Set category, refresh frequency
Part 5: Connect Mobile Apps
FreshRSS supports both Fever API and Google Reader API. Most RSS apps support one or both.
Enable the API
- Settings → Authentication → Allow API access: On
- My Profile → API password — set a dedicated API password (different from web login)
- The API URL:
https://rss.yourdomain.com/api/greader.php
App Configuration
Reeder 5 (iOS/macOS):
- Add account → FreshRSS or Fever
- URL:
https://rss.yourdomain.com - Username + API password
NetNewsWire (iOS/macOS):
- Add Account → FreshRSS
- URL:
https://rss.yourdomain.com/api/greader.php - Username + API password
Fluent Reader (Windows/Linux):
- Settings → Service → FreshRSS
- Endpoint:
https://rss.yourdomain.com/api/greader.php
Fresca (Android):
- Account → FreshRSS
- Same URL and credentials
Part 6: Full-Text Fetching
Many feeds (Medium, Substack, news sites) truncate articles. FreshRSS can fetch the full content:
Per-Feed Full-Text
- Edit any feed → Advanced → Retrieve article content
- Select: Default / Using site rules / Custom XPath
Custom XPath Rules
For sites that block generic fetching:
# Site content rule (stored in data/users/admin/no_default_feeds.ini)
# Format: [domain]
# content_selector = CSS selector
[medium.com]
content_selector = article
[arstechnica.com]
content_selector = article.article
Or use community rules from fivefilters/full-text-rss.
Part 7: Filters and Labels
Reading filters — automatically mark as read or label:
- Settings → Reading → Filters → + Add a filter
- Rule: If
title contains"sponsored" → mark as read - Or: If
author = "Jane Doe"→ label: "must-read"
Saved searches — turn any search into a virtual feed:
- Search:
javascript - Save search as category → appears as "javascript" in sidebar
Part 8: Extensions
FreshRSS has 100+ community extensions. Install from the GitHub repository:
# Download an extension to the extensions volume:
docker exec freshrss bash -c "
cd /var/www/FreshRSS/extensions && \
git clone https://github.com/nicosomb/FreshRSS-Youtube-Reader.git
"
# Activate in FreshRSS:
# Settings → Extensions → [Extension Name] → Enable
Popular extensions:
- YouTube Reader: Embed YouTube videos inline in articles
- Image Proxy: Proxy images for privacy
- Clean Tags: Strip tracking parameters from links
- ReadingTime: Add reading time estimates
- RSS-Bridge: Subscribe to sites that don't have RSS feeds
Part 9: RSS-Bridge Integration
RSS-Bridge generates RSS feeds for sites that don't have them (Twitter, Instagram, Reddit, etc.):
# Add to docker-compose.yml:
services:
rss-bridge:
image: rssbridge/rss-bridge:latest
container_name: rss-bridge
restart: unless-stopped
ports:
- "8081:80"
volumes:
- ./rss-bridge-config:/config
Then in FreshRSS, subscribe to URLs like:
https://rssbridge.yourdomain.com/?action=display&bridge=Reddit&r=selfhosted&format=Atom
https://rssbridge.yourdomain.com/?action=display&bridge=HackerNews&action=Front+Page&format=Atom
Maintenance
# Update FreshRSS:
docker compose pull
docker compose up -d
# Manually trigger feed refresh:
docker exec freshrss php /var/www/FreshRSS/app/actualize_script.php
# Logs:
docker compose logs -f freshrss
# Backup:
tar -czf freshrss-backup-$(date +%Y%m%d).tar.gz \
$(docker volume inspect freshrss_freshrss_data --format '{{.Mountpoint}}')
# Add another user:
docker exec freshrss php /var/www/FreshRSS/cli/create-user.php \
--username bob --password secret --api_password api-secret
See all open source news and RSS tools at OSSAlt.com/categories/productivity.