A self-hosted RSS reader built with Laravel. Subscribe to feeds, organize them into categories, and read them in a river-of-news view with per-user read/unread tracking.
- River-of-news reading view with infinite scroll and per-item read/unread state
- Per-user feed subscriptions with custom titles and category organization
- OPML import and export
- Feed auto-discovery from a site URL
- Background feed fetching every 30 minutes via scheduled queue jobs
- Automatic pruning of old items and orphaned feeds
- Admin approval flow for new user registrations, plus deactivation and feed-health views
- Failure tracking per feed (auto-skips feeds after 5 consecutive failures)
- PHP 8.3 / Laravel 13
- SQLite (default), database-backed queue, cache, and sessions
- Laravel Breeze for auth scaffolding
- Tailwind CSS 4 + Alpine.js, built with Vite
laminas/laminas-feedfor parsing,ezyang/htmlpurifierfor sanitizing item content
composer setup # composer install, .env, key:generate, migrate, npm install/build
composer run dev # serve + queue worker + pail logs + vite, all in one terminalTo make yourself an admin after registering:
php artisan app:create-adminroutes/console.php registers three scheduled commands. The system cron must run php artisan schedule:run every minute for these to fire:
app:fetch-all-feeds— every 30 minutesapp:prune-old-items— dailyapp:prune-orphaned-feeds— daily
A queue worker (php artisan queue:work or queue:listen) must also be running so dispatched FetchFeedJobs actually execute.
composer testMIT.