An RSS reader designed for maximum utility.
A simple desktop RSS reader application for Mac built with Electron. The application features a clean three-panel layout:
- Left sidebar: Feed subscriptions and folders
- Middle panel: Article list
- Right panel: Article preview/content
- Three-panel interface - Clean, intuitive layout with sidebar, article list, and preview pane
- Feed subscriptions - Add, edit, and delete RSS feed subscriptions
- Category organization - Organize feeds into custom categories/folders with custom icons
- Read/unread tracking - Automatic tracking of article read status with visual indicators
- Unread counts - Badge indicators showing unread article counts per feed and category
- All Articles view - View all articles from all feeds in chronological order
- Feed health monitoring - Visual status indicators for feed health (healthy/error states)
- Automatic feed refresh - Feeds are automatically refreshed on app startup
- Keyboard shortcuts - Vim-like navigation with J/K for article navigation, V to open in browser, R to refresh
- Sidebar toggle - Collapse/expand sidebar with
[and]keys for more reading space - Image toggle - Show or hide images in article previews for faster loading or cleaner reading
- Toast notifications - Non-intrusive visual feedback for app actions
- Article preview - Full article content display with proper HTML rendering
- External links - Open articles in your default browser with a single keypress
- OpenAI API key management - Secure, encrypted storage of API keys using AES-256-GCM
- Feature flags - Toggle individual features on/off to customize your experience
- Settings modal - Centralized configuration interface accessible from the sidebar
- Data Mirror with Markdown sync - Mirror all RSS data to an external directory, with option to convert to Markdown files with Obsidian-compatible frontmatter
- AI Article Summary - Generate AI-powered article summaries using OpenAI (requires API key and feature flag)
- Automatic updates - Background update checking and installation via electron-updater
- Data migration - Automatic data structure migrations when updating to new versions
- Data persistence - All feeds, articles, settings, and read states are stored locally
- Data Mirror - Mirror all data to a second directory for integration with personal knowledge management tools like Obsidian (requires feature flag)
- OPML import/export support
- Node.js (v18 or higher recommended)
- npm (comes with Node.js)
git clone https://github.com/busse/rss-util.git
cd rss-utilnpm installThis will install all required dependencies including Electron and the RSS parser.
npm startThe application will launch in a new window. On first launch, you'll see an empty state with no feeds subscribed.
- Click the "Manage" button in the top-left corner of the sidebar
- Click the "+ Add Feed" button
- Enter the RSS feed URL (e.g.,
https://example.com/feed.xml) - Optionally provide a custom name for the feed (otherwise it will use the feed's title)
- Select a category/folder if you want to organize it
- Click "Add Feed"
The feed will be fetched automatically and articles will appear in your reader.
- Go to the Feed Management page (click "Manage" in the sidebar)
- Click the "+" button next to "Categories" in the left sidebar
- Enter a category name and choose an icon
- Click "Add Category"
- When adding or editing feeds, select the category from the dropdown
Feeds can be organized into multiple categories to help you stay organized.
- Click on a feed in the left sidebar to view its articles
- Click on an article in the middle panel to read it in the preview pane
- Articles are automatically marked as read when you click on them
- Unread articles are shown in bold with an unread count badge
- Left Sidebar: Browse feeds and categories
- Middle Panel: View article list for the selected feed/category
- Right Panel: Read article content
- "All Articles": View all articles from all feeds in chronological order
The app includes powerful keyboard shortcuts for efficient navigation:
- J - Navigate to next article
- K - Navigate to previous article
- V - Open selected article in your default browser
- R - Refresh all feeds
- [ - Collapse sidebar for more reading space
- ] - Expand sidebar
- Escape - Close modals (Help, About, etc.)
These shortcuts work when you're not typing in an input field, allowing for quick navigation without using the mouse.
Use the image toggle button in the toolbar to show or hide images in article previews. This is useful for:
- Faster loading when on slower connections
- Cleaner reading experience
- Reducing bandwidth usage
The toggle state is indicated by the button appearance, and a toast notification confirms the action.
The app provides visual feedback through toast notifications for various actions:
- Image toggle on/off
- Feed refresh status
- Other user actions
Notifications appear briefly at the bottom of the screen and automatically dismiss.
Access the Settings area by clicking the Settings button (⚙️) in the sidebar footer. The Settings modal allows you to configure:
- Secure Storage: Your OpenAI API key is encrypted using AES-256-GCM encryption before being stored locally
- Show/Hide Toggle: Click the eye icon to reveal or hide your API key while entering it
- Usage: The API key will be used for AI-powered features (when implemented)
To configure your API key:
- Click the Settings button in the sidebar footer
- Enter your OpenAI API key in the "API Key" field
- Click "Save" to store it securely
The Settings area includes a feature flag system that allows you to enable or disable specific features:
- AI Article Summary: Enable AI-powered article summaries
- Data Mirror: Enable mirroring of all data to a second directory
Feature flags can be toggled on or off using the toggle switches in the Settings modal. Changes are saved immediately when you click "Save".
When the Data Mirror feature flag is enabled, a new section appears in Settings that allows you to:
- Select a Mirror Directory: Click "Browse..." to choose a directory where all RSS data will be mirrored
- Sync as Markdown (enabled by default): Toggle to convert data to Markdown files with Obsidian-compatible frontmatter instead of raw JSON files
- Clear Directory: Click the "✕" button to clear the selected directory
- Sync Now: Manually trigger a sync of all data to the mirror directory
The data is automatically synced to the mirror directory whenever any data changes (feeds, articles, read states, settings, etc.). This is useful for integration with personal knowledge management tools like Obsidian, Notion, or any other tool that can read Markdown or JSON files.
Note: The "Sync as Markdown" option is enabled by default, providing a more readable and organized format for your mirrored data. You can disable it to mirror raw JSON files instead.
Sync as Markdown Mode (Default):
When "Sync as Markdown" is enabled (the default), the mirrored data is organized into a clean folder structure and converted to Markdown files with Obsidian-compatible frontmatter properties:
articles/{feed-name}/- Individual article files, one per article, with full content and metadatafeeds/- Feed subscription files with URL, status, category, and update informationcategories/- Category/folder definition files
This format makes it easy to:
- Browse and search articles in your knowledge management tool
- Link between articles, feeds, and categories
- Use Obsidian's graph view to visualize your reading patterns
- Export or backup your RSS data in a human-readable format
Each Markdown file includes YAML frontmatter with properties like:
---
title: "Article Title"
link: "https://example.com/article"
author: "Author Name"
feed: "Feed Name"
pubDate: "2024-01-15T10:30:00Z"
read: true
tags:
- "Technology"
- "News"
type: article
---JSON Mode:
When "Sync as Markdown" is disabled, the following JSON files are mirrored directly:
feeds.json- Feed subscriptionscategories.json- Category/folder organizationread-states.json- Article read statussettings.json- Application settingsai-summaries.json- AI-generated summaries (if enabled)articles-{feedId}.json- Articles for each feed
The Feed Management page allows you to:
- Add, edit, and delete feeds
- Create and organize categories
- Refresh individual feeds or all feeds at once
- Monitor feed health status
- Import/export OPML files (coming soon)
The application includes automatic update functionality powered by electron-updater and GitHub Releases.
- Automatic Checking: The app automatically checks for updates on startup (after a 5-second delay) and then every 4 hours
- Update Notifications: When an update is available, a notification banner appears at the top of the application
- Download Progress: During download, you'll see a progress bar showing the download status
- Installation: Once downloaded, click the "Install & Restart" button to install the update and restart the app
- Data Safety: Your feeds, articles, and settings are automatically preserved during updates
- Updates are checked automatically in the background
- You can dismiss the update notification if you want to update later
- The app will continue to work normally even if you don't update immediately
- Updates are downloaded in the background and don't interrupt your reading
When updating to a new version, the app automatically runs data migrations to ensure your data structure is compatible with the new version. Migrations are:
- Automatic: Run on app startup before the main window opens
- Safe: Your data is preserved and transformed as needed
- Idempotent: Safe to run multiple times without issues
To build the application for distribution:
# Build for macOS (creates DMG)
npm run build:mac
# Build for all platforms
npm run buildThe built application will be in the dist/ directory.
The project uses semantic versioning (SEMVER). To bump the version:
# Patch version (1.0.0 → 1.0.1)
npm run version:patch
# Minor version (1.0.0 → 1.1.0)
npm run version:minor
# Major version (1.0.0 → 2.0.0)
npm run version:major-
Bump the version:
npm run version:patch # or minor/major -
Build the application:
npm run build:mac
-
Create a GitHub Release:
- Go to the GitHub Releases page
- Click "Draft a new release"
- Create a tag matching the version (e.g.,
v1.0.1) - Upload the DMG file from the
dist/directory - Publish the release
-
Auto-Update: Once the release is published, users with the app installed will automatically be notified of the update on their next check (or within 4 hours).
This project uses Electron to create a cross-platform desktop application. The main files are:
main.js- Electron main process (includes auto-updater and migration runner)index.html- Main reader interfacemanage.html- Feed management interfacepreload.js- Secure IPC bridge between main and renderer processesmigrations/- Data migration scripts for version upgrades
To regenerate screenshots for the README:
npm run screenshotsThis will create screenshots in the screenshots/ directory using Playwright.
When making breaking changes to data structures, create a migration file in the migrations/ directory:
- Create a file named
migration-X.Y.Z-to-A.B.C.js(where X.Y.Z is the from version and A.B.C is the to version) - Export an object with:
fromVersion: The version this migration starts fromtoVersion: The version this migration upgrades tomigrate(dataDir): An async function that performs the migration
Example migration structure:
module.exports = {
fromVersion: '1.0.0',
toVersion: '1.1.0',
async migrate(dataDir) {
// Migration logic here
// Read existing data, transform, write back
}
};Migrations should be idempotent (safe to run multiple times) and should preserve user data.
We welcome contributions! This project is pro-AI-assisted coding and engineering - we encourage and welcome contributions that leverage AI tools like GitHub Copilot, ChatGPT, Cursor, or any other AI coding assistants. If you used AI assistance in your contribution, that's great! Please mention it in your pull request.
For detailed contribution guidelines, please see CONTRIBUTING.md.
Quick start:
- Request Features: Open an issue on GitHub and describe the feature you'd like to see
- Report Bugs: Report issues via the Issues tab
- Submit Pull Requests: Fork the repository, make your changes, and submit a pull request
Important: All new features must include feature flags in the Settings so users can opt-in or opt-out. See CONTRIBUTING.md for details.
This project is licensed under the MIT License - see the LICENSE file for details.




