{"id":14530509,"url":"https://github.com/guyfedwards/nom","last_synced_at":"2025-10-21T04:40:38.531Z","repository":{"id":65134438,"uuid":"580794699","full_name":"guyfedwards/nom","owner":"guyfedwards","description":"RSS reader for the terminal","archived":false,"fork":false,"pushed_at":"2025-10-18T21:45:59.000Z","size":11251,"stargazers_count":591,"open_issues_count":32,"forks_count":39,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-10-19T12:52:42.634Z","etag":null,"topics":["bubbletea","cli","golang","hacktoberfest","rss","terminal"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/guyfedwards.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-12-21T13:20:12.000Z","updated_at":"2025-10-18T21:45:31.000Z","dependencies_parsed_at":"2024-01-07T21:22:16.750Z","dependency_job_id":"3ca53b0f-c8e1-4a44-b1fc-0e16a9dd729b","html_url":"https://github.com/guyfedwards/nom","commit_stats":null,"previous_names":["guyfedwards/russ"],"tags_count":60,"template":false,"template_full_name":null,"purl":"pkg:github/guyfedwards/nom","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyfedwards%2Fnom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyfedwards%2Fnom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyfedwards%2Fnom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyfedwards%2Fnom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guyfedwards","download_url":"https://codeload.github.com/guyfedwards/nom/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyfedwards%2Fnom/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279959264,"owners_count":26251293,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-19T02:00:07.647Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bubbletea","cli","golang","hacktoberfest","rss","terminal"],"created_at":"2024-09-05T00:01:07.763Z","updated_at":"2025-10-21T04:40:38.526Z","avatar_url":"https://github.com/guyfedwards.png","language":"Go","readme":"# nom\n\n\u003e Feed me\n\n`nom` is a terminal based RRS feed reader using [Glow](https://github.com/charmbracelet/glow) styled markdown to improve the reading experience and a simple TUI using [Bubbletea](https://github.com/charmbracelet/bubbletea).\n\n- Local sync and offline reading\n- Backend connections (miniflux, freshrss supported)\n- Vim style keybindings for navigation\n- Plenty more features such as mark read/unread, filtering and feed naming\n\n![](./.github/demo.gif)\n\n## Install\n\nSee [releases](https://github.com/guyfedwards/nom/releases) for binaries. E.g.\n\n```sh\ncurl -L https://github.com/guyfedwards/nom/releases/download/v2.16.2/nom_2.16.2_darwin_amd64.tar.gz | tar -xzvf -\n```\n\nTo install the `nom` binary into `/usr/local/bin` (or into the location of your choice) in a single step:\n\n```sh\ncurl -L https://github.com/guyfedwards/nom/releases/download/v2.16.2/nom_2.16.2_darwin_amd64.tar.gz |\n  sudo tar -C /usr/local/bin -xvzf - nom\n```\n\n## Usage\n\n```sh\nnom # start TUI\nnom add \u003cfeed_url\u003e \u003coptional feed_name\u003e\nnom -h # see all available command and options\n```\n\n## Configuration\n\nConfiguration 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 configuration file with the `--config-path` (`-c`) flag:\n\n```sh\nnom -c my-custom-config.yml\n```\n\n### Feeds\n\nFeeds are added to the configuration file and have a url and an optional name:\n\n```yaml\nfeeds:\n- url: https://dropbox.tech/feed\n  # name will be prefixed to all entries in the list\n  name: dropbox\n- url: https://snyk.io/blog/feed\n```\n\nYou can also add feeds with the `add` command:\n\n```sh\nnom add \u003curl\u003e \u003coptional feed_name\u003e\n```\n\nFeeds are editable within `nom` by pressing `E` to open the configuration in your editor. You can configure which editor Nom will use by setting (in order of preference) your `$NOMEDITOR`, `$VISUAL`, or `$EDITOR` environment variable. After editing feeds, you will need to then refresh with `r`.\n\nAlternatively you can import feeds from an OPML file:\n\n```sh\nnom import \u003cpath/to/opml|url/to/opm;\n```\n\n#### YouTube feeds\n\nTo add YouTube feeds you can go to a channel and run the following in the browser console to get the rss feed link:\n\n```js\nconsole.log(\n  `https://www.youtube.com/feeds/videos.xml?channel_id=${\n    document.querySelector(\"link[rel='canonical']\").href.split(\"/channel/\")\n      .reverse()[0]\n  }`,\n);\n```\n\n### Show read (default: false)\n\nShow read items by default. (can be toggled with M)\n\n```yaml\nshowread: true\n```\n\n### Auto read (default: false)\n\nAutomatically mark items as read on selection or navigation through items.\n\n```yaml\nautoread: true\n```\n\n### Ordering\n\nSet the default sort ordering of the list\n\n```yaml\nordering: asc\n```\n\n### Filtering\n\nDefault 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`\n\n```yaml\nfiltering:\n  defaultIncludeFeedName: true\n```\n\n### Refresh interval\n\nBackground refresh interval in minutes. Setting this to anything but 0 will make `nom` refresh automatically.\n\n```yaml\nrefreshinterval: 5\n```\n\n### Theme\n\nTheme 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](https://github.com/charmbracelet/glamour/tree/master/styles/gallery) for previews and more info.\nColors can be hex or ASCII codes, they will be coerced depending on your terminal color settings.\n\n```yaml\ntheme:\n  glamour: dark\n  titleColor: \"62\"\n  titleColorFg: \"231\"\n  selectedItemColor: \"170\"\n  filterColor: \"#555555\"\n```\n\n### Backends\n\nAs 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.\n\n```yaml\nbackends:\n  miniflux:\n    host: http://myminiflux.foo\n    api_key: jafksdljfladjfk\n  freshrss:\n    host: http://myfreshrss.bar\n    user: admin\n    password: muchstrong\n    prefixCats: true # prefix feed name for freshrss entries\n```\n\n#### FreshRSS\n\nTo use freshrss you need to enable API access and set the API password explicitly, separate to your user password.\n\n1. To enable the API go to Settings \u003e Authentication \u003e Allow API access.\n1. You can set the API password in Settings \u003e Profile \u003e API password.\n\n### Openers\n\nBy default links are opened in the browser, you can specify commands to open certain links based on a regex string.\\\n`regex` can be any valid golang regex string, it will be matched against the feed item link.\\\n`cmd` is run as a child command. The `%s` denotes the position of the link in the command.\\\n`takeover` dictates if the command should takeover the tty from nom. E.g. for opening links in lynx or other TUI.\n\n```yaml\nopeners:\n- regex: \"youtube\"\n  cmd: \"mpv %s\"\n- regex: \".*\"\n  cmd: \"lynx %s\"\n  takeover: true\n```\n\n### Proxy support\n\nIf you need to use a proxy server for internet access, you can configure `nom`\nby setting the environment variables `HTTP_PROXY` and `HTTPS_PROXY` to point to\nyour proxy server:\n\n```sh\nexport HTTP_PROXY=https://proxy.example.com\nexport HTTPS_PROXY=https://proxy.example.com\nnom\n```\n\nFrom the [ProxyFromEnvironment documentation](https://pkg.go.dev/net/http#ProxyFromEnvironment):\n\n\u003e [Use a proxy] as indicated by the environment variables `HTTP_PROXY`,\n\u003e `HTTPS_PROXY` and `NO_PROXY` (or the lowercase versions thereof). Requests use\n\u003e the proxy from the environment variable matching their scheme, unless\n\u003e excluded by `NO_PROXY`.\n\u003e\n\u003e The environment values may be either a complete URL or a \"host[:port]\", in\n\u003e which case the \"http\" scheme is assumed.\n\n## Store\n\nNom uses sqlite as a store for feeds and metadata. It is stored adjacent to the configuration file 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, re-downloading all articles and no state.\n\nThe name of the sqlite file can be overridden in the configuration file, allowing you to have multiple configurations each with their own data store.\n\n```yaml\ndatabase: news.db\n```\n\n## Filtering\n\nWithin the `nom` view, you can filter by title pressing the `/` character. Filters can be applied easily. Here's some examples:\n\n- `f:my_feed feed:my_second_feed` - matches `my_feed` and `my_second_feed`\n- `feedname:\"my feed - with spaces\"` - matches `my feed - with spaces`\n- `feed:'my feed, with single quotes!'` - matches `my feed, with single quotes!`\n- `feed:my\\ feed\\ with\\ escaped\\ spaces!` - matches `my feed with escaped spaces!`\n\n### Include feedname in filtering\n\nIf you want to include the feed name 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`.\n\n## Building and Running via Docker\n\nBuild nom image\n\n```sh\ndocker build -t nom .\n```\n\nThis embeds the local `docker-config.yml`` file into the container and will be used by default.\n\nRunning Nom via docker\n\n```sh\ndocker run --rm -it nom\n```\n\nUse the `-v` command line argument to mount a local configuration onto `/app/docker-config.yml` as desired:\n\n```sh\ndocker run --rm -it -v $PWD/my-nom-config.yml:/app/docker-config.yml nom\n```\n\n## Dev setup\n\nYou can use `backends-compose.yml` to spin up a local instance of [MiniFlux] and [FreshRSS] if needed for development.\n\n[miniflux]: https://miniflux.app/\n[freshrss]: https://www.freshrss.org/\n\n```sh\ndocker-compose -f backends-compose.yml up -d\n```\n","funding_links":[],"categories":["Applications","Go","\u003ca name=\"rss\"\u003e\u003c/a\u003eRSS"],"sub_categories":["RSS, News and Weather"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguyfedwards%2Fnom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguyfedwards%2Fnom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguyfedwards%2Fnom/lists"}