# *eilmeldung* TUI RSS reader

![GitHub Release](https://img.shields.io/github/v/release/christo-auer/eilmeldung)
![Crates.io Version](https://img.shields.io/crates/v/eilmeldung)
![AUR Version](https://img.shields.io/aur/version/eilmeldung)
[![made-with-rust](https://img.shields.io/badge/Made%20with-Rust-1f425f.svg)](https://www.rust-lang.org/)
[![Built With Ratatui](https://img.shields.io/badge/Built_With_Ratatui-555?logo=ratatui)](https://ratatui.rs/) 

![Screenshot of eilmeldung](docs/images/hero-shot.png) 

---

*eilmeldung* is

- *fast* in every aspect: non-blocking terminal user interface, (neo)vim-inspired keybindings, instant start-up and no clutter
- *stands* on the shoulder of *giants*: based on the news-flash library, *eilmeldung* supports many RSS providers, is efficient and reliable
- *powerful* and yet *easy to use out-of-the-box*: sane defaults which work for most, and yet configurable to meet anyone's requirements, from keybindings to colors, from displayed content to RSS provider
- for reading news like a pro: filter and search news with an easy-to-learn powerful *query language*, activate *zen mode* to focus on the article content and nothing else
- available on Linux, macOS, Windows and NetBSD
- based on the awesome [news-flash](https://gitlab.com/news-flash/news_flash) library.  

*eilmeldung* is German for *breaking news*


---

## Table of Contents

- [Showreel](#showreel)
- [Installation](#installation)
- [Quick Start](#quick-start)
- [Quick Reference](#quick-reference)
- [Documentation](#documentation)
- [Alternatives](#alternatives)
- [FAQ](#faq)
- [Credits](#credits)
- [Contributing](#contributing)

---

# Showreel

<img width="891" height="560" alt="eilmeldung-scaled" src="https://github.com/user-attachments/assets/1ada3b6b-aa7f-4a94-9684-2590186075d1" />

This video demonstrates
- basic (vim-like) navigation and reading
- *zen* mode: just show content
- opening an image link using `feh`
- creating new tags and tagging an article
- *filtering* and *searching* article list by using article queries
- *tagging* multiple articles by using an article query

---


# Installation 

**Quick install:**

- **Homebrew**: `brew tap christo-auer/eilmeldung  https://github.com/christo-auer/eilmeldung && brew install eilmeldung`
- **Arch (AUR)**: `paru -S eilmeldung` or `yay -S eilmeldung`
- **Scoop** (Windows): 
```
  scoop install eilmeldung
  ```
- **Cargo**: `cargo install eilmeldung --locked` (you need to install [build dependencies](docs/installation.md) first!)

**Important**: You need a [Nerd Font](https://github.com/ryanoasis/nerd-fonts)
compatible font/terminal for icons to display correctly! There is a
ASCII-compatible icon preset, however (see [Icon Set](docs/configuration.md#icon-set)).

For detailed installation instructions including Nix/Home Manager setup, see **[Installation Guide](docs/installation.md)**.

---

# Quick Start

1. **Install** eilmeldung (see above)
2. **Run** `eilmeldung` - you'll be guided through the initial setup
3. **Choose a provider** (select "Local" if you're new to RSS)
4. **Add feeds** with `c f` or import an OPML file with `:importopml path/to/file.opml`
5. **Sync** your feeds with `s`
6. **Start reading!** Use `j`/`k` to navigate up/down, `h`/`l` to navigate between panels, `o` to open articles in the browser, `z` to enjoy "zen mode"

Press `?` anytime to see all available commands!

For a comprehensive getting started guide, see **[Getting Started](docs/getting-started.md)**.

---

# Quick Reference

Here are some key bindings to get you started.

| Key             | Action                                                        |
| -----           | --------                                                      |
| `?`             | Show all key bindings (search with `/`!)                      |
| `s`             | Sync all feeds                                                |
| `j` / `k`       | Move down / up                                                |
| `h` / `l`       | Move between panels (left/right)                              |
| `o`             | Open article in browser, mark as read, jump to next unread    |
| `r` / `u`       | Mark as read / unread                                         |
| `m` / `v`       | Mark (star) / unmark article                                  |
| `/`             | Search articles                                               |
| `Ctrl-z`        | Undo last operation(s), see [undo](docs/commands.md#undo)     |
| `:`             | Open command line                                             |
| `q`             | Quit                                                          |
| `1` / `2` / `3` | Show all/only unread/only marked in feed list or article list |

**Tip:** Press `?` anytime to see all available commands, and use `/` in the help dialog to search!

**Another Tip**: Navigate to the article list and use `C-j`/`C-k` to move down/up in the feed list and use `M-k`/`M-j` to scroll the article content down/up. Of course, you can remap all keys to your liking.

---

# Documentation

Complete documentation is available in the `docs/` directory:

- **[Getting Started Guide](docs/getting-started.md)** - Setup and first steps
- **[Installation Guide](docs/installation.md)** - Detailed installation instructions
- **[Key Bindings Reference](docs/keybindings.md)** - Complete keybinding reference
- **[Commands Reference](docs/commands.md)** - All available commands.
- **[Pipe Command](docs/pipe.md)** - Piping articles through external commands
- **[Article Queries](docs/queries.md)** - Powerful search and filter syntax
- **[Configuration Guide](docs/configuration.md)** - Customize appearance and behavior
- **[Command Line Arguments](docs/cli_args.md)** - Available CLI options
- **[Breaking Changes and Migration Guide](docs/migration-guides.md)** - Migrate to new versions if updates broke something
- **[FAQ](docs/faq.md)** - Frequently asked questions

You can also ask your AI chatbot anything about `eilmeldung` by using the phrase *according to eilmeldung.org ...* 

<details><summary>Example prompts</summary>

according to eilmeldung.org...
  - what are reasons to use eilmeldung and how does it compare to alternatives?
  - how can I display images within articles?
  - how can I select articles and then mark them as read?
  - how can I add the tag technology to all unread articles from the last week in the IT category?
  - what are features I don't know?

*Note*: [eilmeldung.org](https://eilmeldung.org) simply delivers a [llms.txt](https://llmstxt.org/)

</details>

---

---

# Alternatives

Of course, there are many awesome alternatives to *eilmeldung*. Check them out!

- [newsboat](https://newsboat.org/) is the battle-proven classic
- [bulletty](https://github.com/CrociDB/bulletty) lets you decide where to store your articles as markdown files and has many more features.
- [feedr](https://github.com/bahdotsh/feedr) is a feature-rich terminal-based RSS feed reader written in Rust
- [russ](https://github.com/ckampfe/russ)  is a TUI RSS/Atom reader with vim-like controls and a local-first, offline-first focus.
- [elfeed](https://github.com/skeeto/elfeed) provides RSS in emacs
- [tuifeed](https://github.com/veeso/tuifeed), a terminal news feed reader with a fancy ui 

---

## FAQ

<details><summary>Expand to see the most frequently asked questions</summary>


### Which providers are supported?

See [news_flash_gtk for all supported providers](https://gitlab.com/news-flash/news_flash_gtk). 

### Does eilmeldung support smart folders?

Yes! Use queries in your feed list configuration. Example:

```toml
feed_list = [
  'query: "Important Today" #important unread today',
  'query: "Read Later" #readlater unread',
  "feeds",
]
```

### Can I customize keybindings and colors?

Absolutely! Everything is customizable via the [configuration file](docs/configuration.md). See `examples/default-config.toml` for all options.

### How do I save articles for later?

Create a tag (`:tagadd readlater red`), bind it to a key, and create a query in your feed list. See the [FAQ](docs/faq.md#how-can-i-save-articles-for-reading-later) for details.

### Can I hide feeds/categories/tags without unread/marked articles?

Yes, focus the feed list and press `2` / `3` to show only feeds/categories/tags with unread / marked articles, show all with `1`. Change the value of the configuration option `feed_list_scope` to either `all`, `unread` or `marked` to set the default value.

### When I mark an article as read, it disappears!?

By default, the article list shows only unread items. When you mark the article as read, it is automatically hidden. You can show `all` articles by focusing the article list and pressing `1`. If you want this to be the default, set `article_scope = "all"`. The same setting exists for the feed list (see previous item).

### Can I execute automatic operations after synchronisation/refresh?

Yes, via the option `after_sync_commands` [configuration](docs/configuration.md#after-sync_commands) for some recipes.

### Can I select articles and then mark them as read/unread/tag them etc.?

Yes, you can *flag* them by pressing `f` and then press `r` to mark all flagged articles as read. Similarly for `u`(unread), `m` (mark), `t` (tag), etc. Press `D` to remove all flags.

Checkout [FAQ](docs/faq.md#features--capabilities)!

### Is mouse input supported?

Yes, there is rudimentary mouse support with the option `mouse_support = true` (default is `false`). See [Mouse Support](docs/keybindings.md#mouse-support)]

### Does eilmeldung support AI/LLMs? All the cool RSS readers are doing it!

No, *eilmeldung* does not have AI/LLM support. However, you can use the [Pipe Command](docs/pipe.md) for piping the article content through an LLM via an external command (like opencode).

---

</details>

**More questions?** See the complete [FAQ](docs/faq.md).

---

# Credits
## Mentions

- [Orhun's Blog: 800 rust projects in 3 years](https://blog.orhun.dev/800-rust-projects/) (placed 21 based on a Mastodon analysis; very hondered to be on the same list as other such great and impressive rust projects!)
- Pick on [Linux Unplugged Episode 647 (2025-12-28)](https://linuxunplugged.com/647) (1:28:35) had some very kind things to say about *eilmeldung* shortly after the initial release:
> "[eilmeldung] is [...] beautiful. It's strange to say about a TUI [...] but it is actually very beautiful."


---

## Standing on the Shoulders of Giants

*eilmeldung* was inspired by other awesome programs and libraries:

- [news-flash](https://gitlab.com/news-flash/news_flash) library and [news-flash GTK](https://gitlab.com/news-flash/news_flash_gtk), a modern Gnome/GTK RSS reader, both implemented in rust
- [newsboat](https://newsboat.org/) which has been my TUI RSS reader of choice for many years
- [spotify-player](https://github.com/aome510/spotify-player), a TUI spotify music player written in rust. In particular, the theming system and how input is handled has been a great inspiration for *eilmeldung*
- [vifm](https://vifm.info/), [neomutt](https://neomutt.org/) with [notmuch](https://notmuchmail.org/) inspired the filtering and article query systems
- [neovim](https://neovim.io/) and [vim](https://www.vim.org/) for their philosophy on user input
- [ratatui](https://ratatui.rs/) and all its supporting libraries for creating the TUI

## On the use of LLMs in this Project

This project was built as an experiment in learning Rust through LLM use. LLMs were used as tutors (asking questions, not providing solutions) and for documentation, but every line of code was intentionally written to solve a problem I understood.

📖 Read more about the LLM development approach in [LLM Development](docs/llm-development.md).

---

# Contributing

Contributions are welcome! Please feel free to:

- Report bugs or request features via [GitHub Issues](https://github.com/christo-auer/eilmeldung/issues)
- Submit pull requests
- Improve documentation
- Share your configuration examples

---

# License

See [LICENSE](LICENSE) file for details.
