Skip to main content

Self-Host FreshRSS: Open Source RSS Aggregator 2026

·OSSAlt Team
freshrssrssfeed-readerself-hostingdocker2026

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

FeatureFreshRSSMinifluxTiny Tiny RSS
LicenseAGPL 3.0AGPL 3.0GPL 2.0
GitHub Stars~10K~6.3K~2.2K
LanguagePHPGoPHP
DatabaseSQLite/PostgreSQL/MySQLPostgreSQL onlyPostgreSQL
Web UIRichMinimalRich
Mobile appsVia API (Reeder etc.)Via APINative Android app
Google Reader APIYesYesNo
Fever APIYesNoYes
Full-text fetchYesYesYes (plugins)
Extensions100+NoYes
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:

  1. Export OPML from Feedly: Settings → Import & Export → Export OPML
  2. In FreshRSS: Subscription → Import / Export → OPML
  3. Upload your .opml file
  4. FreshRSS imports all feeds and categories, starts refreshing immediately

Add Individual Feeds

  1. Subscription → + Add a feed
  2. Paste a URL (article URL or RSS URL — FreshRSS auto-detects the feed)
  3. 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

  1. Settings → Authentication → Allow API access: On
  2. My Profile → API password — set a dedicated API password (different from web login)
  3. The API URL: https://rss.yourdomain.com/api/greader.php

App Configuration

Reeder 5 (iOS/macOS):

  1. Add account → FreshRSS or Fever
  2. URL: https://rss.yourdomain.com
  3. Username + API password

NetNewsWire (iOS/macOS):

  1. Add Account → FreshRSS
  2. URL: https://rss.yourdomain.com/api/greader.php
  3. Username + API password

Fluent Reader (Windows/Linux):

  1. Settings → Service → FreshRSS
  2. Endpoint: https://rss.yourdomain.com/api/greader.php

Fresca (Android):

  1. Account → FreshRSS
  2. 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

  1. Edit any feed → Advanced → Retrieve article content
  2. 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:

  1. Settings → Reading → Filters → + Add a filter
  2. Rule: If title contains "sponsored" → mark as read
  3. Or: If author = "Jane Doe" → label: "must-read"

Saved searches — turn any search into a virtual feed:

  1. Search: javascript
  2. 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.

Comments