feedr

bahdotshMIT更新放缓

用 Rust 写的终端 RSS/Atom 阅读器,带 TUI 界面,在命令行里就能订阅、聚合和阅读各类订阅源。

A feature-rich terminal-based RSS/Atom feed reader written in Rust.

v0.8.0发布于 2026-05-15 16:59 UTC449star19fork同步于 2026-11-07 07:33 UTC

怎么上手

由 README 提炼,执行前请确认
cargo install feedr
feedr
硬件要求按 README 说明

README 未说明具体硬件要求;作为终端 TUI 程序,需在支持终端中运行,内联图片仅在 Ghostty、Kitty、WezTerm 生效,其他终端静默跳过。

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

Rust 写的终端 RSS/Atom 阅读器,用 TUI 界面集中管理和阅读订阅源

用 Rust 写的终端 RSS/Atom 阅读器,带 TUI 界面,在命令行里就能订阅、聚合和阅读各类订阅源。

核心能力

  • 仪表盘按时间汇总所有订阅源的最新文章
  • 粘贴网页 URL 自动发现并订阅其 RSS/Atom 源
  • 支持分类树视图、星标收藏与已读状态持久化
  • 按分类、时间、作者、已读、星标、内容长度过滤文章
  • 用 Mozilla Readability 抓取全文,Kitty 协议内联显示缩略图

容易踩的坑

