A simple twitter-feed-style RSS aggregator written in PHP, Laravel, Inertia.js, Tailwind and Vue.js

Overview

RSS

A simple, opinionated, RSS feed aggregator.

PHPUnit

Features

The following features are built into the application:

  • Supports RSS and ATOM formats.
  • Regular auto-fetching of RSS feeds.
    • Every hour by default, configurable down to 5 mins.
  • Custom feed names and colors.
  • Feed-based tags for categorization.
  • 3 different post layout modes (card, list, compact).
  • Fetching of page open-graph images.
  • Feeds managed via a single plaintext file.
  • System-based dark/light theme.
  • Post title/description search.
  • Ready-to-use docker image.
  • Mobile screen compatible.

Limitations

The below possibly expected features are missing from this application. This is not a list of planned features. Please see the Low Maintenance Project section below for more info.

  • No import of full post/article content.
  • No feed management via the UI.
  • No user system or user management system.
  • No authentication or authorization built-in.
  • No customization, extension or plugin system.
  • No organisation upon simple feed-level tagging.
  • Error handling is limited and will likely not alert clearly upon issue.

Upon the above, it's quite likely you'll come across issues. This project was created to meet a personal need while learning some new technologies. Much of the logic is custom written instead of using battle-tested libraries.

Screenshots

Card View List View Compact View Dark Mode

Docker Usage

A pre-built docker image is available to run the application. Storage data is confined to a single /app/storage directory for easy volume mounting. Port 80 is exposed by default for application access. This application does not support HTTPS, for that you should instead use a proxy layer such as nginx.

Docker Run Command Example

In the below command, the application will be accessible at http://localhost:8080 on the host and the files would be stored in a /home/barry/rss directory. In this example, feeds would be configured in a /home/barry/rss/feeds.txt file.

docker run -d \
    --restart unless-stopped \
    -p 8080:80 \
    -v /home/barry/rss:/app/storage \
    ghcr.io/ssddanbrown/rss:latest  

Docker Compose Example

In the below docker-compose.yml example, the application will be accessible at http://localhost:8080 on the host and the files would be stored in a ./rss-files directory relative to the docker-compose.yml file. In this example, feeds would be configured in a ./rss-files/feeds.txt file.

---
version: "2"
services:
    rss:
        image: ghcr.io/ssddanbrown/rss:latest
        container_name: rss
        environment:
            - APP_NAME=RSS
        volumes:
            - ./rss-files:/app/storage
        ports:
            - "8080:80"
        restart: unless-stopped

Building the Docker Image

If you'd like to build the image from scratch, instead of using the pre-built image, you can do so like this:

docker build -f docker/Dockerfile .

Feed Configuration

Feed configuration is handled by a plaintext file on the host system. By default, using our docker image, this configuration would be located in a feeds.txt file within the path you mounted to /app/storage.

The format of this file can be seen below:

https://feed.url.com/feed.xml feed-name #tag-a #tag-b
https://example.com/feed.xml Example #updates #news

# Lines starting with a hash are considered comments.
# Empty lines are fine and will be ignored.

# Underscores in names will be converted to spaces.
https://example.com/feed-b.xml News_Site #news

# Feed color can be set using square brackets after the name.
# The color must be a CSS-compatible color value.
https://example.com/feed-c.xml Blue_News[#0078b9] #news #blue

App Configuration

The application allows some configuration through variables. These can be set via the .env file or, when using docker, via environment variables.

# The name of the application.
# Only really shown in the title/browser-tab.
APP_NAME=RSS

# The path to the config file.
# Defaults to `storage/feeds.txt` within the application folder.
APP_CONFIG_FILE=/app/storage/feeds.txt

# Enable or disable the loading of post thumbnails.
# Does not control them within the UI, but controls the fetching
# when posts are fetched.
# Defaults to true.
APP_LOAD_POST_THUMBNAILS=true

# The number of minutes before a feed is considered outdated and
# therefore should be updated upon request.
# This effectively has a minimum of 5 minutes in the docker setup.
APP_FEED_UPDATE_FREQUENCY=60

