FreshRSS
Free, self-hostable RSS feed aggregator
FreshRSS is a free, self-hostable RSS and Atom feed aggregator that is fast, lightweight, and highly customizable. It targets users who want full control over their news reading. It is deployed via Docker or a PHP stack.
FreshRSS setup guides & articles
Hands-on coverage of FreshRSS from the blog.
Key features
- Fast feed aggregation
- Multi-user support
- Mobile app API compatibility
- Extensions and themes
Quick deploy
A starting point for self-hosting FreshRSS - check the official docs for the full set of options.
- Image
freshrss/freshrss:latest - Web port
80 - Persist
/var/www/FreshRSS/data/var/www/FreshRSS/extensions
Docker Compose
services:
freshrss:
image: freshrss/freshrss:latest
ports:
- "80:80"
environment:
- CRON_MIN=13,43
volumes:
- ./data:/var/www/FreshRSS/data
- ./extensions:/var/www/FreshRSS/extensions
restart: unless-stoppeddocker run
docker run -d --name freshrss \
-p 80:80 \
-e CRON_MIN=13,43 \
-v ./data:/var/www/FreshRSS/data \
-v ./extensions:/var/www/FreshRSS/extensions \
--restart unless-stopped \
freshrss/freshrss:latestWatch out for
- Without CRON_MIN set, feeds never refresh on their own
Pros & cons
Strengths
- Lightweight and fast
- Works with many mobile apps
- Actively maintained
Trade-offs
- Requires a database
- Interface is functional, not flashy
FreshRSS replaces
Last reviewed Aug 26, 2026 · 852 words
Set CRON_MIN in the FreshRSS container or your feeds will never update on their own. That is the single support question the project answers most often, and it is the reason a working-looking install goes quiet 2 days later. With the variable set, FreshRSS is the most complete self-hosted RSS reader available: multi-user, a thousand feeds on 256 MB of RAM, an API that every serious mobile client speaks, and a PHP codebase that has been actively maintained since 2013 under the AGPL-3.0.
The container that refreshes itself
services:
freshrss:
image: freshrss/freshrss:latest
environment:
- TZ=Europe/London
- CRON_MIN=13,43
volumes:
- ./data:/var/www/FreshRSS/data
- ./extensions:/var/www/FreshRSS/extensions
ports:
- "8080:80"
restart: unless-stopped
CRON_MIN=13,43 runs the refresh at minute 13 and 43 of every hour inside the container, using the image's built-in cron. Pick odd minutes rather than 0 and 30; feed servers get hammered on the hour and you will see more timeouts. The data volume holds the SQLite database, the per-user config, and the favicon cache; back it up and you have everything. Behind a reverse proxy, set base_url in the web settings (or in data/config.php) to the public HTTPS address, because the API endpoints build their responses from it.
SQLite is fine until about 100,000 articles
The catalogue lists "requires a database" as a downside, but the default is an embedded SQLite file and for a single user with a couple of hundred feeds it is the right choice: zero extra containers, one file to back up. FreshRSS also supports MySQL/MariaDB and PostgreSQL, and I would switch once the article count runs into six figures or there are 3 or more active users, because full-text search over a large SQLite table gets slow and purging old articles becomes a noticeable pause. You choose the backend in the installer on first load; changing later means exporting OPML and starred items, so decide up front. Per-feed article retention (keep 50, keep unread, keep starred) is what keeps the database size stable, and the default of 50 per feed is sensible.
Enable the API before installing a mobile app
FreshRSS speaks two client protocols: the Google Reader API and the Fever API. They are off until you flip them on under Administration, Authentication, "Allow API access", and then each user sets a separate API password in their profile. The Google Reader API is the one to use; it carries read and starred state properly and the clients are better. NetNewsWire on Mac and iOS, Reeder, Fluent Reader on desktop, and FeedMe and Capy Reader on Android all connect by pointing at https://rss.example.com/api/greader.php with your username and that API password. If a client refuses to log in, the cause is almost always a wrong base_url or a reverse proxy stripping the Authorization header.
Full-text scraping rescues truncated feeds
Publishers who ship a 2-sentence excerpt as their feed are the main reason people give up on RSS, and FreshRSS handles it natively. In a feed's settings, "Article CSS selector on original website" takes a selector like article.post-content, and on each refresh FreshRSS fetches the page and swaps the excerpt for the matched HTML. It works on most blogs and news sites, and for sites with no feed at all the same screen accepts XPath scraping of an HTML page to synthesise one. For the harder cases (social platforms, YouTube channels) RSS-Bridge generates feeds FreshRSS can subscribe to. Star an article and a Wallabag sharing target sends it to your read-later queue with one click.
Where it loses to Miniflux, and where it does not
Miniflux is the other reader people shortlist. It is Go, PostgreSQL only, deliberately feature-light, and its interface is calmer. FreshRSS wins on multi-user, on extensions and themes, on scraping, and on running without a separate database. It loses on visual polish: the catalogue's "functional, not flashy" is accurate, and the default theme looks like 2015 until you install one of the community themes. If you only ever read on a phone through a client app, the web UI barely matters and FreshRSS's better API support decides it. My full head-to-head is at FreshRSS vs Miniflux, and the case for bothering with a reader at all is in RSS isn't dead.
What I'd do
The Compose file above, SQLite, CRON_MIN set on day one, behind Caddy with base_url matching. Turn on the Google Reader API immediately, install NetNewsWire or Capy Reader, and set every feed to keep 50 articles. Add CSS selectors to the 5 or 10 excerpt-only feeds you care about rather than unsubscribing from them. Revisit PostgreSQL only if you add family members or your archive crosses 100,000 items. For a Feedly refugee with fewer than 300 feeds this is a 15-minute job that stays done.
Compare FreshRSS
30 head-to-head comparisons.
- FreshRSS vs RSSHub
- FreshRSS vs Miniflux
- FreshRSS vs Fluent Reader
- FreshRSS vs RSS-Bridge
- FreshRSS vs Winds
- FreshRSS vs NewsBlur
- FreshRSS vs Stringer
- FreshRSS vs yarr
- FreshRSS vs Newsboat
- FreshRSS vs Feedbin
- FreshRSS vs CommaFeed
- FreshRSS vs Kill the Newsletter
- FreshRSS vs Feeder
- FreshRSS vs Tiny Tiny RSS
- FreshRSS vs RSS Guard
- FreshRSS vs selfoss
- FreshRSS vs Fusion
- FreshRSS vs RSS-proxy
- FreshRSS vs QuiteRSS
- FreshRSS vs Nextcloud News
- FreshRSS vs osmos::feed
- FreshRSS vs Liferea
- FreshRSS vs FeedHQ
- FreshRSS vs Reader by lemon24
- FreshRSS vs RSS aggregator nono KrISS feed
- FreshRSS vs RSS reader nono Leed
- FreshRSS vs Feed dashboard nono Reader-self
- FreshRSS vs Coldsweat
- FreshRSS vs Newspipe
- FreshRSS vs Yarrharr
Similar rss & news readers apps
RSSHub
RSS & News ReadersGenerate RSS feeds for sites that lack them
Replaces Feedly
Miniflux
RSS & News ReadersMinimalist and opinionated RSS feed reader
Replaces Feedly, Inoreader
Fluent Reader
RSS & News ReadersModern desktop RSS reader with a fluent design
Replaces Feedly
RSS-Bridge
RSS & News ReadersGenerate RSS feeds for websites that lack them
Replaces Feedly
Winds
RSS & News ReadersBeautiful open-source RSS and podcast application
Replaces Feedly
NewsBlur
RSS & News ReadersPersonal news reader with training and sharing
Replaces Feedly, Google Reader