需先安装 Rust 和 Cargo 才能用 cargo install;内联图片依赖 Kitty 图形协议,其他终端不显示;后台自动刷新默认关闭,需在配置中开启 refresh_enabled 并设置间隔。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.8.0
  1. v0.8.0Feedr v0.8.0最新正式版2026-05-15 · 2026-05-15 16:59 UTC

    [0.8.0] - 2026-05-15

    🚀 Features

    • (detail): In-article find with smart-case matching (#44) (cc896aa)
    • Add external-command hooks (pipe-to, exec_on_new, macros) (#39) (4585381)
    • Full-text article extraction via Mozilla Readability (#43) (3715058)

    🐛 Bug Fixes

    • (summary): Stabilize "What's New" feed order with name tie-break (#38) (6b3efbf)

    📚 Documentation

    • Bring README in sync with v0.7.0 features (6a333e1)

    ⚙️ Miscellaneous Tasks

    • Ignore .claude/todos/ session files (d63dfed)
    • Bump version to 0.8.0 (193246a)

    [0.7.0] - 2026-03-31

    🚀 Features

    • Auto-discover RSS/Atom feeds from HTML pages (#35) (bd45c88)
    • Add help overlay, mark-all-read, tree view, mouse, and configurable keybindings (#36) (9b7d019)

    🐛 Bug Fixes

    • (config): Seed bookmarks from default_feeds on first launch (fa5d237)
    • (dashboard): Use filtered item list for navigation and actions (efad75b)
    • (dashboard): Use active item list for 'o' key and remove dead code (afed8a9)

    📚 Documentation

    • Update README and CLAUDE.md for v0.5.0 features (b441281)

    ⚙️ Miscellaneous Tasks

    [0.5.0] - 2026-03-06

    🚀 Features

    • (config): Add CLI subcommand for configuration management (b22d700)
    • Add back-navigation, authenticated feeds, and compact mode (7277bd4)

    [0.4.0] - 2026-03-04

    🚀 Features

    • Add live search with real-time filtering (29e1348)
    • Add "What's New" session summary view (e6d8563)
    • Add article preview pane in dashboard (2a7716e)
    • Add starred/saved articles with dedicated view and filtering (5642fb8)

    🐛 Bug Fixes

    • (add-feed-cursor): Zellij compatibility (11c160c)
    • Use user-created categories for filtering instead of hardcoded values (877fb12)
    • Consume keypress when dismissing error popup ([0db7e
  2. v0.7.0Feedr v0.7.02026-03-31 · 2026-03-31 09:49 UTC
    查看更新说明

    [0.7.0] - 2026-03-31

    🚀 Features

    • Auto-discover RSS/Atom feeds from HTML pages (#35) (bd45c88)
    • Add help overlay, mark-all-read, tree view, mouse, and configurable keybindings (#36) (9b7d019)

    🐛 Bug Fixes

    • (config): Seed bookmarks from default_feeds on first launch (fa5d237)
    • (dashboard): Use filtered item list for navigation and actions (efad75b)
    • (dashboard): Use active item list for 'o' key and remove dead code (afed8a9)

    📚 Documentation

    • Update README and CLAUDE.md for v0.5.0 features (b441281)

    ⚙️ Miscellaneous Tasks

    [0.5.0] - 2026-03-06

    🚀 Features

    • (config): Add CLI subcommand for configuration management (b22d700)
    • Add back-navigation, authenticated feeds, and compact mode (7277bd4)

    [0.4.0] - 2026-03-04

    🚀 Features

    • Add live search with real-time filtering (29e1348)
    • Add "What's New" session summary view (e6d8563)
    • Add article preview pane in dashboard (2a7716e)
    • Add starred/saved articles with dedicated view and filtering (5642fb8)

    🐛 Bug Fixes

    • (add-feed-cursor): Zellij compatibility (11c160c)
    • Use user-created categories for filtering instead of hardcoded values (877fb12)
    • Consume keypress when dismissing error popup (0db7ec3)
    • Correct input modal cursor for SearchMode and non-ASCII input (f80f33f)
    • Defer feed loading for instant TUI startup (b1bb367)

    📚 Documentation

    • Add AUR installation option to README (3e986f1)
    • Update README with new features and keyboard shortcuts (4c8a1d7)

    ⚡ Performance

    • Optimize hot paths for filtering, rendering, and searching (1f546eb)

    [0.3.0] - 2025-10-17

    🚀 Features

  3. v0.5.0Feedr v0.5.02026-03-06 · 2026-03-06 07:18 UTC
    查看更新说明

    [0.5.0] - 2026-03-06

    🚀 Features

    • (config): Add CLI subcommand for configuration management (b22d700)
    • Add back-navigation, authenticated feeds, and compact mode (7277bd4)

    [0.4.0] - 2026-03-04

    🚀 Features

    • Add live search with real-time filtering (29e1348)
    • Add "What's New" session summary view (e6d8563)
    • Add article preview pane in dashboard (2a7716e)
    • Add starred/saved articles with dedicated view and filtering (5642fb8)

    🐛 Bug Fixes

    • (add-feed-cursor): Zellij compatibility (11c160c)
    • Use user-created categories for filtering instead of hardcoded values (877fb12)
    • Consume keypress when dismissing error popup (0db7ec3)
    • Correct input modal cursor for SearchMode and non-ASCII input (f80f33f)
    • Defer feed loading for instant TUI startup (b1bb367)

    📚 Documentation

    • Add AUR installation option to README (3e986f1)
    • Update README with new features and keyboard shortcuts (4c8a1d7)

    ⚡ Performance

    • Optimize hot paths for filtering, rendering, and searching (1f546eb)

    [0.3.0] - 2025-10-17

    🚀 Features

    • (cli): Add import feeds from opml file option (44be804)
    • Add comprehensive TOML configuration file support (becc4a9)
    • Add background refresh with per-domain rate limiting (000dea1)
    • Add mark as read/unread toggle with animated notifications (74f2980)

    🚜 Refactor

    • Improve detail view scroll management and reduce duplication (8ecd367)
    • Make clippy happy (ece84a2)

    [0.2.0] - 2025-09-26

    🚀 Features

    • Add advanced filtering, category management, and global search (1771429)
    • Atom feeds support (9d03b71)
  4. v0.4.0Feedr v0.4.02026-03-04 · 2026-03-04 19:24 UTC
    查看更新说明

    [0.4.0] - 2026-03-04

    🚀 Features

    • Add live search with real-time filtering (29e1348)
    • Add "What's New" session summary view (e6d8563)
    • Add article preview pane in dashboard (2a7716e)
    • Add starred/saved articles with dedicated view and filtering (5642fb8)

    🐛 Bug Fixes

    • (add-feed-cursor): Zellij compatibility (11c160c)
    • Use user-created categories for filtering instead of hardcoded values (877fb12)
    • Consume keypress when dismissing error popup (0db7ec3)
    • Correct input modal cursor for SearchMode and non-ASCII input (f80f33f)
    • Defer feed loading for instant TUI startup (b1bb367)

    📚 Documentation

    • Add AUR installation option to README (3e986f1)
    • Update README with new features and keyboard shortcuts (4c8a1d7)

    ⚡ Performance

    • Optimize hot paths for filtering, rendering, and searching (1f546eb)

    [0.3.0] - 2025-10-17

    🚀 Features

    • (cli): Add import feeds from opml file option (44be804)
    • Add comprehensive TOML configuration file support (becc4a9)
    • Add background refresh with per-domain rate limiting (000dea1)
    • Add mark as read/unread toggle with animated notifications (74f2980)

    🚜 Refactor

    • Improve detail view scroll management and reduce duplication (8ecd367)
    • Make clippy happy (ece84a2)

    [0.2.0] - 2025-09-26

    🚀 Features

    • Add advanced filtering, category management, and global search (1771429)
    • Atom feeds support (9d03b71)
  5. v0.3.0Feedr v0.3.02025-10-17 · 2025-10-17 13:22 UTC
    查看更新说明

    [0.3.0] - 2025-10-17

    🚀 Features

    • (cli): Add import feeds from opml file option (44be804)
    • Add comprehensive TOML configuration file support (becc4a9)
    • Add background refresh with per-domain rate limiting (000dea1)
    • Add mark as read/unread toggle with animated notifications (74f2980)

    🚜 Refactor

    • Improve detail view scroll management and reduce duplication (8ecd367)
    • Make clippy happy (ece84a2)

    [0.2.0] - 2025-09-26

    🚀 Features

    • Add advanced filtering, category management, and global search (1771429)
    • Atom feeds support (9d03b71)

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    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.

    Feedr Terminal RSS Reader

    Demo

    Feedr Demo

    Features

    • Dashboard View: See the latest articles across all your feeds, sorted chronologically
    • Feed Management: Subscribe to and organize multiple RSS/Atom feeds
    • Feed Auto-Discovery: Paste any webpage URL and Feedr will detect and offer to subscribe to its 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
    • Tree View: Browse feeds in a hierarchical tree grouped by category
    • 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
    • Mark All Read: Quickly mark all visible items as read with m
    • Article Preview: Toggle an inline preview pane in the dashboard view, or have it open at launch with show_preview = true
    • Link Extraction: Extract and browse all links from an article with l
    • Full-Text Extraction: Strip away summaries and read the actual article content inline via Mozilla Readability — manual on Shift+F, or auto-extract on refresh per feed with fulltext = true
    • Inline Images: When an article has a <media:thumbnail> (e.g. YouTube channel feeds, web-comic RSS), Feedr renders it inline in the detail view via the Kitty graphics protocol. Auto-detected on Ghostty, Kitty, and WezTerm; silently no-ops elsewhere. Images are fetched in the background — read or open in browser without waiting.
    • Help Overlay: Press ? for a scrollable keybinding reference overlay
    • OPML Import: Bulk import feeds from OPML files via feedr --import <file.opml>
    • Browser Integration: Open articles in your default browser
    • Mouse Support: Click to select items and scroll with the mouse wheel
    • 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/k alongside 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/never override 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 Keybindings: Remap any key action via the [keybindings] section in config.toml
    • External-Command Hooks: Newsboat-style macros (pipe-to, exec) bound to keys, plus exec_on_new notifications fired per new item — all with shell-free argument templating
    • 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

    Using Cargo Install (Recommended)

    cargo install feedr
    

    Arch Linux (AUR)

    Feedr is available on the AUR. Install it using your preferred AUR helper:

    paru -S feedr
    # or
    yay -S feedr
    

    Build from Source

    git clone https://github.com/bahdotsh/feedr.git
    cd feedr
    cargo build --release
    

    The binary will be available at target/release/feedr.

    Usage

    Run the application:

    feedr
    

    OPML Import

    Import feeds from an OPML file:

    feedr --import feeds.opml
    

    Configuration 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 editor
    

    Available 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

    1. When you open Feedr for the first time, press a to add a feed
    2. Enter a valid RSS feed URL (e.g., https://news.ycombinator.com/rss)
    3. You can also press 1, 2, or 3 to quickly add Hacker News, TechCrunch, or BBC News
    4. Use arrow keys (or j/k) to navigate and Enter to view items
    5. Press o to open the current article in your browser
    6. Press t to toggle between dark and light themes

    Keyboard Controls

    All keybindings below show their defaults. You can remap any action via the [keybindings] section in your config file — see Configurable Keybindings.

    General Navigation
    KeyAction
    TabCycle forward through views
    Shift+TabCycle backward through views
    qGo back (quit from Dashboard)
    h / Esc / BackspaceGo back one view
    HomeReturn to Dashboard
    Ctrl+QQuit from any view
    rRefresh all feeds
    tToggle dark/light theme
    /Search mode
    ?Help overlay (scrollable keybinding reference)
    Dashboard View
    KeyAction
    ↑/↓ or k/jNavigate items
    g / G or EndJump to top / bottom
    EnterView selected item
    fFilter articles
    cCycle category filter
    Ctrl+COpen category management
    aAdd a new feed
    sToggle starred
    SpaceToggle read/unread
    mMark all items as read
    pToggle preview pane
    Shift+J / Shift+KScroll preview down / up
    oOpen link in browser
    1/2/3Quick-add demo feeds (HN, TechCrunch, BBC)
    Feed List View
    KeyAction
    q / h / EscGo to dashboard
    ↑/↓ or k/jNavigate feeds
    EnterView feed items
    SpaceExpand/collapse category (tree view)
    aAdd a new feed
    dDelete selected feed
    cAssign category to feed
    Feed Items View
    KeyAction
    q / h / Esc / BackspaceBack to feeds list
    HomeGo to dashboard
    ↑/↓ or k/jNavigate items
    g / G or EndJump to top / bottom
    EnterView item details
    sToggle starred
    SpaceToggle read/unread
    mMark all items as read
    oOpen item in browser
    Item Detail View
    KeyAction
    q / h / Esc / BackspaceBack to feed items
    ↑/↓ or k/jScroll content
    Ctrl+U / Ctrl+DScroll content (page)
    Page Up / Page DownScroll content (page)
    gJump to top
    G / EndJump to bottom
    sToggle starred
    oOpen item in browser
    lExtract and show all links
    Shift+FToggle/fetch full-text (Readability)
    Starred View
    KeyAction
    ↑/↓ or k/jNavigate items
    EnterView item details
    sRemove from starred
    oOpen item in browser
    Categories View
    KeyAction
    nCreate new category
    eRename category
    dDelete category
    SpaceExpand/collapse category
    EnterSelect category
    rRefresh
    ?Help
    h / Esc / qBack
    Filter Mode (press f on Dashboard)
    KeyAction
    cFilter by category
    tFilter by time/age
    aFilter by author
    rFilter by read status
    sFilter by starred status
    lFilter by content length
    xClear all filters
    Mouse Support
    ActionEffect
    Left clickSelect item
    Scroll up/downNavigate items

    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"
    show_preview = false           # Start with the dashboard preview pane open
    
    # 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 with t.
    • 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.
    • show_preview: When true, the dashboard preview pane is open at launch (default: false). The p key still toggles it at runtime. Note that the preview pane is always hidden while compact mode is active.
    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 domain
    

    Note: 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"
    
    # Optional per-feed refresh threshold (seconds). When this elapses since
    # the last refresh, the next auto-refresh tick is triggered — currently
    # all feeds are refreshed together (no true selective per-feed refresh).
    # Requires `general.refresh_enabled = true`.
    [[default_feeds]]
    url = "https://example.com/fast-feed.xml"
    refresh_interval = 60
    
    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.

    Full-Text Extraction

    Most RSS feeds ship only short summaries. Feedr can fetch the linked article URL and run Mozilla Readability (via the dom_smoothie crate) to extract the actual article body and render it inline.

    • Manual: in the article detail view, press Shift+F to extract the focused article. Press Shift+F again to toggle back to the original summary, or after a failure to retry.
    • Auto on refresh: set fulltext = true on a feed and Feedr will auto-extract newly-seen items on each refresh (same "no firehose" rule as exec_on_new — the first observation of a feed seeds silently).
    [[default_feeds]]
    url = "https://example.com/summary-only-feed.xml"
    fulltext = true
    

    Notes:

    • Extracted content is in-memory only — it is not persisted to disk. A restart re-extracts on demand.
    • Per-feed auth headers are not sent to the article URL (article URLs are typically third-party hosts; forwarding Authorization would leak credentials).
    • Pages with very short extracted bodies (likely JS-rendered or behind a wall) fail gracefully and fall back to showing the original summary.

    External-Command Hooks

    Feedr supports newsboat-style external commands for two workflows: macros (key-triggered chains that act on the focused article) and exec_on_new (a notification hook fired per newly-seen item after each refresh).

    Commands are not run through a shell. Templates are tokenized once at config load, and %X placeholders are substituted into individual argv tokens — feed content can never break out of an argument. For pipes, redirection, or globbing, write a small shell script and invoke that.

    Template Variables

    Expanded in every argv token of macro and hook commands:

    VariableExpands to
    %tArticle title
    %uArticle URL
    %aAuthor
    %dFormatted publish date
    %fFeed title
    %FFeed URL
    %mPrimary media URL (<media:content>, <enclosure>, or Atom <content src>)
    %MMIME type of the primary media
    %iFirst <media:thumbnail> URL on the item
    %%Literal %

    %m/%M/%i expand to the empty string when an item has no media — they're orthogonal to %u (no fallback). For YouTube channel feeds the watch-page URL is %u; the in-feed video URL is %m. For RSS podcasts the episode page is %u; the audio file is %m.

    Macros

    A macro binds a key to an ordered chain of steps. Trigger with <prefix><key> (default prefix is ,). Steps are separated by ;. An optional trailing -- "description" overrides the help-overlay label.

    [macros]
    y = 'open-in-browser ; pipe-to "yt-dlp %u"'
    w = 'pipe-to "wallabag-cli add %u" -- "Save to Wallabag"'
    n = 'pipe-to "tee /tmp/out.txt" stdin=metadata'
    
    # Media-rich feeds (YouTube channels, web comics, podcasts):
    v = 'exec "mpv %u" -- "Play in mpv"'         # YouTube: mpv resolves the watch URL via yt-dlp
    d = 'exec "yt-dlp -o ~/Videos/%(title)s.%(ext)s %u" -- "Download with yt-dlp"'
    p = 'exec "mpv %m" -- "Play media file"'     # Podcasts: direct .mp3 URL is %m
    i = 'exec "feh %i" -- "View thumbnail"'      # Web comics / YT thumbnails
    
    [macro_options]
    prefix = ","                  # the macro-prefix key
    pipe_default_stdin = "body"   # body | title | url | metadata | none
    

    Step kinds:

    • <action> — invoke a built-in action. Supported in macros: open-in-browser, toggle-star, toggle-read, mark-all-read, refresh, toggle-theme, extract-links, fetch-full-text, help.
    • pipe-to "cmd %u" [stdin=…] — suspend the TUI, run the command, and pipe article content to its stdin. stdin is one of body (default), title, url, metadata, or none.
    • exec "cmd %u" — spawn the command detached (no stdin, no terminal takeover).

    Chains halt on the first step error. Press Esc after the prefix to cancel; an unbound follow-up surfaces a "No macro bound" error. Macros are also rendered in the help overlay (?).

    exec_on_new Notifications

    Fire a command once per newly-seen item after each refresh. The first successful fetch of each feed seeds the seen-set silently — you do not get a firehose on initial load or first run.

    [hooks]
    exec_on_new = 'notify-send "New: %t" "%f"'
    

    Children are spawned detached so the TUI never blocks on them. Crash semantics are at-most-once: feedr persists the seen-set before spawning, so a kill mid-fire loses a notification rather than re-firing on the next launch. Prefer idempotent commands (e.g. wallabag-cli add is safe; mail-me is not).

    Security Notes
    • The shell is never invoked, so feed content in %t / %a / etc. cannot escape an argument.
    • Do not wrap your command in sh -c "... %t ..." — that reintroduces shell injection through item titles. Write a script file and invoke it instead.
    • ~ / $HOME / $VAR are not expanded — use absolute paths.
    • If a macro's command template has unbalanced quotes or names an unknown action, feedr surfaces a startup warning rather than failing silently at trigger time.

    Configurable Keybindings

    Remap any action by adding a [keybindings] section to your config file. Each action can be bound to a single key string or an array of keys:

    [keybindings]
    quit = "x"                          # Single key
    move_up = ["Up", "k", "w"]         # Multiple keys
    force_quit = "Ctrl+x"              # Modifier keys
    toggle_theme = "F5"                # Function keys
    

    Available actions:

    ActionDefaultDescription
    quitqGo back / quit from Dashboard
    force_quitCtrl+qQuit from any view
    backh, Esc, BackspaceGo back one view
    homeHomeReturn to Dashboard
    toggle_themetSwitch dark/light theme
    refreshrRefresh all feeds
    help?Show help overlay
    open_search/Enter search mode
    move_upUp, kNavigate up
    move_downDown, jNavigate down
    page_upPageUp, Ctrl+uPage up
    page_downPageDown, Ctrl+dPage down
    jump_topgJump to top
    jump_bottomG, EndJump to bottom
    selectEnterSelect / open
    add_feedaAdd new feed
    delete_feeddDelete selected feed
    toggle_readSpaceToggle read/unread
    toggle_starsToggle starred
    mark_all_readmMark all items as read
    open_in_browseroOpen in browser
    toggle_previewpToggle preview pane
    open_filterfOpen filter mode
    cycle_categorycCycle category filter
    open_category_managementCtrl+cCategory management
    assign_categorycAssign category to feed
    extract_linkslExtract links from article
    fetch_full_textShift+FToggle/fetch full-text (Readability)
    scroll_preview_upShift+K, Shift+UpScroll preview up
    scroll_preview_downShift+J, Shift+DownScroll preview down
    toggle_expandSpaceExpand/collapse in tree view
    next_tabTabNext view
    prev_tabShift+TabPrevious view

    Supported key formats: Single characters (q, ?, /), special keys (Enter, Space, Tab, Esc, Backspace, Up, Down, Left, Right, Home, End, PageUp, PageDown, Delete, F1–F5), and modifier combos (Ctrl+q, Shift+Tab, Alt+x).

    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
    • scraper: HTML parsing for feed auto-discovery
    • url: URL parsing and manipulation
    • dom_smoothie: Mozilla Readability port for full-text extraction
    • encoding_rs: Charset detection for non-UTF-8 article pages
    • shlex: Shell-style tokenization for macro/hook command templates

    License

    MIT

    Contributing

    Contributions are welcome! Please feel free to submit a Pull Request.

    1. Fork the repository
    2. Create your feature branch (git checkout -b feature/amazing-feature)
    3. Commit your changes (git commit -m 'Add some amazing feature')
    4. Push to the branch (git push origin feature/amazing-feature)
    5. Open a Pull Request