| Crates.io | gh-news |
| lib.rs | gh-news |
| version | 0.6.0 |
| created_at | 2026-01-18 09:43:26.404635+00 |
| updated_at | 2026-01-26 01:14:47.797276+00 |
| description | Terminal UI for GitHub notifications with filtering, preview, and auto-refresh |
| homepage | https://github.com/chmouel/gh-news |
| repository | https://github.com/chmouel/gh-news |
| max_upload_size | |
| id | 2052132 |
| size | 379,580 |
GitHub notifications TUI built with Rust and ratatui.
Install as a gh CLI extension (easiest):
gh extension install chmouel/gh-news
Then run it:
gh news
You need a GitHub token. The app looks for it in this order:
GH_TOKEN env varGITHUB_TOKEN env vargh CLI config at ~/.config/gh/hosts.yml (or $XDG_CONFIG_HOME/gh/hosts.yml)Easiest way is to just run gh auth login if you have the GitHub CLI installed. Otherwise set GH_TOKEN to your personal access token.
Just run it:
gh news
gh-news shows a loading screen while fetching notifications during start-up and manual refreshes.
-a, --all - Show all notifications (not just unread)-c, --config <PATH> - Use a custom config file instead of the default-f, --filter <PATTERN> - Only show notifications matching this regex-n, --max-notifications <N> - Limit how many to fetch-p, --participating - Only show notifications where you're participating/mentioned-r, --mark-read - Mark all notifications as read (non-interactive)-s, --static-display - Print notifications and exit (for scripts)--no-auto-mark-read - Disable auto-marking notifications as read when navigatinggh news --filter "my-org/my-repo" # Filter to specific repos
gh news --participating # Only things you're involved in
gh news --mark-read # Mark everything read:
gh news --static-display | grep "something" # List notifications without TUI
↑/↓ or j/k - Navigate notifications, or repository headers when repositories are collapsedHome/End - Jump to first/last notificationPageUp/PageDown - Page navigation (or scroll preview if shown)Enter - Open notification in browser and mark as read, or toggle repository collapse on headerso - Open notification in browser without marking as read. - Toggle read/unread status! - Pin/unpin notification (pinned appear at top)h - Collapse current repositorySpace - Toggle selection on notification (magenta checkmark)Esc - Clear selection (or quit if no selection)Enter - Open all selected + mark as reado - Open all selected without marking as read. - Mark all selected as readCtrl+A - Archive selected (or all if none selected)Ctrl+Alt+A - Toggle select all notifications in current repositoryA - Toggle showing read notificationsE - Expunge read notifications/ - Filter notifications (type to search, Enter to keep, Esc to clear)Tab - Cycle preview modes (Off → Horizontal → Vertical)J/K - Scroll preview (line by line)Shift+U/Shift+D - Scroll preview (5 lines)Ctrl+U/Ctrl+D - Scroll preview (page)1/2 - Focus pane 1 (list) / pane 2 (preview)M - Toggle auto-mark-read on scrollEsc or q or Ctrl+C - Quit application? - Show help↑/↓ or j/k - Scroll helpPageUp/PageDown - Page scroll helpHome/End - Jump to top/bottom of help/ - Search within help (type to filter, Enter to keep, Esc to clear)gh-news can be configured via a TOML file at ~/.config/gh-news/config.toml. All options are optional and have sensible defaults. CLI flags take precedence over config file settings.
See also the example config file here.
# API & Network
auto_refresh_interval = 120 # seconds, 0 to disable
api_timeout = 30 # seconds
max_notifications = 100 # limit notifications fetched
pagination_size = 50 # notifications per API page
# Default filters (same as CLI flags)
show_read = false # show read notifications (like --all)
participating_only = false # only participating (like --participating)
default_filter = "" # regex filter always applied
# Display
default_preview_mode = "vertical" # "off", "horizontal", or "vertical"
repos_collapsed = false # start with repos collapsed
# Behaviour
auto_mark_read = true # mark notifications read when navigating to them
# External commands
browser_command = "" # custom browser, e.g. "firefox" (uses system default if empty)
# Notification hooks
on_new_notification_command = "" # command to run when new notifications appear
# GitHub Enterprise (optional)
github_host = "github.com" # change for GHE, e.g. "github.mycompany.com"
Run a custom command when new notifications appear during auto-refresh:
on_new_notification_command = "/path/to/your/script.sh"
The command runs once per new notification with these environment variables:
| Variable | Description |
|---|---|
GH_NEWS_ID |
Notification ID |
GH_NEWS_TITLE |
Notification title |
GH_NEWS_REPO |
Repository name |
GH_NEWS_OWNER |
Repository owner |
GH_NEWS_TYPE |
Type (Issue, PullRequest, Discussion, etc.) |
GH_NEWS_REASON |
Reason (mention, review_requested, comment, etc.) |
GH_NEWS_URL |
Web URL (if available) |
GH_NEWS_UNREAD |
Read status (true/false) |
GH_NEWS_UPDATED_AT |
ISO 8601 timestamp (if available) |
Example: Desktop notification (Linux)
#!/bin/bash
notify-send "GitHub: $GH_NOTIFY_TYPE" "$GH_NOTIFY_TITLE"
Example: Sound alert
on_new_notification_command = "paplay /usr/share/sounds/freedesktop/stereo/message.oga"
Example: Conditional action
#!/bin/bash
if [ "$GH_NOTIFY_REASON" = "review_requested" ]; then
notify-send -u critical "Review Requested" "$GH_NOTIFY_TITLE"
fi
Note: For commands with complex arguments or shell features, use a wrapper script.
GH_TOKEN - GitHub personal access token (takes precedence over GITHUB_TOKEN)GITHUB_TOKEN - GitHub personal access token (fallback if GH_TOKEN not set)GH_NEWS_AUTO_REFRESH_INTERVAL - Auto-refresh interval in seconds (default: 120). Set to 0 to disable.