kryoseu/WyrmRSS

A self-hosted RSS reader and aggregator for web and mobile, also available as a desktop app.

Rust

65

394 commits

updated Oct 15, 2026

See the code

See what people are saying

SourceMessageScoreDate

WyrmRSS 0.27: self-hosted RSS reader, now with a mobile UI and a live demo (r/selfhosted)

I've been building WyrmRSS for 5 months now, a free and open-source (GPL-3.0) self-hosted RSS/Atom reader (Rust backend, React frontend, Postgres). Since the last release it has a proper mobile UI now. You can install it as a PWA on your phone, so the same instance works on desktop and mobile. Live…

7

Oct 14, 2026

README

A self-hosted RSS reader and aggregator, also available as a desktop app.

Features

  • Subscribe to RSS and Atom feeds
  • Feed discovery — paste a blog homepage or YouTube channel URL and Wyrm finds the feed for you
  • YouTube channel support — subscribe to any channel and watch videos inline without leaving the reader
  • Browse posts per feed or across all feeds
  • Per-feed display modes — River (home feed), Feed only (posts only shown on Feed directly), or Radar (quiet, visit when nothing else going on)
  • Group feeds into folders — collapsible sidebar sections with unread counts, preserved across OPML import/export
  • Filters per feed — exclude entries matching a pattern, scoped to URL, title or content
  • Save posts to Read Later
  • Archive posts
  • Webhooks - get notified on new posts (Discord, Slack and custom)
  • OPML import and export
  • Background feed polling with configurable interval and retry logic
  • Full-text search on post titles and description
  • Hot-reloaded settings (poll interval, HTTP timeouts, page size, reading mode) configurable via the UI
  • Easy to install

Installation

Docker compose and Kubernetes manifests are provided for an easy self-hosted install. A native desktop app is also available, with no server or database to set up. You may also build it from source.

Desktop app

See desktop.md for macOS, Windows and Linux downloads.

With Docker

See docker.md for Docker Compose setup.

With Kubernetes

See kubernetes.yaml for Kubernetes manifests.

From source

See source.md to build from the source code.

Configuration

Startup configuration

Startup settings can be configured via environment variables (prefixed WYRM_) or config/wyrm.toml.

VariableDefaultDescription
WYRM_BIND0.0.0.0IP address to bind to
WYRM_PORT3001Port to listen on
WYRM_DATABASE_CONNECTIONpostgres://wyrm:wyrm@localhost/wyrmPostgreSQL connection URI
WYRM_DATABASE_POOL_SIZE30Max database connection pool size
WYRM_API_KEY(none)API key required by clients; unset means the API is open and any key is accepted

[!NOTE] Setting WYRM_API_KEY on the backend is enough to restrict access. Setting it on the frontend too skips the in-app key prompt. If left unset on the backend, the API is open and any key entered in the prompt will be accepted.

Runtime settings

The following settings are stored in the database and can be changed at runtime via the Settings page without restarting the server.

SettingDefaultDescription
Page size100Feed entries returned per page
Feed poll interval900Seconds between automatic feed polls
HTTP timeout30Response timeout in seconds
HTTP connect timeout10Connection timeout in seconds
HTTP retries3Max retries for failed feed fetches
HTTP user agentwyrm-rss/<version>User agent sent with feed requests

Frontend

VariableDefaultDescription
WYRM_BACKEND_URLhttp://localhost:3001Backend URL, must match where the backend is running
WYRM_API_KEY(none)Bake an API key into the frontend build, skipping the key prompt entirely

YouTube

Wyrm treats YouTube channels as regular RSS feeds. Add a channel using its feed URL:

https://www.youtube.com/feeds/videos.xml?channel_id=CHANNEL_ID

The reader detects YouTube links and renders an embedded player in place of the article body.

Filtering content

Use filters to exclude entries you don't want from a feed. Each filter is a case-insensitive substring pattern, optionally scoped to a field with a url:, title: or content: prefix; an unprefixed pattern matches any of them. content: matches both the entry's summary and body.

Example, for YouTube you may want to exclude:

FilterExcludes
url:/shortsYouTube Shorts
url:/liveLive streams
title:trailerEntries with "trailer" in the title

Filters are per-feed, so url:/shorts drops any entry from that feed whose URL contains /shorts.

Stack

LayerTechnology
BackendRust, Actix-web, Diesel, Tokio
DatabasePostgreSQL (self-hosted) / SQLite (desktop app)
FrontendReact, Vite, React Router v7, TanStack Query
DesktopTauri

Star History

Star History Chart

License

GPL v3 — see LICENSE.

Credits

Logo by Pedro Niels.

kryoseu/WyrmRSS

A self-hosted RSS reader and aggregator for web and mobile, also available as a desktop app.

