bahdotsh/feedr
A feature-rich terminal-based RSS/Atom feed reader written in Rust.
Feedr - Terminal RSS Feed Reader š°
Feedr is a feature-rich terminal-based RSS feed reader written in Rust. It provides a clean, intuitive TUI interface for managing and reading RSS feeds with elegant visuals and smooth keyboard navigation.
Demo
Features
- Dashboard View: See the latest articles across all your feeds, sorted chronologically
- Feed Management: Subscribe to and organize multiple RSS/Atom feeds
- Starred Articles: Save articles for later with a dedicated starred view
- Categories: Organize feeds into custom categories with create, rename, and delete support
- Advanced Filtering: Filter articles by category, age, author, read status, starred status, and content length
- Dual Themes: Switch between a dark cyberpunk theme and a light zen theme with
t - Live Search: Instantly search across all feed titles and article content
- Summary View: "What's New" screen shows articles added since your last session with per-feed stats
- Read/Unread Tracking: Persistent read state tracking across sessions
- Article Preview: Toggle an inline preview pane in the feed items view
- OPML Import: Bulk import feeds from OPML files via
feedr --import <file.opml> - Browser Integration: Open articles in your default browser
- Background Refresh: Automatic feed updates with configurable intervals and smart rate limiting
- Rate Limiting: Per-domain request throttling prevents "too many requests" errors (ideal for Reddit feeds)
- Vim-Style Navigation: Use
j/kalongside arrow keys for navigation - Rich Content Display: HTML-to-text conversion with clean article formatting
- Authenticated Feeds: Support for custom HTTP headers per feed (e.g.,
Authorization: Bearer ...) for private/authenticated RSS feeds - Compact Mode: Automatic compact layout for small terminals (ā¤30 rows), with manual
always/neveroverride in config - CLI Config Management: Get, set, and list configuration from the command line (
feedr config), or use the interactive TUI config editor (feedr config --tui) - Configurable: Customize timeouts, themes, UI behavior, and default feeds via TOML config
- XDG Compliant: Follows standard directory specifications for configuration and data storage
Installation
Prerequisites
- Rust and Cargo (install from https://rustup.rs/)
Using Cargo Install (Recommended)
cargo install feedrArch Linux (AUR)
Feedr is available on the AUR. Install it using your preferred AUR helper:
paru -S feedr
# or
yay -S feedrBuild from Source
git clone https://github.com/bahdotsh/feedr.git
cd feedr
cargo build --releaseThe binary will be available at target/release/feedr.
Usage
Run the application:
feedrOPML Import
Import feeds from an OPML file:
feedr --import feeds.opmlConfiguration Management
View and modify settings from the command line:
feedr config list # List all settings with current values
feedr config get ui.theme # Get a single value
feedr config set ui.theme light # Set a value (with validation)
feedr config --tui # Open interactive TUI config editorAvailable config keys use dot-notation (e.g. general.max_dashboard_items, network.http_timeout, ui.theme, ui.compact_mode). Run feedr config list to see all keys. Feed management (default_feeds) is only available through the TUI editor.
Quick Start
- When you open Feedr for the first time, press
ato add a feed - Enter a valid RSS feed URL (e.g.,
https://news.ycombinator.com/rss) - You can also press
1,2, or3to quickly add Hacker News, TechCrunch, or BBC News - Use arrow keys (or
j/k) to navigate andEnterto view items - Press
oto open the current article in your browser - Press
tto toggle between dark and light themes
Keyboard Controls
General Navigation
| Key | Action |
|---|---|
Tab |
Cycle forward through views |
Shift+Tab |
Cycle backward through views |
q |
Go back (quit from Dashboard) |
Ctrl+Q |
Quit from any view |
r |
Refresh all feeds |
t |
Toggle dark/light theme |
/ |
Search mode |
Dashboard View
| Key | Action |
|---|---|
ā/ā or k/j |
Navigate items |
Enter |
View selected item |
f |
Filter articles |
c / Ctrl+C |
Category management |
a |
Add a new feed |
s |
Toggle starred |
Space |
Toggle read/unread |
p |
Toggle preview pane |
o |
Open link in browser |
1/2/3 |
Quick-add demo feeds (HN, TechCrunch, BBC) |
Feed List View
| Key | Action |
|---|---|
q / h / Esc |
Go to dashboard |
ā/ā or k/j |
Navigate feeds |
Enter |
View feed items |
a |
Add a new feed |
d |
Delete selected feed |
Feed Items View
| Key | Action |
|---|---|
q / h / Esc / Backspace |
Back to feeds list |
Home |
Go to dashboard |
ā/ā or k/j |
Navigate items |
Enter |
View item details |
s |
Toggle starred |
Space |
Toggle read/unread |
o |
Open item in browser |
Item Detail View
| Key | Action |
|---|---|
q / h / Esc / Backspace |
Back to feed items |
ā/ā or u/d |
Scroll content |
Page Up / Page Down |
Scroll content (page) |
g |
Jump to top |
G / End |
Jump to bottom |
s / Space |
Toggle starred |
o |
Open item in browser |
Categories View
| Key | Action |
|---|---|
n |
Create new category |
e |
Rename category |
d |
Delete category |
Space |
Expand/collapse category |
h / Esc |
Back |
Filter Mode (press f on Dashboard)
| Key | Action |
|---|---|
c |
Filter by category |
t |
Filter by time/age |
a |
Filter by author |
r |
Filter by read status |
s |
Filter by starred status |
l |
Filter by content length |
x |
Clear all filters |
Configuration
Feedr supports customization through a TOML configuration file that follows XDG Base Directory specifications. You can edit the file directly, use feedr config get/set from the command line, or use feedr config --tui for an interactive editor.
Configuration File Location
- Linux/macOS:
~/.config/feedr/config.toml - Windows:
%APPDATA%\feedr\config.toml
The configuration file is automatically generated with default values on first run if it doesn't exist.
Available Settings
# Feedr Configuration File
[general]
max_dashboard_items = 100 # Maximum number of items shown on dashboard
auto_refresh_interval = 0 # Auto-refresh interval in seconds (0 = disabled)
refresh_enabled = false # Enable automatic background refresh
refresh_rate_limit_delay = 2000 # Delay in milliseconds between requests to same domain
[network]
http_timeout = 15 # HTTP request timeout in seconds
user_agent = "Mozilla/5.0 (compatible; Feedr/1.0; +https://github.com/bahdotsh/feedr)"
[ui]
tick_rate = 100 # UI update rate in milliseconds
error_display_timeout = 3000 # Error message duration in milliseconds
theme = "dark" # Theme: "dark" (cyberpunk) or "light" (zen)
compact_mode = "auto" # Compact layout: "auto", "always", or "never"
# Optional: Define default feeds to load on first run
[[default_feeds]]
url = "https://example.com/feed.xml"
category = "News"
# Authenticated feed with custom HTTP headers
[[default_feeds]]
url = "https://private.example.com/feed.xml"
[default_feeds.headers]
Authorization = "Bearer your_token_here"Configuration Options Explained
General Settings
- max_dashboard_items: Controls how many items are displayed on the dashboard (default: 100)
- auto_refresh_interval: Automatically refresh feeds at specified interval in seconds (0 disables auto-refresh)
- refresh_enabled: Master switch to enable/disable automatic background refresh (default: false)
- refresh_rate_limit_delay: Delay in milliseconds between requests to the same domain to prevent "too many requests" errors (default: 2000ms). This is especially useful for Reddit feeds and other rate-limited services.
Network Settings
- http_timeout: Timeout for HTTP requests when fetching feeds (useful for slow connections)
- user_agent: Custom User-Agent string for HTTP requests
UI Settings
- tick_rate: How frequently the UI updates in milliseconds (lower = more responsive, higher = less CPU usage)
- error_display_timeout: How long error messages are displayed in milliseconds
- theme: Choose between
"dark"(cyberpunk aesthetic with neon colors) or"light"(zen minimalist with organic colors). Can also be toggled at runtime witht. - compact_mode: Controls the compact layout for small terminals.
"auto"(default) enables compact mode when terminal height is ā¤30 rows,"always"forces compact mode, and"never"disables it. Compact mode uses single-line items, a minimal title bar, and an abbreviated help bar to maximize screen real estate.
Background Refresh Example
To enable automatic refresh every 5 minutes with rate limiting:
[general]
refresh_enabled = true
auto_refresh_interval = 300 # 5 minutes
refresh_rate_limit_delay = 2000 # 2 seconds between requests to same domainNote: Rate limiting groups feeds by domain and staggers requests to prevent hitting API limits. For example, if you have multiple Reddit feeds, they will be fetched with a 2-second delay between each request to avoid getting blocked.
Default Feeds
You can define feeds to be automatically loaded on first run:
[[default_feeds]]
url = "https://news.ycombinator.com/rss"
category = "Tech"
[[default_feeds]]
url = "https://example.com/feed.xml"
category = "News"Authenticated Feeds
Some RSS feeds require authentication or custom HTTP headers. You can configure per-feed headers:
[[default_feeds]]
url = "https://private.example.com/feed.xml"
[default_feeds.headers]
Authorization = "Bearer your_api_token"
[[default_feeds]]
url = "https://another-api.example.com/rss"
[default_feeds.headers]
X-API-Key = "your_api_key"
Cookie = "session=abc123"Headers are sent with every request for that feed, including refreshes.
Data Storage
Feedr stores your bookmarks, categories, read/unread state, and starred articles in:
- Linux/macOS:
~/.local/share/feedr/feedr_data.json - Windows:
%LOCALAPPDATA%\feedr\feedr_data.json
Backwards Compatibility
Feedr automatically migrates data from older versions to the new XDG-compliant locations. Your existing data will be preserved and automatically moved to the correct location on first run.
Dependencies
- ratatui: Terminal UI framework
- crossterm: Terminal manipulation
- reqwest: HTTP client (with gzip/deflate/brotli support)
- feed-rs: RSS and Atom feed parsing
- html2text: HTML to text conversion
- chrono: Date and time handling
- serde: Serialization/deserialization
- clap: Command-line argument parsing
- opml: OPML import support
- toml: Configuration file parsing
License
MIT
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request