Usage Behind a Reverse Proxy

When using behind a reverse proxy, ensure common forwarding headers are set so that the application can properly detect the right host and path to use. The below shows a sub-path proxy config location block for nginx. Note the X-Forwarded-Prefix header to make the application aware of sub-path usage.

location /rss/ {
    proxy_pass http://container-ip:80/;
    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Port  $server_port;
    proxy_set_header X-Forwarded-Prefix "/rss/";
    proxy_redirect off;
}

Manual Install

Manually installing the application is not recommended unless you are performing development work on the project. Instead, use of the docker image is advised.

This project is based upon Laravel so the requirements and install process are much the same. You will need git, PHP, composer and NodeJS installed. Installation would generally be as follows:

# Clone down and enter the project
git clone https://github.com/ssddanbrown/rss.git
cd rss

# Install PHP dependencies via composer
# This will check you meet the minimum PHP version and extensions required.
composer install

# Create database file
touch storage/database/database.sqlite

# Copy config, generate app key, migrate database & link storage
cp .env.example .env
php artisan key:generate
php artisan migrate
php artisan storage:link

# Install JS dependencies & build CSS/JS
npm install
npm run build

For a production server you'd really want to have a webserver active to server the public directory and handle PHP. You'd also need a process to run the laravel queue system in addition to a cron job to run the schedule.

On a development system, These can be done like so:

# Serve the app
php artisan serve

# Watch the queue
php artisan queue:listen

# Work the schedule
php artisan schedule:work

Low Maintenance Project

This is a low maintenance project. The scope of features and support are purposefully kept narrow for my purposes to ensure longer term maintenance is viable. I'm not looking to grow this into a bigger project at all.

Issues and PRs raised for bugs are perfectly fine assuming they don't significantly increase the scope of the project. Please don't open PRs for new features that expand the scope.

Development

This project uses PHPUnit for testing. Tests will use their own in-memory SQLite instance. Tests can be ran like so:

./vendor/bin/phpunit

PHP CS Fixer is used for formatting. This can be ran like so:

./vendor/bin/php-cs-fixer fix

Attribution

This is primarily built using the following great projects and technologies:

