A modern RSS feed reader built with Node.js, EJS templating, SQLite database, and Tailwind CSS.
- Feed Management: Add, edit, and delete RSS feeds via a settings modal
- Aggregated View: View all items from all feeds in one place via the "All" feed
- Feed Sidebar: Browse individual feeds with unread counts
- Visual Indicators:
- Colored left border on cards indicates the source feed
- Gray border for read items
- Feed icons displayed in sidebar and on cards
- Item Cards:
- Display article title, description, and images
- Clickable to open in new tab
- Mark as read/unread functionality
- Full Content Fetching: Option to fetch and read full article content directly within the feed reader
- Mobile Responsive: Sidebar with hamburger menu toggle for mobile devices
- Progressive Web App (PWA): Installable web app
- Mark as Read by Scroll: Articles are automatically marked as read when scrolled out of view
- Auto Image Extraction: Automatically extracts images from RSS feeds
- Favicon Support: Auto-fetches feed icons or use custom icon URLs
- Auto Color Detection: Automatically extracts dominant color from feed icon (server-side, no CORS issues)
- Smart Icon Detection: Automatically detects icon when you enter feed URL
- Auto-Refresh: Feeds automatically refresh every 30 minutes via cron job. Articles older than 3 days are automatically removed.
- Keyword Filtering: RSS entries containing these keywords in their title or url will be filtered out and not added to the database.
- Dark Mode: Toggle between light and dark themes with persistent preference
![]() Mobile view of RSS Reader |
![]() Desktop view of RSS Reader |
![]() Expanded article |
|
![]() Light desktop view of RSS Reader |
- Backend: Node.js + Express
- Templating: EJS
- Database: SQLite (better-sqlite3)
- RSS Parsing: rss-parser
- Full Content Fetching: article-extractor
- Image Processing: Jimp (for color extraction) + icojs (for .ico conversion)
- HTTP Client: Axios (for fetching icons)
- Styling: Tailwind CSS (with dark mode)
- Scheduling: node-cron (for auto-refresh)
- Development: Nodemon + Concurrently
docker-compose up -dThe application will be available at http://localhost:6789
npm run dev# Build CSS
npm run build:css
# Start server
npm startThe application will be available at http://localhost:3000
GET /- Main page (all items or filtered by feed)GET /api/feeds- Get all feedsPOST /api/feeds/detect-icon- Detect icon and color from feed URLPOST /api/feeds- Create a new feedPUT /api/feeds/:id- Update a feedDELETE /api/feeds/:id- Delete a feedPOST /api/feeds/:id/refresh- Refresh a specific feedPOST /api/feeds/refresh-all- Refresh all feedsPOST /api/items/:id/read- Mark item as readPOST /api/items/:id/unread- Mark item as unread
- Add a Feed: Click the "Add Feed" button in the sidebar
- Configure Feed:
- Enter the feed title
- Enter the RSS/Atom feed URL and tab out - the icon and color will be auto-detected
- The icon URL and color fields will be automatically filled
- Manually adjust if desired
- Refresh Feeds:
- Click "Refresh All" to fetch latest items manually
- Feeds automatically refresh every 30 minutes in the background
- Browse Items:
- Click "All" to see items from all feeds
- Click individual feeds to filter by source
- Read Items: Click any card to open the article in a new tab
- Manage Read Status: Use "Mark Read/Unread" buttons to track reading progress
- Dark Mode: Click the sun/moon icon in the sidebar header to toggle dark mode
- Mobile: Use the hamburger menu (☰) to show/hide the sidebar on mobile devices
MIT




