Install FriRSS
on your server

Prepare FreshRSS, install FriRSS, then connect the two. Follow this guide to your first read.

  • Docker, Compose or Unraid
  • amd64 and arm64
  • Free and open source
Official documentation

00First, you need FreshRSS.

FriRSS displays articles from your FreshRSS instance. Before you start, prepare these three things.

  1. An accessible FreshRSS instance

    Keep its address and your username handy.

  2. API access enabled

    In FreshRSS: Settings → Authentication → Allow API access.

  3. An API password

    Set it in FreshRSS under Settings → Profile. You will use it to connect FriRSS.

Discover FreshRSS

01Choose your installation

Choose your method. Creating your account and connecting FreshRSS work the same way afterwards.

Docker

Run the official image. Port 8080 on your host maps to port 80 in the container; /app/data stores the database and encryption keys.

Docker
mkdir -p frirss-data
docker run -d --name frirss \
  --restart unless-stopped \
  -p 8080:80 \
  -v "$PWD/frirss-data:/app/data" \
  -e TZ=Europe/Zurich \
  ghcr.io/fripix/frirss:latest

Also available on Docker Hub as fripix/frirss. Official images support amd64 and arm64.

Docker Compose

Save this as compose.yaml in an empty directory, then run the commands below. Keep the frirss-data directory: it holds your instance data.

compose.yaml
services:
  frirss:
    image: ghcr.io/fripix/frirss:latest
    container_name: frirss
    ports:
      - "8080:80"
    volumes:
      - ./frirss-data:/app/data
    restart: unless-stopped
    environment:
      TZ: Europe/Zurich
      # Optional: remove the # in front of a line to turn it on (see the table).

      # Start
      # PUID: "1000"
      # PGID: "1000"

      # Network
      # FRIRSS_BASE_URL: https://frirss.example.com
      # PROXY_INTERNAL_HOSTS: 192.168.1.20
      # PROXY_REWRITES: https://rss.example.com=http://freshrss:80
      # CORS_ORIGIN: https://frirss.example.com

      # Redis cache, strongly recommended
      # REDIS_URL: redis://redis:6379
      # CACHE_ARTICLES_PER_FEED: "50"
      # CACHE_TTL: "86400"
      # CACHE_SYNC_INTERVAL: "0"
      # CACHE_SYNC_ACTIVE_DAYS: "7"
      # CACHE_SYNC_PARALLEL_USERS: "3"

      # Limits and storage
      # FRIRSS_REFRESH_MAX_FEEDS: "1000"
      # FRIRSS_PROXY_RATE_LIMIT: "600"
      # FRIRSS_DATA_DIR: /app/data
Docker Compose
mkdir -p frirss-data
docker compose up -d

Unraid

Open the Apps tab in Unraid Community Applications, search for FriRSS and install its template. Check the host port and persistent /app/data mapping before starting.

Open Community Applications

Environment variables

All are optional except TZ, already set. In compose.yaml, remove the # in front of a line to turn it on; with docker run, add ‑e NAME=value before the image name. Then recreate the container.

VariableWhat it doesDefault
Start
TZThe container’s time zone, for dates and logs. Example: Europe/London.—
PUID, PGIDUser and group FriRSS runs as. The data folder is taken over in their name on start.1000
Network
FRIRSS_BASE_URLFriRSS’s public address. Recommended behind a reverse proxy; also fixes the single sign-on (OIDC) redirect addresses.Taken from the request
PROXY_INTERNAL_HOSTSPrivate hosts FriRSS may reach, comma-separated. Needed when FreshRSS sits on your local network or a Docker network.None
PROXY_REWRITESReach FreshRSS over the internal network instead of its public address: public address=internal address, comma-separated.None
CORS_ORIGINAllowed origins, only when the interface and the server are served separately.None
Redis cache, strongly recommended
REDIS_URLTurns the cache on: lists shown at once, background pre-fetch, extracted articles and AI results shared by the whole instance.Off
CACHE_ARTICLES_PER_FEEDArticles kept in the cache per feed.50
CACHE_TTLLifetime of a cache entry, in seconds.86400 (one day)
CACHE_SYNC_INTERVALBackground pre-fetch, every N minutes. 0 turns it off; needs REDIS_URL.0
CACHE_SYNC_ACTIVE_DAYSOnly pre-fetches for accounts seen in the last N days.7
CACHE_SYNC_PARALLEL_USERSAccounts pre-fetched at once.3
Limits and storage
FRIRSS_REFRESH_MAX_FEEDSFeeds refreshed on each click on Refresh.1000
FRIRSS_PROXY_RATE_LIMITRequests per account per minute, one budget shared by the proxy, article extraction and AI. 0 removes the limit.600
FRIRSS_DATA_DIRSQLite database folder, inside the container./app/data