Comments
  •  cURL error 6 when fetching feed

    cURL error 6 when fetching feed

    I can get the web page, but it keeps saying "reloading feeds".

    Logs: rss | [2022-07-04 19:04:56][28] Processing: App\Jobs\RefreshFeedJob rss | [2022-07-04 19:04:56][29] Processing: App\Jobs\RefreshFeedJob rss | [2022-07-04 19:04:56][30] Processing: App\Jobs\RefreshFeedJob rss | [2022-07-04 19:04:56][30] Failed: App\Jobs\RefreshFeedJob rss | [2022-07-04 19:05:02][31] Processing: App\Jobs\RefreshFeedJob rss | [2022-07-04 19:05:02][32] Processing: App\Jobs\RefreshFeedJob rss | [2022-07-04 19:05:02][33] Processing: App\Jobs\RefreshFeedJob rss | [2022-07-04 19:05:02][33] Failed: App\Jobs\RefreshFeedJob

    Tried with both:

    https://feeds.theguardian.com/theguardian/world/rss Guardian_World and https://news.ycombinator.com/rss Hacker_news

    I know these 2 feeds are valid as I use them in Freshrss.

    Also tried with: https://rss.nytimes.com/services/xml/rss/nyt/World.xml NY_Times

    to be sure the problem wasn't with the xml extension...

    opened by airdogvan 18
  • Retention of data

    Retention of data

    Hi @ssddanbrown

    Thanks for the great tool! Been using it for a couple of days now and love it!

    One question though. Is there any retention of the data in place? I added quite some feeds and I am at 622MB for the App/public/thumbs and about 4,6MB for the database.

    Thanks!

    Greetings, Michiel

    opened by aobh 7
  • 500 server error on malformed UTF-8 characters

    500 server error on malformed UTF-8 characters

    Hey, Nice little rss reader 🤟 It seems one of my feed have encoding problems, so the app shows error 500. Can you fixed it? Thanks in advance.

    [2022-07-04 11:21:51] production.ERROR: Malformed UTF-8 characters, possibly incorrectly encoded {"exception":"[object] (InvalidArgumentException(code: 0): Malformed UTF-8 characters, possibly incorrectly encoded at /app/vendor/laravel/framework/src/Illuminate/Http/JsonResponse.php:91)

    opened by droM4X 7
  • .rss file

    .rss file

    Hello! i'm new to rss feeds, i would like to know how to add an rss feed from a .rss file to this container if this app can handle this kind of file or a manner of gather the rss link from that file. Thanks

    opened by filippo-ferrando 5
  • Use of own RSS apps

    Use of own RSS apps

    Love your work what you did here (and with Bookstack) but I have a question/feature request:

    Does your RSS app has an API or Fever so that it can be used with any mobile app that supports Fever/API like Fiery Feeds or other RSS reader or are you planning this as a future feature?

    opened by lubbertkramer 1
  • Trouble fetching images from NYTimes

    Trouble fetching images from NYTimes

    Article URL example: https://www.nytimes.com/2022/07/04/world/europe/france-macron-cabinet.html

    Image seems to be of reasonable size and looks properly within HTML head, within reasonable distance from start of HTML doc.

    bug 
    opened by ssddanbrown 1
  • Post pruning

    Post pruning

    Related to #7

    Also includes commit to update deps.

    Outstanding issues

    • [x] Posts are only pruning in chunk values (500/250), Need to check why. May likely be due to deleting of posts during chunking operation. Need to add test for current failure case then address.
    opened by ssddanbrown 0
Releases(v1.1.0)
  • v1.1.0(Aug 26, 2022)

    This release adds the ability to prune old post (and thumbnail) data to reclaim space where desired. This can be configured as an environment variable as follows:

    # The number of days to wait before a post should be pruned.
    # Uses the post published_at time to determine lifetime.
    # Setting this to false disables any auto-pruning.
    # If active, pruning will auto-run daily.
    # Defaults to false (No pruning) 
    APP_PRUNE_POSTS_AFTER_DAYS=30
    
    Source code(tar.gz)
    Source code(zip)
  • v1.0.5(Jul 7, 2022)

    • Increased feed/image fetching time-outs.
    • Changed HTML head scanning, for post image, to look across 1MB of data instead of 100k, since some platforms like Reddit had a whole lot of head content.
    • Added user-agent to feed/image fetching since some services, like NY times, would block requests without it.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.4(Jul 5, 2022)

  • v1.0.3(Jul 4, 2022)

  • v1.0.2(Jul 4, 2022)

    • Added app icon to show in browser tab.
    • Fixed search and next/prev links not being correct relative to any non-root page.
    • Removed some dev libraries from the docker builds.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Jul 3, 2022)

  • v1.0.0(Jul 3, 2022)

  • v0.1.0(Jul 2, 2022)

Owner
Dan Brown
Dan Brown
YCOM Impersonate. Login as selected YCOM user 🧙‍♂️in frontend.

YCOM Impersonate Login as selected YCOM user in frontend. Features: Backend users with admin rights or YCOM[] rights, can be automatically logged in v

Friends Of REDAXO 17 Sep 12, 2022
The RSS feed for websites missing it

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-alon

RSS Bridge Community 5.5k Jan 8, 2023
Tailwind UI is a Tailwind CSS component library designed by the authors of Tailwind CSS

Tailwind UI is a Tailwind CSS component library designed by the authors of Tailwind CSS. This is a Winter CMS plugin that provides a custom, TailwindUI-based skin for the backend.

Winter CMS 9 Dec 19, 2022
A cool link aggregator created using Wordpress

A cool link aggregator created using Wordpress

Gabriel Nunes 7 Oct 6, 2022
TXP-Tweet - arc twitter - Twitter-Textpattern integration

