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
A self-hosted RSS reader and aggregator, also available as a desktop app.
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.
See desktop.md for macOS, Windows and Linux downloads.
See docker.md for Docker Compose setup.
See kubernetes.yaml for Kubernetes manifests.
See source.md to build from the source code.
Startup settings can be configured via environment variables (prefixed WYRM_) or config/wyrm.toml.
| Variable | Default | Description |
|---|---|---|
WYRM_BIND | 0.0.0.0 | IP address to bind to |
WYRM_PORT | 3001 | Port to listen on |
WYRM_DATABASE_CONNECTION | postgres://wyrm:wyrm@localhost/wyrm | PostgreSQL connection URI |
WYRM_DATABASE_POOL_SIZE | 30 | Max 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_KEYon 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.
The following settings are stored in the database and can be changed at runtime via the Settings page without restarting the server.
| Setting | Default | Description |
|---|---|---|
| Page size | 100 | Feed entries returned per page |
| Feed poll interval | 900 | Seconds between automatic feed polls |
| HTTP timeout | 30 | Response timeout in seconds |
| HTTP connect timeout | 10 | Connection timeout in seconds |
| HTTP retries | 3 | Max retries for failed feed fetches |
| HTTP user agent | wyrm-rss/<version> | User agent sent with feed requests |
| Variable | Default | Description |
|---|---|---|
WYRM_BACKEND_URL | http://localhost:3001 | Backend 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 |
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.
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:
| Filter | Excludes |
|---|---|
url:/shorts | YouTube Shorts |
url:/live | Live streams |
title:trailer | Entries with "trailer" in the title |
Filters are per-feed, so url:/shorts drops any entry from that feed whose
URL contains /shorts.
| Layer | Technology |
|---|---|
| Backend | Rust, Actix-web, Diesel, Tokio |
| Database | PostgreSQL (self-hosted) / SQLite (desktop app) |
| Frontend | React, Vite, React Router v7, TanStack Query |
| Desktop | Tauri |
GPL v3 — see LICENSE.
Logo by Pedro Niels.
903 followers · starred Oct 2026
222 followers · starred Jul 2026
7 followers · starred Aug 2026
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
A self-hosted RSS reader and aggregator, also available as a desktop app.
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.
See desktop.md for macOS, Windows and Linux downloads.
See docker.md for Docker Compose setup.
See kubernetes.yaml for Kubernetes manifests.
See source.md to build from the source code.
Startup settings can be configured via environment variables (prefixed WYRM_) or config/wyrm.toml.
| Variable | Default | Description |
|---|---|---|
WYRM_BIND | 0.0.0.0 | IP address to bind to |
WYRM_PORT | 3001 | Port to listen on |
WYRM_DATABASE_CONNECTION | postgres://wyrm:wyrm@localhost/wyrm | PostgreSQL connection URI |
WYRM_DATABASE_POOL_SIZE | 30 | Max 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_KEYon 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.
The following settings are stored in the database and can be changed at runtime via the Settings page without restarting the server.
| Setting | Default | Description |
|---|---|---|
| Page size | 100 | Feed entries returned per page |
| Feed poll interval | 900 | Seconds between automatic feed polls |
| HTTP timeout | 30 | Response timeout in seconds |
| HTTP connect timeout | 10 | Connection timeout in seconds |
| HTTP retries | 3 | Max retries for failed feed fetches |
| HTTP user agent | wyrm-rss/<version> | User agent sent with feed requests |
| Variable | Default | Description |
|---|---|---|
WYRM_BACKEND_URL | http://localhost:3001 | Backend 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 |
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.
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:
| Filter | Excludes |
|---|---|
url:/shorts | YouTube Shorts |
url:/live | Live streams |
title:trailer | Entries with "trailer" in the title |
Filters are per-feed, so url:/shorts drops any entry from that feed whose
URL contains /shorts.
| Layer | Technology |
|---|---|
| Backend | Rust, Actix-web, Diesel, Tokio |
| Database | PostgreSQL (self-hosted) / SQLite (desktop app) |
| Frontend | React, Vite, React Router v7, TanStack Query |
| Desktop | Tauri |
GPL v3 — see LICENSE.
Logo by Pedro Niels.
903 followers · starred Oct 2026
222 followers · starred Jul 2026
7 followers · starred Aug 2026