PHPackages                             rss-bridge/rss-bridge - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [CLI &amp; Console](/categories/cli)
4. /
5. rss-bridge/rss-bridge

ActiveProject[CLI &amp; Console](/categories/cli)

rss-bridge/rss-bridge
=====================

RSS-Bridge is a PHP project capable of generating RSS and Atom feeds for websites that don't have one. It can be used on webservers or as a stand-alone application in CLI mode.

2025-08-05(9mo ago)8.8k6311.2k[231 issues](https://github.com/RSS-Bridge/rss-bridge/issues)[29 PRs](https://github.com/RSS-Bridge/rss-bridge/pulls)UNLICENSEPHPPHP &gt;=7.4CI passing

Since Jun 8Pushed 1mo ago114 watchersCompare

[ Source](https://github.com/RSS-Bridge/rss-bridge)[ Packagist](https://packagist.org/packages/rss-bridge/rss-bridge)[ Docs](https://github.com/rss-bridge/rss-bridge/)[ RSS](/packages/rss-bridge-rss-bridge/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (2)Versions (26)Used By (0)

RSS-Bridge
==========

[](#rss-bridge)

[![RSS-Bridge](static/logo_600px.png)](static/logo_600px.png)

RSS-Bridge is a PHP web application.

It generates web feeds for websites that don't have one.

Officially hosted instance:

IRC channel #rssbridge at

[Full documentation](https://rss-bridge.github.io/rss-bridge/index.html)

Alternatively find another [public instance](https://rss-bridge.github.io/rss-bridge/General/Public_Hosts.html).

Requires minimum PHP 7.4.

[![LICENSE](https://camo.githubusercontent.com/e1591610e67838773248bbc72629e3f476fdad6fae0b5a6e1463dcbe2a1f76e8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d554e4c4943454e53452d626c75652e737667)](UNLICENSE)[![GitHub release](https://camo.githubusercontent.com/8a9ddc45f99678020d11f7b55882813554fc8617a8f7ddebc66fb52368add31c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f7273732d6272696467652f7273732d6272696467652e7376673f6c6f676f3d676974687562)](https://github.com/rss-bridge/rss-bridge/releases/latest)[![irc.libera.chat](https://camo.githubusercontent.com/a6f0deda6c41db59d928087537bba82803e758a9c6485418cbd5dfb1e06a5e4c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6972632e6c69626572612e636861742d2532337273736272696467652d626c75652e737667)](https://web.libera.chat/#rssbridge)[![Actions Status](https://camo.githubusercontent.com/a9944bb8d8e7379c35741d9c7b75770069a505bdbd22750db023e40904637175/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f5253532d4272696467652f7273732d6272696467652f74657374732e796d6c3f6272616e63683d6d6173746572266c6162656c3d476974487562253230416374696f6e73266c6f676f3d676974687562)](https://github.com/RSS-Bridge/rss-bridge/actions)

[![Screenshot #1](/static/screenshot-1.png?raw=true)](/static/screenshot-1.png?raw=true)[![Screenshot #2](/static/screenshot-2.png?raw=true)](/static/screenshot-2.png?raw=true)[![Screenshot #3](/static/screenshot-3.png?raw=true)](/static/screenshot-3.png?raw=true)[![Screenshot #4](/static/screenshot-4.png?raw=true)](/static/screenshot-4.png?raw=true)[![Screenshot #5](/static/screenshot-5.png?raw=true)](/static/screenshot-5.png?raw=true)[![Screenshot #6](/static/screenshot-6.png?raw=true)](/static/screenshot-6.png?raw=true)A subset of bridges (15/447)
----------------------------

[](#a-subset-of-bridges-15447)

- `CssSelectorBridge`: [Scrape out a feed using CSS selectors](https://rss-bridge.org/bridge01/#bridge-CssSelectorBridge)
- `FeedMergeBridge`: [Combine multiple feeds into one](https://rss-bridge.org/bridge01/#bridge-FeedMergeBridge)
- `FeedReducerBridge`: [Reduce a noisy feed by some percentage](https://rss-bridge.org/bridge01/#bridge-FeedReducerBridge)
- `FilterBridge`: [Filter a feed by excluding/including items by keyword](https://rss-bridge.org/bridge01/#bridge-FilterBridge)
- `GettrBridge`: [Fetches the latest posts from a GETTR user](https://rss-bridge.org/bridge01/#bridge-GettrBridge)
- `MastodonBridge`: [Fetches statuses from a Mastodon (ActivityPub) instance](https://rss-bridge.org/bridge01/#bridge-MastodonBridge)
- `RedditBridge`: [Fetches posts from a user/subredit (with filtering options)](https://rss-bridge.org/bridge01/#bridge-RedditBridge)
- `RumbleBridge`: [Fetches channel/user videos](https://rss-bridge.org/bridge01/#bridge-RumbleBridge)
- `SoundcloudBridge`: [Fetches music by username](https://rss-bridge.org/bridge01/#bridge-SoundcloudBridge)
- `TelegramBridge`: [Fetches posts from a public channel](https://rss-bridge.org/bridge01/#bridge-TelegramBridge)
- `ThePirateBayBridge:` [Fetches torrents by search/user/category](https://rss-bridge.org/bridge01/#bridge-ThePirateBayBridge)
- `TikTokBridge`: [Fetches posts by username](https://rss-bridge.org/bridge01/#bridge-TikTokBridge)
- `TwitchBridge`: [Fetches videos from channel](https://rss-bridge.org/bridge01/#bridge-TwitchBridge)
- `XPathBridge`: [Scrape out a feed using XPath expressions](https://rss-bridge.org/bridge01/#bridge-XPathBridge)
- `YoutubeBridge`: [Fetches videos by username/channel/playlist/search](https://rss-bridge.org/bridge01/#bridge-YoutubeBridge)
- `YouTubeCommunityTabBridge`: [Fetches posts from a channel's Posts tab](https://rss-bridge.org/bridge01/#bridge-YouTubeCommunityTabBridge)

Tutorial
--------

[](#tutorial)

### How to install on traditional shared web hosting

[](#how-to-install-on-traditional-shared-web-hosting)

RSS-Bridge can basically be unzipped into a web folder. Should be working instantly.

Latest zip:  (2MB)

### How to install on Debian 12 (nginx + php-fpm)

[](#how-to-install-on-debian-12-nginx--php-fpm)

These instructions have been tested on a fresh Debian 12 VM from Digital Ocean (1vcpu-512mb-10gb, 5 USD/month).

```
timedatectl set-timezone Europe/Oslo

apt install git nginx php8.2-fpm php-mbstring php-simplexml php-curl php-intl

# Create a user account
useradd --shell /bin/bash --create-home rss-bridge

cd /var/www

# Create folder and change its ownership to rss-bridge
mkdir rss-bridge && chown rss-bridge:rss-bridge rss-bridge/

# Become rss-bridge
su rss-bridge

# Clone master branch into existing folder
git clone https://github.com/RSS-Bridge/rss-bridge.git rss-bridge/
cd rss-bridge

# Copy over the default config (OPTIONAL)
cp -v config.default.ini.php config.ini.php

# Recursively give full permissions to user/owner
chmod 700 --recursive ./

# Give read and execute to others on folder ./static
chmod o+rx ./ ./static

# Recursively give give read to others on folder ./static
chmod o+r --recursive ./static
```

Nginx config:

```
# /etc/nginx/sites-enabled/rss-bridge.conf

server {
    listen 80;

    # TODO: change to your own server name
    server_name example.com;

    access_log /var/log/nginx/rss-bridge.access.log;
    error_log /var/log/nginx/rss-bridge.error.log;
    log_not_found off;

    # Intentionally not setting a root folder

    # Static content only served here
    location /static/ {
        alias /var/www/rss-bridge/static/;
    }

    # Pass off to php-fpm only when location is EXACTLY == /
    location = / {
        root /var/www/rss-bridge/;
        include snippets/fastcgi-php.conf;
        fastcgi_read_timeout 45s;
        fastcgi_pass unix:/run/php/rss-bridge.sock;
    }

    # Reduce log noise
    location = /favicon.ico {
        access_log off;
    }

    # Reduce log noise
    location = /robots.txt {
        access_log off;
    }
}
```

PHP FPM pool config:

```
; /etc/php/8.2/fpm/pool.d/rss-bridge.conf

[rss-bridge]

user = rss-bridge
group = rss-bridge

listen = /run/php/rss-bridge.sock

listen.owner = www-data
listen.group = www-data

; Create 10 workers standing by to serve requests
pm = static
pm.max_children = 10

; Respawn worker after 500 requests (workaround for memory leaks etc.)
pm.max_requests = 500
```

PHP ini config:

```
; /etc/php/8.2/fpm/conf.d/30-rss-bridge.ini

max_execution_time = 15
memory_limit = 64M
```

Restart fpm and nginx:

```
# Lint and restart php-fpm
php-fpm8.2 -t && systemctl restart php8.2-fpm

# Lint and restart nginx
nginx -t && systemctl restart nginx
```

### How to install from Composer

[](#how-to-install-from-composer)

Install the latest release.

```
cd /var/www
composer create-project -v --no-dev --no-scripts rss-bridge/rss-bridge
```

### How to install with Caddy

[](#how-to-install-with-caddy)

TODO. See [\#3785](https://github.com/RSS-Bridge/rss-bridge/issues/3785)

### Install from Docker Hub:

[](#install-from-docker-hub)

Install by downloading the docker image from Docker Hub:

```
# Create container
docker create --name=rss-bridge --publish 3000:80 --volume $(pwd)/config:/config rssbridge/rss-bridge
```

You can put custom `config.ini.php` and bridges into `./config`.

**You must restart container for custom changes to take effect.**

See `docker-entrypoint.sh` for details.

```
# Start container
docker start rss-bridge
```

Browse

### Install by locally building from Dockerfile

[](#install-by-locally-building-from-dockerfile)

```
# Build image from Dockerfile
docker build -t rss-bridge .

# Create container
docker create --name rss-bridge --publish 3000:80 --volume $(pwd)/config:/config rss-bridge
```

You can put custom `config.ini.php` and bridges into `./config`.

**You must restart container for custom changes to take effect.**

See `docker-entrypoint.sh` for details.

```
# Start container
docker start rss-bridge
```

Browse

### Install with docker-compose (using Docker Hub)

[](#install-with-docker-compose-using-docker-hub)

You can put custom `config.ini.php` and bridges into `./config`.

**You must restart container for custom changes to take effect.**

See `docker-entrypoint.sh` for details.

```
docker-compose up
```

Browse

### Other installation methods

[](#other-installation-methods)

[![Deploy on Scalingo](https://camo.githubusercontent.com/6d15ce9eb8f6c6725eae2ca0432cc140d2ba0a450382182c54b2a045935c30ea/68747470733a2f2f63646e2e7363616c696e676f2e636f6d2f6465706c6f792f627574746f6e2e737667)](https://my.scalingo.com/deploy?source=https://github.com/sebsauvage/rss-bridge)[![Deploy to Heroku](https://camo.githubusercontent.com/4eea217b02568cc464752586784ae247b22e99fea520a15b6f919b15934ba8ca/68747470733a2f2f7777772e6865726f6b7563646e2e636f6d2f6465706c6f792f627574746f6e2e737667)](https://heroku.com/deploy)[![Deploy to Cloudron](https://camo.githubusercontent.com/a9bf481bc9bf72473c266217e7e4b110a704f015489fa0979bb722b56102d51c/68747470733a2f2f636c6f7564726f6e2e696f2f696d672f627574746f6e2e737667)](https://www.cloudron.io/store/com.rssbridgeapp.cloudronapp.html)[![Run on PikaPods](https://camo.githubusercontent.com/3e14cd463013c1053725574b288fe5eb3e988e0e0c1388abf114798a77f2b8b1/68747470733a2f2f7777772e70696b61706f64732e636f6d2f7374617469632f72756e2d627574746f6e2e737667)](https://www.pikapods.com/pods?run=rssbridge)

The Heroku quick deploy currently does not work. It might work if you fork this repo and modify the `repository` in `scalingo.json`. See [\#2688](https://github.com/RSS-Bridge/rss-bridge/issues/2688)

Learn more in [Installation](https://rss-bridge.github.io/rss-bridge/For_Hosts/Installation.html).

How-to
------

[](#how-to)

### How to fix "Access denied."

[](#how-to-fix-access-denied)

Output is from php-fpm. It is unable to read index.php.

```
chown rss-bridge:rss-bridge /var/www/rss-bridge/index.php

```

### How to password-protect the instance (token)

[](#how-to-password-protect-the-instance-token)

Modify `config.ini.php`:

```
[authentication]

token = "hunter2"

```

### How to remove all cache items

[](#how-to-remove-all-cache-items)

As current user:

```
bin/cache-clear

```

As user rss-bridge:

```
sudo -u rss-bridge bin/cache-clear

```

As root:

```
sudo bin/cache-clear

```

### How to remove all expired cache items

[](#how-to-remove-all-expired-cache-items)

```
bin/cache-prune

```

### How to fix "PHP Fatal error: Uncaught Exception: The FileCache path is not writable"

[](#how-to-fix-php-fatal-error--uncaught-exception-the-filecache-path-is-not-writable)

```
# Give rss-bridge ownership
chown rss-bridge:rss-bridge -R /var/www/rss-bridge/cache

# Or, give www-data ownership
chown www-data:www-data -R /var/www/rss-bridge/cache

# Or, give everyone write permission
chmod 777 -R /var/www/rss-bridge/cache

# Or last ditch effort (CAREFUL)
rm -rf /var/www/rss-bridge/cache/ && mkdir /var/www/rss-bridge/cache/
```

### How to fix "attempt to write a readonly database"

[](#how-to-fix-attempt-to-write-a-readonly-database)

The sqlite files (db, wal and shm) are not writeable.

```
chown -v rss-bridge:rss-bridge cache/*

```

### How to fix "Unable to prepare statement: 1, no such table: storage"

[](#how-to-fix-unable-to-prepare-statement-1-no-such-table-storage)

```
rm cache/*

```

### How to create a completely new bridge

[](#how-to-create-a-completely-new-bridge)

New code files MUST have `declare(strict_types=1);` at the top of file:

```