Rust

65

394 commits

updated Oct 15, 2026

See the code

See what people are saying

SourceMessageScoreDate

WyrmRSS 0.27: self-hosted RSS reader, now with a mobile UI and a live demo (r/selfhosted)

I've been building WyrmRSS for 5 months now, a free and open-source (GPL-3.0) self-hosted RSS/Atom reader (Rust backend, React frontend, Postgres). Since the last release it has a proper mobile UI now. You can install it as a PWA on your phone, so the same instance works on desktop and mobile. Live…

7

Oct 14, 2026

README

A self-hosted RSS reader and aggregator, also available as a desktop app.

Features

  • Subscribe to RSS and Atom feeds
  • Feed discovery — paste a blog homepage or YouTube channel URL and Wyrm finds the feed for you
  • YouTube channel support — subscribe to any channel and watch videos inline without leaving the reader
  • Browse posts per feed or across all feeds
  • Per-feed display modes — River (home feed), Feed only (posts only shown on Feed directly), or Radar (quiet, visit when nothing else going on)
  • Group feeds into folders — collapsible sidebar sections with unread counts, preserved across OPML import/export
  • Filters per feed — exclude entries matching a pattern, scoped to URL, title or content
  • Save posts to Read Later
  • Archive posts
  • Webhooks - get notified on new posts (Discord, Slack and custom)
  • OPML import and export
  • Background feed polling with configurable interval and retry logic
  • Full-text search on post titles and description
  • Hot-reloaded settings (poll interval, HTTP timeouts, page size, reading mode) configurable via the UI
  • Easy to install

Installation

Docker compose and Kubernetes manifests are provided for an easy self-hosted install. A native desktop app is also available, with no server or database to set up. You may also build it from source.

Desktop app

See desktop.md for macOS, Windows and Linux downloads.

With Docker

See docker.md for Docker Compose setup.

With Kubernetes

See kubernetes.yaml for Kubernetes manifests.

From source

See source.md to build from the source code.

Configuration

Startup configuration

Startup settings can be configured via environment variables (prefixed WYRM_) or config/wyrm.toml.

VariableDefaultDescription
WYRM_BIND0.0.0.0IP address to bind to
WYRM_PORT3001Port to listen on
WYRM_DATABASE_CONNECTIONpostgres://wyrm:wyrm@localhost/wyrmPostgreSQL connection URI
WYRM_DATABASE_POOL_SIZE30Max database connection pool size
WYRM_API_KEY(none)API key required by clients; unset means the API is open and any key is accepted

[!NOTE] Setting WYRM_API_KEY on the backend is enough to restrict access. Setting it on the frontend too skips the in-app key prompt. If left unset on the backend, the API is open and any key entered in the prompt will be accepted.

Runtime settings

The following settings are stored in the database and can be changed at runtime via the Settings page without restarting the server.

SettingDefaultDescription
Page size100Feed entries returned per page
Feed poll interval900Seconds between automatic feed polls
HTTP timeout30Response timeout in seconds
HTTP connect timeout10Connection timeout in seconds
HTTP retries3Max retries for failed feed fetches
HTTP user agentwyrm-rss/<version>User agent sent with feed requests

Frontend

VariableDefaultDescription
WYRM_BACKEND_URLhttp://localhost:3001Backend URL, must match where the backend is running
WYRM_API_KEY(none)Bake an API key into the frontend build, skipping the key prompt entirely

YouTube

Wyrm treats YouTube channels as regular RSS feeds. Add a channel using its feed URL:

https://www.youtube.com/feeds/videos.xml?channel_id=CHANNEL_ID

The reader detects YouTube links and renders an embedded player in place of the article body.

Filtering content

Use filters to exclude entries you don't want from a feed. Each filter is a case-insensitive substring pattern, optionally scoped to a field with a url:, title: or content: prefix; an unprefixed pattern matches any of them. content: matches both the entry's summary and body.

Example, for YouTube you may want to exclude:

FilterExcludes
url:/shortsYouTube Shorts
url:/liveLive streams
title:trailerEntries with "trailer" in the title

Filters are per-feed, so url:/shorts drops any entry from that feed whose URL contains /shorts.

Stack

LayerTechnology
BackendRust, Actix-web, Diesel, Tokio
DatabasePostgreSQL (self-hosted) / SQLite (desktop app)
FrontendReact, Vite, React Router v7, TanStack Query
DesktopTauri

Star History

Star History Chart

License

GPL v3 — see LICENSE.

Credits

Logo by Pedro Niels.

Significant stargazers

Rob Ede

903 followers · starred Oct 2026

Romain Gautier

222 followers · starred Jul 2026

Dan Lock

7 followers · starred Aug 2026