02Create your FriRSS account

Once the container is running, open this address on the Docker host, or use that host’s address from another device. Create the first FriRSS account immediately: it becomes the administrator. Registration then closes and can be reopened in Preferences → Administration.

Local address after startup
http://localhost:8080

03Connect FreshRSS to FriRSS

This time, use your FreshRSS credentials. They are separate from the FriRSS account you just created.

FreshRSS address
The URL of your instance, for example https://rss.example.com.
FreshRSS username
The account whose subscriptions you want to read.
API password
The password set in your FreshRSS profile during preparation.
FreshRSS on a private network?

The proxy blocks private addresses by default. Explicitly allow your FreshRSS hostname or IP with PROXY_INTERNAL_HOSTS. Replace the example address with your actual host; do not disable the protection globally.

PROXY_INTERNAL_HOSTS
PROXY_INTERNAL_HOSTS=192.168.1.20

Docker: add -e PROXY_INTERNAL_HOSTS=192.168.1.20 before the image name. Compose: remove the # in front of the PROXY_INTERNAL_HOSTS line and replace the address with your FreshRSS’s. Recreate the container after changing it.

Your feeds are ready to read.Choose your layout, your theme and your first article. You can fine-tune the rest as you go.

04Grow your installation

FriRSS works with its built-in SQLite database. Redis is an optional addition for faster reading and shared caching across devices.

SQLiteSQLite comes with FriRSS

Accounts, preferences and configuration live in the built-in database. Back up your FriRSS data: no additional database service is required.

RedisRecommended, optionalFor FriRSS

A shared cache for article lists, extracted articles and AI results. It avoids repeating the same work for each device or user.

A useful addition for faster repeat visits. FriRSS also works without Redis.

Connect your Redis service with REDIS_URL. Background prefetching is enabled separately with CACHE_SYNC_INTERVAL, which requires Redis.

Configure Redis

05Privacy and security

FriRSS runs on your server and keeps only what it needs. Here is what it stores, where, and what leaves your installation.

On your server

  • A single SQLite database, in /app/data: accounts, synced preferences and instance settings.
  • Passwords are hashed with bcrypt.
  • Your FreshRSS API password is never saved: FriRSS keeps only the login token, encrypted with AES-256-GCM, and never sends it to the browser.
  • Your articles stay in FreshRSS. Without Redis, the text of extracted articles is not kept.

In your browser

  • The session, the preferences that belong to this screen and the feeds’ icons.
  • Articles and images prepared for offline reading, which you can clear at any time.

What leaves your installation

  • To your FreshRSS server: always, that is what FriRSS is for.
  • To the articles’ websites: only if full articles are turned on. They are off by default.
  • To an AI provider: only if the administrator turns it on. The article’s title and text are sent to it.
  • To your single sign-on (SSO) provider: only if the administrator turns it on.
  • Article images are loaded by the browser from their own site, as in any RSS reader.

No telemetry

FriRSS has no analytics, no crash reporting and no update check: it contacts no server of its author.

The key that encrypts the tokens is kept in the same database. Protect and back up the /app/data folder like a password.

Read the security policy

A few things for a lasting setup

Keep your data

Back up /app/data using the official SQLite snapshot procedure or encrypted export. Copying only a live frirss.db file is not a reliable backup.

Give it HTTPS

For remote access, use an HTTPS reverse proxy; do not expose the container port directly to the internet. For AI translations, allow read and send timeouts of at least 120 seconds.

Update deliberately

Read the release notes, back up your data, then pull the new image and recreate the container. The official README remains the reference for evolving configuration.

Full installation and configuration guide

The official README remains the reference if an option or a command changes.