A terminal news aggregator written in Go. Browse RSS and Atom feeds in a beautiful TUI with tabbed windows and highly customizable themes.
- π° Multi-source news aggregation β fetch multiple RSS/Atom feeds concurrently
- ποΈ Tabbed windows β each tab shows a single news source
- β Add/remove sources β manage news sources at runtime and persist them
- π Article detail view β read the full article summary inline
- β¨οΈ Keyboard-driven β fully navigable without a mouse
- π Search β search across all loaded articles
- π Read tracking β track which articles you've already read
- β Bookmarks β bookmark important articles for later
- π·οΈ Categories β organize feeds by category
- π Auto-refresh β configurable automatic feed refresh
- π Summary view β see top articles from all feeds at once
- π Open in browser β quickly open articles in your default browser
- π¨ Highly customizable themes β BitchX-inspired ANSI styling with built-in presets
- β¨ Custom colors and markers β configure every visual element
termnews includes several built-in themes inspired by classic terminal applications:
| Theme | Description |
|---|---|
default |
Modern, clean appearance with rounded borders |
bitchx |
Classic IRC client style with ASCII art banners and double borders |
hacker |
Matrix-style green-on-black with ASCII art |
minimal |
Clean, distraction-free interface with no borders |
retro |
BBS-style with bold colors and heavy borders |
In your config.toml:
theme = "bitchx"You can customize any visual element by adding a [custom_theme] section:
theme = "default" # Start with a base theme
[custom_theme.colors]
primary = "14" # Bright cyan
secondary = "10" # Bright green
text = "7" # Silver
text_muted = "8" # Dark gray
error = "9" # Bright red
success = "10" # Bright green
link = "12" # Bright blue
unread = "10" # Bright green
bookmark = "11" # Bright yellow
category = "13" # Bright magenta
border = "14" # Bright cyan
header = "11" # Bright yellow
status_bg = "4" # Blue background
status_fg = "15" # White text
[custom_theme.borders]
style = "double" # Options: rounded, sharp, double, heavy, ascii, none, custom
separator = "β"
[custom_theme.markers]
unread = "[+]"
bookmark = "[*]"
loading = "[~]"
error = "[!]"
selected = "»»"
tab_separator = "β"
tab_active_left = "Β«"
tab_active_right = "Β»"
[custom_theme.header]
show = true
show_name = true
title = "TERMNEWS"
align = "center" # Options: left, center, right
banner = """
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βββ βββ βββ βββββ ββββ βββ βββββ ββ β
β βββ βββ βββ βββββ ββββ βββ βββββ ββ v1.0 β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
"""
[custom_theme.status_bar]
show = true
position = "bottom"
show_keys = true
key_separator = " β "
[custom_theme.article_list]
show_numbers = true
number_format = "%02dΒ»"
show_separators = true
separator_char = "β"
show_meta = true
compact = false
[custom_theme.tab_bar]
position = "top"
show_unread_count = true
unread_format = "[%d]"
max_tab_width = 15
truncate_suffix = ".."| Key | Action |
|---|---|
Tab / β |
Next source tab |
Shift+Tab / β |
Previous source tab |
β / j |
Move selection down |
β / k |
Move selection up |
Enter |
Open selected article |
r |
Refresh current feed |
R |
Refresh all feeds |
t |
Toggle auto-refresh |
s |
Summary view |
/ |
Search articles |
a |
Add a new news source |
d |
Delete the current news source |
b |
Toggle bookmark |
m |
Mark all as read |
o |
Open in browser |
? |
Show help |
q |
Quit |
| Key | Action |
|---|---|
β / j |
Scroll down |
β / k |
Scroll up |
b |
Toggle bookmark |
o |
Open in browser |
Esc / Backspace |
Back to article list |
q |
Quit |
On first run, a configuration file is created at:
- Linux/macOS:
~/.config/termnews/config.toml - Windows:
%APPDATA%\termnews\config.toml
refresh_interval_mins = 5
max_articles_per_feed = 50
theme = "bitchx"
show_read_status = true
[[sources]]
name = "Reuters Top News"
url = "http://feeds.reuters.com/reuters/topNews"
feed_type = "rss"
category = "World News"
[[sources]]
name = "Hacker News"
url = "https://news.ycombinator.com/rss"
feed_type = "rss"
category = "Tech"
[[sources]]
name = "My Atom Feed"
url = "https://example.com/feed.atom"
feed_type = "atom"| Option | Description | Default |
|---|---|---|
refresh_interval_mins |
Auto-refresh interval in minutes | 5 |
max_articles_per_feed |
Maximum articles shown per feed | 50 |
theme |
Built-in theme name | default |
show_read_status |
Track read/unread status | true |
| Theme | Style |
|---|---|
default |
Modern with rounded borders and subtle colors |
bitchx |
Classic IRC client with ASCII art and double borders |
hacker |
Matrix-style green terminal aesthetic |
minimal |
Clean, borderless, distraction-free |
retro |
BBS-style with bold colors and heavy borders |
rssβ RSS feedatomβ Atom feedautoβ Auto-detect feed type (recommended)
go install github.com/adamdb/termnews@latestgit clone https://github.com/adamdb/termnews.git
cd termnews
go build -o termnews .
./termnewsgo build -ldflags="-s -w" -o termnews .- Go 1.21 or later
If you've already installed termnews and want to pull the latest changes:
# Pull the latest changes from the repository
git pull
# Rebuild
go build -o termnews .- Bubble Tea β TUI framework
- Lip Gloss β Styling
- gofeed β RSS/Atom parsing
- BurntSushi/toml β TOML configuration