FreshRSS

Self-hosted RSS feed reader with full-text article retrieval. Running on Proxmox CT 100 (docker-host).

Overview

FreshRSS aggregates RSS/Atom feeds into a single web-based reader. The instance runs as a Docker container on CT 100 alongside a Readability service for full-text content extraction. Feeds are checked every 30 minutes via built-in cron.

Setting Value
URL http://192.168.8.100:8180
Host CT 100 (192.168.8.100)
Image freshrss/freshrss:latest
Port 8180 โ†’ 80
Timezone America/New_York
Cron Minutes 1 and 31 (every 30 min)
User delgross
Docker Compose

Compose file lives at /opt/freshrss/docker-compose.yml on CT 100. Both services share the freshrss_default network so FreshRSS can reach the Readability container by hostname.

services:
  freshrss:
    image: freshrss/freshrss:latest
    container_name: freshrss
    restart: unless-stopped
    ports:
      - "8180:80"
    volumes:
      - freshrss_data:/var/www/FreshRSS/data
      - freshrss_extensions:/var/www/FreshRSS/extensions
    environment:
      - TZ=America/New_York
      - CRON_MIN=1,31

  readability:
    image: phpdockerio/readability-js-server
    container_name: readability
    restart: unless-stopped

volumes:
  freshrss_data:
  freshrss_extensions:

Volumes:

Volume Container path Purpose
freshrss_data /var/www/FreshRSS/data User config, SQLite database, logs
freshrss_extensions /var/www/FreshRSS/extensions All installed extensions
Full-Text Retrieval

By default, many RSS feeds only include a truncated summary. FreshRSS uses the Article Full Text (Af_Readability) extension to fetch the complete article content from the original website when new articles arrive. This runs the Fivefilters Readability.php library directly inside the FreshRSS container โ€” no external service required.

How it works:

  1. FreshRSS fetches a feed and finds new articles (every 30 min via cron)
  2. For each new article in an enabled category, the extension makes an HTTP request to the article’s original URL
  3. Readability.php extracts the main article content, stripping navigation, ads, and other clutter
  4. The extracted full text replaces the truncated summary in FreshRSS

Configuration: All 5 categories are enabled for full-text extraction. The config is stored in /var/www/FreshRSS/data/users/delgross/config.php as:

'ext_af_readability_categories' => '{"1":true,"2":true,"3":true,"4":true,"5":true}',

Important notes:

  • Only applies to new articles fetched after the extension is enabled. Existing truncated articles are not retroactively updated.
  • Some websites rate-limit rapid requests. The extension fetches each article URL sequentially without delay, so high-volume feeds from a single site may occasionally have missing content.
  • To reprocess old articles for a feed: delete the feed’s articles in FreshRSS, then let the next cron cycle refetch them.
Readability Service (Backup)

A standalone readability-js-server container is also deployed alongside FreshRSS. This is used by the xExtension-Readable extension (installed but not currently active) and provides an alternative full-text extraction backend via a Node.js API.

Setting Value
Container readability
Image phpdockerio/readability-js-server
Internal URL http://readability:3000 (accessible from FreshRSS on same Docker network)
External port None (internal only)

This service is available if you want to switch from the built-in Readability.php library to the external readability-js parser. To activate: enable the Readable extension in FreshRSS settings, set the Readability Host to http://readability:3000, and select which feeds/categories to process.

Installed Extensions

Extensions are stored in the freshrss_extensions Docker volume (host path: /var/lib/docker/volumes/freshrss_freshrss_extensions/_data/).

Extension Status Description
Af_Readability โœ… Enabled Full-text article extraction using Fivefilters Readability.php โ€” no external service needed. Applied to all categories.
Clickable Links โœ… Enabled Makes URLs in article content clickable.
Title-Wrap โœ… Enabled Wraps long article titles in the feed list.
Readable Installed (not enabled) Alternative full-text extraction via external Readability/Mercury/FiveFilters services. Available as a backup โ€” uses the readability container.
ArticleSummary Installed (not enabled) AI-powered article summarization via OpenAI-compatible APIs.
Kagi Summarizer Installed (not enabled) Summarize articles using Kagi Universal Summarizer.
ThreePanesView Installed (not enabled) Three-column layout with article preview pane.
YouTube Video Feed Installed (not enabled) Displays YouTube videos inline in feeds.
User CSS Installed (not enabled) Custom CSS styling for the FreshRSS UI.

To install new extensions, clone or copy the extension folder into the extensions volume on CT 100:

cd /var/lib/docker/volumes/freshrss_freshrss_extensions/_data/
git clone https://github.com/<author>/<extension>.git
Feed Inventory
Category Feed
Bees Bee Culture Magazine
Gardening Regenerative Flower Farming Blog
Gardening The Spruce ยท Home Design Ideas and How Tos
Tech MakeUseOf
Uncategorized FreshRSS releases
Uncategorized New in Feedly
Woodworking Popular Woodworking

Total: 7 feeds across 5 categories.

Maintenance

Updating FreshRSS:

cd /opt/freshrss
docker compose pull
docker compose up -d

Backup: User data (config, database, extension settings) lives in the freshrss_data named volume. Back up /var/lib/docker/volumes/freshrss_freshrss_data/_data/ before major updates.

OPML export: FreshRSS supports OPML import/export from the web UI under Settings โ†’ Import/Export. Feed URLs remain clean (no rewriting) since full-text retrieval is handled by the extension, not URL manipulation.

Adding full-text to a new category: If you add a new category in FreshRSS, update the ext_af_readability_categories value in /var/www/FreshRSS/data/users/delgross/config.php (inside the container) to include the new category ID, or toggle it on from the extension’s configuration page in the FreshRSS web UI under Settings โ†’ Extensions โ†’ Article Full Text.