[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-8206":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":25,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":34,"readmeContent":35,"aiSummary":36,"trendingCount":16,"starSnapshotCount":16,"syncStatus":37,"lastSyncTime":38,"discoverSource":39},8206,"rss-bridge","RSS-Bridge\u002Frss-bridge","RSS-Bridge","The RSS feed for websites missing it","https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F",null,"PHP",9005,1213,116,270,0,3,14,79,16,40.25,"The Unlicense",false,"master",true,[27,28,29,30,31,5,32,33],"atom-feed","hacktoberfest","json-feed","php","rss","rss-feed","unlicense","2026-06-12 02:01:50","# RSS-Bridge\n\n![RSS-Bridge](static\u002Flogo_600px.png)\n\nRSS-Bridge is a PHP web application.\n\nIt generates web feeds for websites that don't have one.\n\nOfficially hosted instance: https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F\n\nIRC channel #rssbridge at https:\u002F\u002Flibera.chat\u002F\n\n[Full documentation](https:\u002F\u002Frss-bridge.github.io\u002Frss-bridge\u002Findex.html)\n\nAlternatively find another\n[public instance](https:\u002F\u002Frss-bridge.github.io\u002Frss-bridge\u002FGeneral\u002FPublic_Hosts.html).\n\nRequires minimum PHP 7.4.\n\n\n[![LICENSE](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-UNLICENSE-blue.svg)](UNLICENSE)\n[![GitHub release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Frelease\u002Frss-bridge\u002Frss-bridge.svg?logo=github)](https:\u002F\u002Fgithub.com\u002Frss-bridge\u002Frss-bridge\u002Freleases\u002Flatest)\n[![irc.libera.chat](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Firc.libera.chat-%23rssbridge-blue.svg)](https:\u002F\u002Fweb.libera.chat\u002F#rssbridge)\n[![Actions Status](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002FRSS-Bridge\u002Frss-bridge\u002Ftests.yml?branch=master&label=GitHub%20Actions&logo=github)](https:\u002F\u002Fgithub.com\u002FRSS-Bridge\u002Frss-bridge\u002Factions)\n\n|||\n|:-:|:-:|\n|![Screenshot #1](\u002Fstatic\u002Fscreenshot-1.png?raw=true)|![Screenshot #2](\u002Fstatic\u002Fscreenshot-2.png?raw=true)|\n|![Screenshot #3](\u002Fstatic\u002Fscreenshot-3.png?raw=true)|![Screenshot #4](\u002Fstatic\u002Fscreenshot-4.png?raw=true)|\n|![Screenshot #5](\u002Fstatic\u002Fscreenshot-5.png?raw=true)|![Screenshot #6](\u002Fstatic\u002Fscreenshot-6.png?raw=true)|\n\n## A subset of bridges (15\u002F447)\n\n* `CssSelectorBridge`: [Scrape out a feed using CSS selectors](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-CssSelectorBridge)\n* `FeedMergeBridge`: [Combine multiple feeds into one](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-FeedMergeBridge)\n* `FeedReducerBridge`: [Reduce a noisy feed by some percentage](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-FeedReducerBridge)\n* `FilterBridge`: [Filter a feed by excluding\u002Fincluding items by keyword](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-FilterBridge)\n* `GettrBridge`: [Fetches the latest posts from a GETTR user](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-GettrBridge)\n* `MastodonBridge`: [Fetches statuses from a Mastodon (ActivityPub) instance](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-MastodonBridge)\n* `RedditBridge`: [Fetches posts from a user\u002Fsubredit (with filtering options)](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-RedditBridge)\n* `RumbleBridge`: [Fetches channel\u002Fuser videos](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-RumbleBridge)\n* `SoundcloudBridge`: [Fetches music by username](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-SoundcloudBridge)\n* `TelegramBridge`: [Fetches posts from a public channel](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-TelegramBridge)\n* `ThePirateBayBridge:` [Fetches torrents by search\u002Fuser\u002Fcategory](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-ThePirateBayBridge)\n* `TikTokBridge`: [Fetches posts by username](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-TikTokBridge)\n* `TwitchBridge`: [Fetches videos from channel](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-TwitchBridge)\n* `XPathBridge`: [Scrape out a feed using XPath expressions](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-XPathBridge)\n* `YoutubeBridge`: [Fetches videos by username\u002Fchannel\u002Fplaylist\u002Fsearch](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-YoutubeBridge)\n* `YouTubeCommunityTabBridge`: [Fetches posts from a channel's Posts tab](https:\u002F\u002Frss-bridge.org\u002Fbridge01\u002F#bridge-YouTubeCommunityTabBridge)\n\n## Tutorial\n\n### How to install on traditional shared web hosting\n\nRSS-Bridge can basically be unzipped into a web folder. Should be working instantly.\n\nLatest zip:\nhttps:\u002F\u002Fgithub.com\u002FRSS-Bridge\u002Frss-bridge\u002Farchive\u002Frefs\u002Fheads\u002Fmaster.zip (2MB)\n\n### How to install on Debian 12 (nginx + php-fpm)\n\nThese instructions have been tested on a fresh Debian 12 VM from Digital Ocean (1vcpu-512mb-10gb, 5 USD\u002Fmonth).\n\n```shell\ntimedatectl set-timezone Europe\u002FOslo\n\napt install git nginx php8.2-fpm php-mbstring php-simplexml php-curl php-intl\n\n# Create a user account\nuseradd --shell \u002Fbin\u002Fbash --create-home rss-bridge\n\ncd \u002Fvar\u002Fwww\n\n# Create folder and change its ownership to rss-bridge\nmkdir rss-bridge && chown rss-bridge:rss-bridge rss-bridge\u002F\n\n# Become rss-bridge\nsu rss-bridge\n\n# Clone master branch into existing folder\ngit clone https:\u002F\u002Fgithub.com\u002FRSS-Bridge\u002Frss-bridge.git rss-bridge\u002F\ncd rss-bridge\n\n# Copy over the default config (OPTIONAL)\ncp -v config.default.ini.php config.ini.php\n\n# Recursively give full permissions to user\u002Fowner\nchmod 700 --recursive .\u002F\n\n# Give read and execute to others on folder .\u002Fstatic\nchmod o+rx .\u002F .\u002Fstatic\n\n# Recursively give give read to others on folder .\u002Fstatic\nchmod o+r --recursive .\u002Fstatic\n```\n\nNginx config:\n\n```nginx\n# \u002Fetc\u002Fnginx\u002Fsites-enabled\u002Frss-bridge.conf\n\nserver {\n    listen 80;\n\n    # TODO: change to your own server name\n    server_name example.com;\n\n    access_log \u002Fvar\u002Flog\u002Fnginx\u002Frss-bridge.access.log;\n    error_log \u002Fvar\u002Flog\u002Fnginx\u002Frss-bridge.error.log;\n    log_not_found off;\n\n    # Intentionally not setting a root folder\n\n    # Static content only served here\n    location \u002Fstatic\u002F {\n        alias \u002Fvar\u002Fwww\u002Frss-bridge\u002Fstatic\u002F;\n    }\n\n    # Pass off to php-fpm only when location is EXACTLY == \u002F\n    location = \u002F {\n        root \u002Fvar\u002Fwww\u002Frss-bridge\u002F;\n        include snippets\u002Ffastcgi-php.conf;\n        fastcgi_read_timeout 45s;\n        fastcgi_pass unix:\u002Frun\u002Fphp\u002Frss-bridge.sock;\n    }\n\n    # Reduce log noise\n    location = \u002Ffavicon.ico {\n        access_log off;\n    }\n\n    # Reduce log noise\n    location = \u002Frobots.txt {\n        access_log off;\n    }\n}\n```\n\nPHP FPM pool config:\n```ini\n; \u002Fetc\u002Fphp\u002F8.2\u002Ffpm\u002Fpool.d\u002Frss-bridge.conf\n\n[rss-bridge]\n\nuser = rss-bridge\ngroup = rss-bridge\n\nlisten = \u002Frun\u002Fphp\u002Frss-bridge.sock\n\nlisten.owner = www-data\nlisten.group = www-data\n\n; Create 10 workers standing by to serve requests\npm = static\npm.max_children = 10\n\n; Respawn worker after 500 requests (workaround for memory leaks etc.)\npm.max_requests = 500\n```\n\nPHP ini config:\n```ini\n; \u002Fetc\u002Fphp\u002F8.2\u002Ffpm\u002Fconf.d\u002F30-rss-bridge.ini\n\nmax_execution_time = 15\nmemory_limit = 64M\n```\n\nRestart fpm and nginx:\n\n```shell\n# Lint and restart php-fpm\nphp-fpm8.2 -t && systemctl restart php8.2-fpm\n\n# Lint and restart nginx\nnginx -t && systemctl restart nginx\n```\n\n### How to install from Composer\n\nInstall the latest release.\n\n```shell\ncd \u002Fvar\u002Fwww\ncomposer create-project -v --no-dev --no-scripts rss-bridge\u002Frss-bridge\n```\n\n### How to install with Caddy\n\nTODO. See https:\u002F\u002Fgithub.com\u002FRSS-Bridge\u002Frss-bridge\u002Fissues\u002F3785\n\n### Install from Docker Hub:\n\nInstall by downloading the docker image from Docker Hub:\n\n```bash\n# Create container\ndocker create --name=rss-bridge --publish 3000:80 --volume $(pwd)\u002Fconfig:\u002Fconfig rssbridge\u002Frss-bridge\n```\n\nYou can put custom `config.ini.php` and bridges into `.\u002Fconfig`.\n\n**You must restart container for custom changes to take effect.**\n\nSee `docker-entrypoint.sh` for details.\n\n```bash\n# Start container\ndocker start rss-bridge\n```\n\nBrowse http:\u002F\u002Flocalhost:3000\u002F\n\n### Install by locally building from Dockerfile\n\n```bash\n# Build image from Dockerfile\ndocker build -t rss-bridge .\n\n# Create container\ndocker create --name rss-bridge --publish 3000:80 --volume $(pwd)\u002Fconfig:\u002Fconfig rss-bridge\n```\n\nYou can put custom `config.ini.php` and bridges into `.\u002Fconfig`.\n\n**You must restart container for custom changes to take effect.**\n\nSee `docker-entrypoint.sh` for details.\n\n```bash\n# Start container\ndocker start rss-bridge\n```\n\nBrowse http:\u002F\u002Flocalhost:3000\u002F\n\n### Install with docker-compose (using Docker Hub)\n\nYou can put custom `config.ini.php` and bridges into `.\u002Fconfig`.\n\n**You must restart container for custom changes to take effect.**\n\nSee `docker-entrypoint.sh` for details.\n\n```bash\ndocker-compose up\n```\n\nBrowse http:\u002F\u002Flocalhost:3000\u002F\n\n### Other installation methods\n\n[![Deploy on Scalingo](https:\u002F\u002Fcdn.scalingo.com\u002Fdeploy\u002Fbutton.svg)](https:\u002F\u002Fmy.scalingo.com\u002Fdeploy?source=https:\u002F\u002Fgithub.com\u002Fsebsauvage\u002Frss-bridge)\n[![Deploy to Heroku](https:\u002F\u002Fwww.herokucdn.com\u002Fdeploy\u002Fbutton.svg)](https:\u002F\u002Fheroku.com\u002Fdeploy)\n[![Deploy to Cloudron](https:\u002F\u002Fcloudron.io\u002Fimg\u002Fbutton.svg)](https:\u002F\u002Fwww.cloudron.io\u002Fstore\u002Fcom.rssbridgeapp.cloudronapp.html)\n[![Run on PikaPods](https:\u002F\u002Fwww.pikapods.com\u002Fstatic\u002Frun-button.svg)](https:\u002F\u002Fwww.pikapods.com\u002Fpods?run=rssbridge)\n\nThe Heroku quick deploy currently does not work. It might work if you fork this repo and\nmodify the `repository` in `scalingo.json`. See https:\u002F\u002Fgithub.com\u002FRSS-Bridge\u002Frss-bridge\u002Fissues\u002F2688\n\nLearn more in\n[Installation](https:\u002F\u002Frss-bridge.github.io\u002Frss-bridge\u002FFor_Hosts\u002FInstallation.html).\n\n## How-to\n\n### How to fix \"Access denied.\"\n\nOutput is from php-fpm. It is unable to read index.php.\n\n    chown rss-bridge:rss-bridge \u002Fvar\u002Fwww\u002Frss-bridge\u002Findex.php\n\n### How to password-protect the instance (token)\n\nModify `config.ini.php`:\n\n    [authentication]\n\n    token = \"hunter2\"\n\n### How to remove all cache items\n\nAs current user:\n\n    bin\u002Fcache-clear\n\nAs user rss-bridge:\n\n    sudo -u rss-bridge bin\u002Fcache-clear\n\nAs root:\n\n    sudo bin\u002Fcache-clear\n\n### How to remove all expired cache items\n\n    bin\u002Fcache-prune\n\n### How to fix \"PHP Fatal error:  Uncaught Exception: The FileCache path is not writable\"\n\n```shell\n# Give rss-bridge ownership\nchown rss-bridge:rss-bridge -R \u002Fvar\u002Fwww\u002Frss-bridge\u002Fcache\n\n# Or, give www-data ownership\nchown www-data:www-data -R \u002Fvar\u002Fwww\u002Frss-bridge\u002Fcache\n\n# Or, give everyone write permission\nchmod 777 -R \u002Fvar\u002Fwww\u002Frss-bridge\u002Fcache\n\n# Or last ditch effort (CAREFUL)\nrm -rf \u002Fvar\u002Fwww\u002Frss-bridge\u002Fcache\u002F && mkdir \u002Fvar\u002Fwww\u002Frss-bridge\u002Fcache\u002F\n```\n\n### How to fix \"attempt to write a readonly database\"\n\nThe sqlite files (db, wal and shm) are not writeable.\n\n    chown -v rss-bridge:rss-bridge cache\u002F*\n\n### How to fix \"Unable to prepare statement: 1, no such table: storage\"\n\n    rm cache\u002F*\n\n### How to create a completely new bridge\n\nNew code files MUST have `declare(strict_types=1);` at the top of file:\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n```\n\nCreate the new bridge in e.g. `bridges\u002FBearBlogBridge.php`:\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nclass BearBlogBridge extends BridgeAbstract\n{\n    const NAME = 'BearBlog (bearblog.dev)';\n\n    public function collectData()\n    {\n        $dom = getSimpleHTMLDOM('https:\u002F\u002Fherman.bearblog.dev\u002Fblog\u002F');\n        foreach ($dom->find('.blog-posts li') as $li) {\n            $a = $li->find('a', 0);\n            $this->items[] = [\n                'title' => $a->plaintext,\n                'uri' => 'https:\u002F\u002Fherman.bearblog.dev' . $a->href,\n            ];\n        }\n    }\n}\n```\n\nLearn more in [bridge api](https:\u002F\u002Frss-bridge.github.io\u002Frss-bridge\u002FBridge_API\u002Findex.html).\n\n### How to enable all bridges\n\n    enabled_bridges[] = *\n\n### How to enable some bridges\n\n```\nenabled_bridges[] = TwitchBridge\nenabled_bridges[] = GettrBridge\n```\n\n### How to switch to memcached as cache backend\n\n```\n[cache]\n\n; Cache backend: file (default), sqlite, memcached, null\ntype = \"memcached\"\n```\n\n### How to switch to sqlite3 as cache backend\n\n    type = \"sqlite\"\n\n### How to disable bridge errors (as feed items)\n\nWhen a bridge fails, RSS-Bridge will produce a feed with a single item describing the error.\n\nThis way, feed readers pick it up and you are notified.\n\nIf you don't want this behaviour, switch the error output to `http`:\n\n    [error]\n\n    ; Defines how error messages are returned by RSS-Bridge\n    ;\n    ; \"feed\" = As part of the feed (default)\n    ; \"http\" = As HTTP error message\n    ; \"none\" = No errors are reported\n    output = \"http\"\n\n### How to accumulate errors before finally reporting it\n\nModify `report_limit` so that an error must occur 3 times before it is reported.\n\n    ; Defines how often an error must occur before it is reported to the user\n    report_limit = 3\n\nThe report count is reset to 0 each day.\n\n### How to password-protect the instance (HTTP Basic Auth)\n\n    [authentication]\n\n    enable = true\n    username = \"alice\"\n    password = \"cat\"\n\nWill typically require feed readers to be configured with the credentials.\n\nIt may also be possible to manually include the credentials in the URL:\n\nhttps:\u002F\u002Falice:cat@rss-bridge.org\u002Fbridge01\u002F?action=display&bridge=FabriceBellardBridge&format=Html\n\n### How to create a new output format\n\nSee `formats\u002FPlaintextFormat.php` for an example.\n\n### How to run unit tests and linter\n\nThese commands require that you have installed the dev dependencies in `composer.json`.\n\nRun all tests:\n\n    .\u002Fvendor\u002Fbin\u002Fphpunit\n\nRun a single test class:\n\n    .\u002Fvendor\u002Fbin\u002Fphpunit --filter UrlTest\n\nRun linter:\n\n    .\u002Fvendor\u002Fbin\u002Fphpcs --standard=phpcs.xml --warning-severity=0 --extensions=php -p .\u002F\n\nhttps:\u002F\u002Fgithub.com\u002FPHPCSStandards\u002FPHP_CodeSniffer\u002Fwiki\n\n### How to spawn a minimal development environment\n\n    php -S 127.0.0.1:9001\n\nhttp:\u002F\u002F127.0.0.1:9001\u002F\n\n\n## Explanation\n\nWe are RSS-Bridge community, a group of developers continuing the project initiated by sebsauvage,\nwebmaster of\n[sebsauvage.net](https:\u002F\u002Fsebsauvage.net), author of\n[Shaarli](https:\u002F\u002Fsebsauvage.net\u002Fwiki\u002Fdoku.php?id=php:shaarli) and\n[ZeroBin](https:\u002F\u002Fsebsauvage.net\u002Fwiki\u002Fdoku.php?id=php:zerobin).\n\nSee [CONTRIBUTORS.md](CONTRIBUTORS.md)\n\nRSS-Bridge uses caching to prevent services from banning your server for repeatedly updating feeds.\nThe specific cache duration can be different between bridges.\n\nRSS-Bridge allows you to take full control over which bridges are displayed to the user.\nThat way you can host your own RSS-Bridge service with your favorite collection of bridges!\n\nCurrent maintainers (as of 2024): @dvikan and @Mynacol #2519\n\n## Reference\n\n### Feed item structure\n\nThis is the feed item structure that bridges are expected to produce.\n\n```php\n    $item = [\n        'uri' => 'https:\u002F\u002Fexample.com\u002Fblog\u002Fhello',\n        'title' => 'Hello world',\n        \u002F\u002F Publication date in unix timestamp\n        'timestamp' => 1668706254,\n        'author' => 'Alice',\n        'content' => 'Here be item content',\n        'enclosures' => [\n            'https:\u002F\u002Fexample.com\u002Ffoo.png',\n            'https:\u002F\u002Fexample.com\u002Fbar.png'\n        ],\n        'categories' => [\n            'news',\n            'tech',\n        ],\n        \u002F\u002F Globally unique id\n        'uid' => 'e7147580c8747aad',\n    ]\n```\n\n### Output formats\n\n* `Atom`: Atom feed, for use in feed readers\n* `Html`: Simple HTML page\n* `Json`: JSON, for consumption by other applications\n* `Mrss`: MRSS feed, for use in feed readers\n* `Plaintext`: Raw text, for consumption by other applications\n* `Sfeed`: Text, TAB separated\n\n### Cache backends\n\n* `File`\n* `SQLite`\n* `Memcached`\n* `Array`\n* `Null`\n\n### Licenses\n\nThe source code for RSS-Bridge is [Public Domain](UNLICENSE).\n\nRSS-Bridge uses third party libraries with their own license:\n\n  * [`Parsedown`](https:\u002F\u002Fgithub.com\u002Ferusev\u002Fparsedown) licensed under the [MIT License](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT)\n  * [`PHP Simple HTML DOM Parser`](https:\u002F\u002Fsimplehtmldom.sourceforge.io\u002Fdocs\u002F1.9\u002Findex.html) licensed under the [MIT License](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT)\n  * [`php-urljoin`](https:\u002F\u002Fgithub.com\u002Ffluffy-critter\u002Fphp-urljoin) licensed under the [MIT License](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT)\n  * [`Laravel framework`](https:\u002F\u002Fgithub.com\u002Flaravel\u002Fframework\u002F) licensed under the [MIT License](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT)\n\n## Rant\n\n*Dear so-called \"social\" websites.*\n\nYour catchword is \"share\", but you don't want us to share. You want to keep us within your walled gardens. That's why you've been removing RSS links from webpages, hiding them deep on your website, or removed feeds entirely, replacing it with crippled or demented proprietary API. **FUCK YOU.**\n\nYou're not social when you hamper sharing by removing feeds. You're happy to have customers creating content for your ecosystem, but you don't want this content out - a content you do not even own. Google Takeout is just a gimmick. We want our data to flow, we want RSS or Atom feeds.\n\nWe want to share with friends, using open protocols: RSS, Atom, XMPP, whatever. Because no one wants to have *your* service with *your* applications using *your* API force-feeding them. Friends must be free to choose whatever software and service they want.\n\nWe are rebuilding bridges you have willfully destroyed.\n\nGet your shit together: Put RSS\u002FAtom back in.\n","RSS-Bridge 是一个 PHP 网络应用程序，用于为那些没有 RSS 源的网站生成 RSS 源。它支持通过 CSS 选择器或 XPath 表达式从网页中抓取内容，并提供多种桥梁（如 Reddit、Mastodon 和 Soundcloud 等）来获取特定平台的数据。此外，还具备合并多个源、过滤条目等功能。项目采用 PHP 编写，要求最低版本为 7.4。适用于需要定制化 RSS 源订阅的个人用户以及希望集成多来源信息的企业环境。",2,"2026-06-11 03:16:45","top_language"]