TXP Tweet This is TXP Tweet, a collection of Textpattern plugins for Twitter integration. TXP Tweet consists of two plugins: arc_twitter (the core Tex

Andy Carter 11 Sep 20, 2021
Laravel Podcast Manager is a complete podcast manager package for Laravel 5.3+ that enables you to manage RSS feeds for your favorite podcasts and listen to the episodes in a seamless UI.

laravelpodcast | A Laravel podcast manager package - v0.0.8 Introduction Laravel Podcast Manager is a complete podcast manager package for Laravel 5.3

Jeremy Kenedy 22 Nov 4, 2022
Esto es un lector de RSS creado con PHP

Lector RSS con PHP Esto es un lector de RSS creado con PHP y un poco de CSS3 Por defecto este lector carga el FEED de https://entreunosyceros.net, per

entreunosyceros 1 Oct 21, 2021
Heal and Feed Command For PocketMine-MP

Description Heal and Feed Command For PocketMine-MP. If you are have a question, please make a issues Features Simple Configuration With UI Can heal a

null 2 Feb 15, 2022
Create an ip info WebPage with a style.css and an index.php

my-ip-info Create an ip info Page with a style.css and an index.php file. 支持 判断浏览器语言,非中文显示为英文。 curl指令返回ip地址 国家 城市。 在地图上显示位置 前提条件 一个已经注册了域名并在Cloudflare

null 10 May 31, 2023
Laravel Pint is an opinionated PHP code style fixer for minimalists.

Laravel Pint is an opinionated PHP code style fixer for minimalists. Pint is built on top of PHP-CS-Fixer and makes it simple to ensure that your code style stays clean and consistent.

The Laravel Framework 2.2k Jan 5, 2023
Silverstripe-tinytidy - Control which styles are available in TinyMCE's style dropdown menu and what elements they can be applied to

TinyTidy for SilverStripe This module mainly serves as an example of how to customise the 'styles' dropdown menu in the TinyMCE editor to control whic

Jono Menz 30 Jul 30, 2020
Laravel style FormRequests for Symfony; inspired by adamsafr/form-request-bundle

Somnambulist Form Request Bundle An implementation of form requests from Laravel for Symfony based on the original work by Adam Sapraliev. Requirement

Somnambulist Tech 1 Dec 14, 2021
🙈 Code style configuration for `php-cs-fixer` based on PSR-12.

php-code-style Code style configuration for friendsofphp/php-cs-fixer based on PSR-12. Installation Step 1 of 3 Install gomzyakov/php-code-style via c

Alexander Gomzyakov 5 Nov 27, 2022
A Simple MVC PHP Framework, integrated with lot of features such as Session, Cookies, Migrations, Database, Factories, Seeding, Bootstrap and Tailwind CSS

Navite A Simple MVC PHP Framework, integrated with lot of features such as Session, Cookies, Migrations, Database, Factories, Seeding, Bootstrap and T

Celionatti 2 Aug 22, 2022
Provides an object-oriented API to query in-memory collections in a SQL-style.

POQ - PHP Object Query Install composer require alexandre-daubois/poq 1.0.0-beta2 That's it, ready to go! ?? Usage Here is the set of data we're going

Alexandre Daubois 16 Nov 29, 2022
An Inertia.js adapter for Statamic.

Inertia.js adapter for Statamic Statamic server side adapter for Inertia.js to build single-page apps, without building an API. Installation You can i

Adam Campbell 52 Dec 31, 2022
A customizable decentralized micro-blog (Twitter) and cms (Wordpress) that only you host and moderate.

Consider this --> each Miter account is individually hosted on a user's personal and private third party server (host) - either purchased or free - as

Vije Miller 3 Jun 8, 2022
Sample application to bookmark links, where interface build with Angular.js + Twitter Bootstrap and server powered by PHP with Slim Framework

RESTful Bookmarks PHP Slim TODO: review and update FrontEnd Sample application to bookmark links, where interface build with Angular.js + Twitter Boot

Erko Bridee 50 Dec 15, 2021
Polonium is a world class old school ✍️ blog website made with Php and Tailwind 🌀

Polonium Polonium is a world class old school ✍️ blog website made with Php and Tailwind ?? to write dump articles about... Yeah I know, you should pr

Youness Idbakkasse 2 Jan 10, 2022