Taking Control of Your News Feed
RSS never died – it just got buried under algorithmic feeds and social media noise. For anyone who wants to read content on their own terms, without a platform deciding what surfaces first, RSS aggregators remain the cleanest solution. FreshRSS is an open-source, self-hosted option that puts the entire system on your own server, your own hardware, and under your own rules.
Running FreshRSS yourself means no subscription fees, no third-party data collection, and no service shutdowns. The software is actively maintained, supports multi-user setups, and works with nearly every RSS client app through its API compatibility layer. If you already run a home server or a VPS, adding FreshRSS is a straightforward extension of an existing self-hosting practice.

What You Need Before You Start
FreshRSS runs on any Linux server with PHP 7.4 or higher, a web server like Apache or Nginx, and either MySQL, MariaDB, PostgreSQL, or SQLite as a database. For a single-user setup on a home network, SQLite works fine and removes the need to configure a separate database service. For multi-user or heavier use, MariaDB is the more stable choice.
You will also need a domain name or local hostname pointed at your server if you want to access FreshRSS from outside your home network. A reverse proxy setup through Nginx or Caddy handles HTTPS termination cleanly. Docker is also a supported deployment method and can simplify dependency management considerably, especially if you are already running other self-hosted containers. If you manage other self-hosted tools like Wallos for subscription tracking, the infrastructure overlap makes adding FreshRSS minimal extra work.
Installing FreshRSS
The manual installation path starts with cloning the FreshRSS repository directly from GitHub. Navigate to your web server’s document root – typically /var/www/html on Debian-based systems – and run git clone https://github.com/FreshRSS/FreshRSS.git. This pulls the latest stable version. After cloning, set the correct file permissions so your web server user (usually www-data on Debian/Ubuntu) can read and write to the necessary directories.
For Docker users, the official FreshRSS image is available on Docker Hub. A minimal docker-compose.yml file needs only the image reference, a port mapping, and two volume mounts: one for the data directory and one for extensions. Set the environment variables for your timezone and the base URL of your instance, then run docker compose up -d. The container starts within seconds, and the web installer handles the rest.
Once the files are in place, visit your server’s address in a browser. The web-based setup wizard walks through database selection, admin account creation, and base URL configuration. SQLite requires no additional credentials – you just pick it from the dropdown. MariaDB requires the host, database name, username, and password you created beforehand. The installer validates the connection before proceeding, so misconfigured credentials are caught immediately rather than buried in logs later.
Configuring Your Instance

After installation, the admin panel is where most of the meaningful configuration happens. Under Administration > System configuration, you can set the default refresh interval for feeds. FreshRSS refreshes feeds on a cron job schedule, which you configure separately on the host system. The recommended cron entry runs the refresh script every 15 to 30 minutes depending on how current you want your feeds. On a VPS with minimal other load, 15-minute intervals are perfectly comfortable.
Feed organization in FreshRSS uses categories, and planning your category structure before adding dozens of feeds saves significant reorganization later. The interface lets you import OPML files, which is the standard export format from nearly every other RSS reader. If you are migrating from Feedly, Inoreader, or any similar service, export your subscriptions as OPML and import directly into FreshRSS through Subscription management > Import/Export. The process handles hundreds of feeds in a single import without issue.
FreshRSS supports two API modes: the Google Reader API (used by apps like Reeder, FeedMe, and ReadKit) and the Fever API. Both are enabled from the Authentication settings panel. The Google Reader API requires generating an API password separate from your login password – this is a deliberate security separation so your main credentials are never transmitted through third-party apps. Once enabled, configure your RSS client app by pointing it at https://yourdomain.com/api/greader.php with your username and the generated API password.
The reading experience inside FreshRSS itself is faster than most people expect from a self-hosted tool. The interface loads quickly, keyboard shortcuts cover navigation, marking as read, and starring articles, and the built-in search indexes article content rather than just titles. A filter system lets you create persistent views based on tags, read status, or specific feeds. For heavy readers managing several hundred subscriptions, the label and tag system is what separates FreshRSS from simpler aggregators – articles can be tagged automatically using rules, or manually as you browse.

Extensions add capabilities the core install intentionally omits. The FreshRSS extension library includes tools for full-article fetching when feeds only publish truncated content, custom CSS themes, integration with read-later services, and feed-specific parsing adjustments. Extensions live in the ./extensions directory and are activated from the admin panel. The xExtension-FullTextRss extension is worth installing early – it pulls the full text of articles from sites that publish summary-only feeds, which accounts for a frustrating number of major news outlets.
One configuration detail that catches new users: FreshRSS does not refresh feeds automatically unless the cron job is properly set up on the host. The web installer does not configure cron for you. On a standard Linux server, the required line for the system crontab is /15 * www-data php /var/www/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1. Without this, feeds only update when you manually trigger a refresh from the interface. It is a small setup step that gets skipped often enough that the FreshRSS documentation flags it explicitly – and still, forum questions about stale feeds come down to this missing cron entry more often than anything else.





