shinbun (新聞) is a terminal-based RSS/Atom feed reader written in Rust, using ratatui and crossterm. It draws some inspiration from newsboat.
- RSS and Atom feed support
- Local SQLite cache for offline reading and persistent read state
- Tag-based feed organization
- Query feeds that aggregate entries across multiple feeds by tag
- Read/unread tracking with per-entry and per-feed bulk marking
- Hide/show read entries
- Open entries in a configurable browser or media player
- Vim-style keybindings
Requires Rust (stable). Clone the repository and build with cargo:
cargo build --releaseThe binary will be at target/release/shinbun.
Configuration files are stored in the platform config directory under shinbun/.
~/.config/shinbun/
%APPDATA%\shinbun\
Two files are used:
feeds.toml(required) – defines the feeds to subscribe toconfig.toml(optional) – UI settings, general options, and query feeds
Each feed is declared as a [[feeds]] entry. The link field is required. name and tags are optional.
[[feeds]]
link = "https://example.com/feed.xml"
[[feeds]]
link = "https://blog.example.org/rss"
name = "Example Blog"
tags = ["tech", "blog"]If name is set, it overrides the title provided by the feed itself.
[general]
browser = "firefox" # optional, defaults to system default
media_player = "mpv" # optional, defaults to system default
[ui]
show_borders = true # default: true
show_read_entries = true # default: true
[[queries]]
name = "Tech"
query = "tags:tech"
[[queries]]
name = "All"
query = "*"Query feeds aggregate entries from all feeds whose tags match the query. Use tags:tag1,tag2 to match specific tags, or * to match everything.
| Key | Action |
|---|---|
j / Down | Move down |
k / Up | Move up |
l / Enter / Right | Open / Enter |
h / Backspace / Left | Go back |
g g / Home | Go to top |
G / End | Go to bottom |
r | Refresh selected feed |
R | Refresh all feeds |
m | Toggle read / unread |
A | Mark feed as read |
u | Toggle hide read entries |
o | Open entry in browser |
p | Play media attachment |
e | Show feed errors |
? | Toggle help |
q | Quit |
Press ? inside the application to see the full keybinding reference.
Feed data and read state are cached in a SQLite database at shinbun/cache.db inside the config directory. Entries that age out of a feed’s remote source are preserved locally so history and read state are not lost. Feeds removed from feeds.toml are pruned from the cache on the next launch.
