nom
Feed me
nom is a terminal based RRS feed reader using Glow styled markdown to improve the reading experience and a simple TUI using Bubbletea.
- Local sync and offline reading
- Backend connections (miniflux, freshrss supported)
- Vim style keybindings for navigation
- Plenty more features such as mark read/unread, filtering and feed naming

Install
See releases for binaries. E.g.
$ curl -L https://github.com/guyfedwards/nom/releases/download/v2.1.4/nom_2.1.4_darwin_amd64.tar.gz | tar -xzvf -
Usage
$ nom # start TUI
$ nom add <feed_url> <optional feed_name>
$ nom -h # see all available command and options
Config
Config lives by default in $XDG_CONFIG_HOME/nom/config.yml or $HOME/Library/Application Support/nom/config.yml on darwin.
You can customise the location of the config file with the --config-path flag.
Feeds
Feeds are added to the config file and have a url and name.
feeds:
- url: https://dropbox.tech/feed
# name will be prefixed to all entries in the list
name: dropbox
- url: https://snyk.io/blog/feed
You can also add feeds with the add command:
$ nom add <url> <optional feed_name>
Feeds are editable within nom by pressing E to open the config in your $EDITOR or $NOMEDITOR. After editing feeds, you will need to then refresh with r.
Youtube feeds
To add youtube feeds you can go to a channel and run the following in the browser console to get the rss feed link:
console.log(`https://www.youtube.com/feeds/videos.xml?channel_id=${document.querySelector("link[rel='canonical']").href.split('/channel/').reverse()[0]}`)
Show read (default: false)
Show read items by default. (can be toggled with M)
showread: true
Auto read (default: false)
Automatically mark items as read on selection or navigation through items.
autoread: true
Ordering
Set the default sort ordering of the list
ordering: asc
Filtering
Default to include the feedname prefix in filtering query. Removes need to use f:xxx for simple queries. This will mean that multi-feed filters won't work, e.g. f:xxx f:yyy
filtering:
defaultIncludeFeedName: true
Theme
Theme allows some basic color overrides in the feed view and then setting a custom markdown render theme for the overall markdown view. theme.glamour can be one of "dark", "dracula", "light", "pink", "ascii" or "notty". See here for previews and more info.
Colors can be hex or ASCII codes, they will be coerced depending on your terminal color settings.
theme:
glamour: dark
titleColor: "62"
titleColorFg: "231"
selectedItemColor: "170"
filterColor: "#555555"
Backends
As well as adding feeds directly, you can pull in feeds from another source. You can add multiple backends and the feeds will all be added.
backends:
miniflux:
host: http://myminiflux.foo
api_key: jafksdljfladjfk
freshrss:
host: http://myfreshrss.bar
user: admin
password: muchstrong
prefixCats: true # prefix feed name for freshrss entries
To use freshrss you need to enable API access and set the API password explicitly, separate to your user password.
- To enable the API go to Settings > Authentication > Allow API access.
- You can set the API password in Settings > Profile > API password.
Openers
By default links are opened in the browser, you can specify commands to open certain links based on a regex string.
regex can be any valid golang regex string, it will be matched against the feed item link.
cmd is run as a child command. The %s denotes the position of the link in the command.
takeover dictates if the command should takeover the tty from nom. E.g. for opening links in lynx or other TUI.
openers:
- regex: "youtube"
cmd: "mpv %s"
- regex: ".*"
cmd: "lynx %s"
takeover: true
Store
nom uses sqlite as a store for feeds and metadata. It is stored next to the config in $XDG_CONFIG_HOME/nom/nom.db. This can be backed up like any file and will store articles, read state etc. It can also be deleted to start from scratch redownloading all articles and no state.
Filtering
Within the nom view, you can filter by title pressing the / character. Filters can be applied easily. Here's some examples:
f:my_feed feed:my_second_feed - matches my_feed and my_second_feed
feedname:"my feed - with spaces" - matches my feed - with spaces
feed:'my feed, with single quotes!' - matches my feed, with single quotes!
feed:my\ feed\ with\ escaped\ spaces! - matches my feed with escaped spaces!
Include feedname in filtering
If you want to include the feedname in the default filtering query, use config.filtering.defaultIncludeFeedName: true. This simplifies the above f:xxx queries but means that you can't filter by multiple feeds at once, e.g. f:xxx f:yyy.
More filters to be added soon!
Building and Running via Docker
Build nom image
docker build -t nom .
This embeds the local docker-config.yml file into the container and will be used by default.
Running the nom via docker
docker run --rm -it nom
Use the -v command line argument to mount a local config onto /app/docker-config.yml as desired.
Dev setup
You can use the backends-compose.yml to spin up a local instance of miniflux and freshrss if needed for development.
$ docker-compose -f backends-compose.yml up
Debug logging
You can enable logging to a file using the DEBUGNOM env var. Passing any path will cause log calls to write there e.g. DEBUGNOM=debug.log