FriRSS

FriRSS

apps.detail.types.app from Fripix's Repository

apps.detail.sections.overview

FriRSS is a modern, self-hosted, customizable web frontend for FreshRSS. It provides a desktop interface and mobile PWA, full-text extraction, offline reading, multiple languages, themes and extensive interface customization.
FriRSS

FriRSS

Your FriRSS, your rules.

A self-hosted, customizable web frontend for FreshRSS.

Français  English  Deutsch  Español  Italiano  Português  Nederlands  Polski  Українська

License: MIT CI Docker image

FriRSS on desktop
FriRSS as a PWA on a phone    FriRSS on a tablet

About

FreshRSS has an excellent engine: solid, self-hosted, great at fetching and storing feeds. Its built-in interface just wasn't for me, and none of the alternatives fit what I wanted — so I built my own. FriRSS sits on top of FreshRSS through its Google Reader API and replaces only the interface.

A note in the interest of honesty: this is a personal project and I'm not a developer. FriRSS was built largely by "vibe coding" — describing what I wanted to an AI assistant and iterating. Use it in that spirit.

Features

Reading

  • Three-pane reader on desktop; an installable PWA on mobile with swipe navigation, swipe actions and pull-to-refresh.
  • Full-text extraction (Readability) when a feed only ships a summary, cached so re-reads are instant.
  • Offline reading (installable PWA): articles — text and images — stay readable without a connection. Favorites and read-later are kept offline automatically, plus a one-tap Prepare offline sweep (last 30 days, all feeds) and optional auto-refresh on open.
  • Favorites, read-later, mark read/unread, filters (all / unread / favorites) — the unread-only filter is remembered per feed — search and infinite scroll.
  • Resume where you left off: your last feed and filter are restored on reopen, with an unobtrusive offline / back-online indicator.

Make it yours

Almost everything is yours to tweak:

  • Themes — full control over every color and font; create, save, export and import your own themes.
  • Element colors — recolor the sidebar, accents, panels, links, article text and more, individually.
  • Font sizes — independent sizes for article titles, summaries, source names and the reading body.
  • Layout — resizable columns, density and spacing options, date separators, toggles for the source label and top bar, and a desktop/mobile layout switch on tablets. Collapsed sidebar sections (labels and categories) are remembered, and feeds with no unread can be hidden to declutter large lists.
  • Labels & sub-labels — a nestable tagging system: create, rename, color, drag-and-drop to organize, group under parents, with per-label article counts.
  • Branding — set your own app name and logo.
  • 9 languages — FR · EN · DE · ES · IT · PT · NL · PL · UK; the interface follows your browser language on first run.

Accounts, SSO & multi-server

  • Multi-user with admin/user roles — each person keeps their own feeds and settings.
  • Single sign-on via OIDC (tested with Authentik); existing accounts are linked by email, and passkeys work through your provider.
  • Multi-server — connect several FreshRSS instances and switch between them.

Self-hosting

  • Optional Redis cache (stale-while-revalidate) and a background pre-fetch worker for instant loads.
  • FreshRSS tokens encrypted at rest; same-origin proxy (no CORS) with an anti-SSRF guard.
  • Ships as a single Docker image (nginx + Node) with SQLite storage, built for amd64 and arm64 (Raspberry Pi, 64-bit OS).

Installation

FriRSS is a frontend for FreshRSS, so you need a running FreshRSS instance with the Google Reader API enabled (Settings → Authentication → Allow API access).

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

($PWD is your current directory, so the database is stored in a frirss-data folder right where you run the command — back it up and you back up everything.)

Open http://localhost:8080, create the first account (it becomes admin), then connect your FreshRSS server: its URL, your FreshRSS username, and the API password (set in FreshRSS → Settings → Profile).

Prefer Compose? A ready-to-edit docker-compose.yml is included. The first launch generates the JWT secret and the token-encryption key and stores them in the SQLite database, so backing up the data volume backs up everything.

Configuration

Variable Description Default
FRIRSS_BASE_URL Public base URL — recommended behind a reverse proxy; fixes OIDC redirect URIs derived
FRIRSS_DATA_DIR SQLite database directory /app/data
PROXY_REWRITES public→internal URL rewrites for the backend proxy (from=to, comma-separated)
PROXY_INTERNAL_HOSTS Anti-SSRF allowlist: internal hosts the proxy may reach directly
REDIS_URL Enables the read cache (stale-while-revalidate); empty disables it
CACHE_ARTICLES_PER_FEED Articles kept per feed in the cache 50
CACHE_TTL Cache key expiry, in seconds 86400
CACHE_SYNC_INTERVAL Background pre-fetch interval in minutes (0 disables; needs REDIS_URL) 0
CORS_ORIGIN Allowed CORS origin(s) — only for split front/back deployments

Single sign-on is configured at runtime in Preferences → Admin → SSO (issuer, client ID, client secret).

License

MIT

apps.marketingCta.appInstallTitle

apps.marketingCta.appInstallDescription

apps.installHelp.stepOpen apps.installHelp.stepSearchApp apps.installHelp.stepReview apps.installHelp.stepInstall

apps.detail.sections.requirements

A running FreshRSS instance is required.

apps.detail.sections.categories

apps.detail.sections.related

apps.detail.related.exploreCategories

apps.detail.related.exploreAll

apps.detail.sections.details

apps.detail.details.repository
ghcr.io/fripix/frirss:latest
apps.detail.details.lastUpdated2026-08-10
apps.detail.details.firstSeen2026-08-10

apps.detail.sections.runtime

apps.detail.details.webui
http://[IP]:[PORT:80]
apps.detail.details.network
bridge
apps.detail.details.shell
sh
apps.detail.details.privileged
false

apps.detail.sections.configuration

WebUI PortPorttcp

Port used to access the FriRSS web interface.

apps.detail.config.target
80
apps.detail.config.default
8787
apps.detail.config.value
8787
App DataPathrw

Persistent FriRSS data, including the SQLite database.

apps.detail.config.target
/app/data
apps.detail.config.default
/mnt/user/appdata/frirss
apps.detail.config.value
/mnt/user/appdata/frirss
NODE_ENVVariable

Node.js environment.

apps.detail.config.default
production
apps.detail.config.value
production
FRIRSS_DATA_DIRVariable

Internal FriRSS data directory.

apps.detail.config.default
/app/data
apps.detail.config.value
/app/data
TimezoneVariable

Container timezone, for example Europe/Zurich.

apps.detail.config.target
TZ
apps.detail.config.default
Europe/Zurich
apps.detail.config.value
Europe/Zurich
Base URLVariable

Public URL of your FriRSS instance, for example https://rss.example.com.

apps.detail.config.target
FRIRSS_BASE_URL
Redis URLVariable

Optional Redis connection URL for shared caching.

apps.detail.config.target
REDIS_URL
Cache Sync IntervalVariable

Redis cache synchronization interval.

apps.detail.config.target
CACHE_SYNC_INTERVAL
apps.detail.config.default
15
apps.detail.config.value
15
Proxy RewritesVariable

Optional proxy rewrite configuration.

apps.detail.config.target
PROXY_REWRITES