Self-hosted RSS feed reader with full-text article retrieval. Running on Proxmox CT 100 (docker-host).
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 |
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 |
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:
- FreshRSS fetches a feed and finds new articles (every 30 min via cron)
- For each new article in an enabled category, the extension makes an HTTP request to the article’s original URL
- Readability.php extracts the main article content, stripping navigation, ads, and other clutter
- 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.
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.
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
| 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.
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.