Skip to content

markbiek/crispy-rss

Repository files navigation

CrispyRSS

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.

CleanShot 2026-04-28 at 11 05 56 CleanShot 2026-04-28 at 11 06 14

Features

  • 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)

Tech Stack

  • 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-feed for parsing, ezyang/htmlpurifier for sanitizing item content

Local Setup

composer setup        # composer install, .env, key:generate, migrate, npm install/build
composer run dev      # serve + queue worker + pail logs + vite, all in one terminal

To make yourself an admin after registering:

php artisan app:create-admin

Scheduled Jobs

routes/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 minutes
  • app:prune-old-items — daily
  • app:prune-orphaned-feeds — daily

A queue worker (php artisan queue:work or queue:listen) must also be running so dispatched FetchFeedJobs actually execute.

Tests

composer test

License

MIT.

About

A PHP-based, self-hosted RSS reader

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages