Configuration

Settings can be configured in the following ways, in order of priority:

  • Command line flag
  • Environment variables
  • Configuration file
  • Default value

The location of the configuration file can be specified using --config or the environment variable SYND_CONFIG_FILE.

By default, synd searches the following locations depending on the platform:

PlatformLocations
Linux$XDG_CONFIG_HOME/syndicationd/config.toml
$HOME/.config/syndicationd/config.toml
macOS$HOME/Library/Application Support/syndicationd/config.toml
Windows{FOLDERID_RoamingAppData}/syndicationd/config.toml

synd does not automatically create configuration files.

To create one, run:

synd config init > config.toml

To inspect the resolved configuration after flags, environment variables, configuration files, and defaults have been applied, use config view.

synd config view
synd config view -o json

Common Settings

FlagEnvironment variableConfiguration fileDefaultDescription
--configSYND_CONFIG_FILE-see aboveConfiguration file path
--logSYND_LOG_FILE[log.path]see synd config viewLog file path
--cache-dirSYND_CACHE_DIR[cache.directory]see synd config viewCache directory
--themeSYND_THEME[theme.name]ferraTheme name
--sqlite-dbSYND_SQLITE_DB[backend.sqlite_db]see synd config viewSQLite database path
--entries-limitSYND_ENTRIES_LIMIT[feed.entries_limit]200Feed entries to fetch
--browserSYND_BROWSER[feed.browser.command]-Command to browse feed
--browser-argsSYND_BROWSER_ARGS[feed.browser.args][]Command args to browse feed
--[keys.<layer>.keymap]built-in keymapCustom key bindings

Theme

The theme can be changed with --theme, SYND_THEME, or [theme.name]. Run synd --help to see the available values.

Log

The default log file path is based on ProjectDirs::data_dir(). Use synd config view to inspect the resolved output destination.

The log directives can be changed with the SYND_LOG environment variable.

SYND_LOG=synd=debug synd

Local Data

The local database path can be set with --sqlite-db, SYND_SQLITE_DB, or [backend.sqlite_db].

synd --sqlite-db ~/.local/share/syndicationd/synd.db

Additional Categories

To add a category, add the following content to the configuration file:

[categories.rust]
icon = { symbol = "R", color = { rgb = 0xF74C00 } }
aliases = ["rs"]

Keymap

Custom key bindings are configured in the config file and merged with the built-in keymap.

[keys.entries]
keymap = [
  { on = "j", command = "entries.next", desc = "Next entry" },
  { on = ["g", "g"], command = "entries.first", desc = "Go to first entry" },
  { on = "up", command = "no_op" },
]

See Keymap for layer names, command names, key notation, and merge behavior.

Keymap

synd key bindings are grouped by keymap layer. A layer is an active UI context, such as entries, feeds, or filter.

Custom Key Bindings

Key bindings can be customized in the configuration file under [keys.<layer>].

[keys.entries]
keymap = [
  { on = "j", command = "entries.next", desc = "Next entry" },
  { on = ["g", "g"], command = "entries.first", desc = "Go to first entry" },
  { on = "up", command = "no_op" },
]

on is either a single key string or an array of key strings for multi-key sequences. The example above binds g followed by g.

User keymaps are merged onto the default keymaps:

  • a binding with the same on in the same layer replaces the default binding
  • a binding with a new on is added to that layer
  • command = "no_op" disables that key sequence in that layer

desc is optional description metadata for the binding.

Commands are validated against the layer. For example, entries.next is valid in the entries layer, but not in the feeds layer.

Key names use the same notation as the default keymap, including enter, space, tab, backtab, esc, arrow keys, C-c for Control-C, S-t for Shift-T, and A-enter for Alt-Enter.

Configurable layers:

LayerContext
appAlways active application keys
globalAlways active normal keys
loginAuthentication screen
tabsTab navigation
entriesEntries tab
feedsFeeds tab
filterEntry/feed filter controls
unsubscribe-popupFeed unsubscribe confirmation
github-notificationsGitHub notifications tab
github-notification-filter-popupGitHub notification filter popup

category-filter and search-prompt are runtime-generated layers. Their dynamic bindings are managed by the application for now.

Commands

CommandLayer
no_opany layer
app.quitapp, global
theme.rotateglobal
login.authenticatelogin
login.provider.prevlogin
login.provider.nextlogin
tabs.prevtabs
tabs.nexttabs
entries.preventries
entries.nextentries
entries.firstentries
entries.lastentries
entries.reloadentries
entries.openentries
entries.browseentries
feeds.prevfeeds
feeds.nextfeeds
feeds.firstfeeds
feeds.lastfeeds
feeds.subscribefeeds
feeds.editfeeds
feeds.unsubscribefeeds
feeds.refresh-selectedfeeds
feeds.reloadfeeds
feeds.openfeeds
feeds.unsubscribe-popup.prevunsubscribe-popup
feeds.unsubscribe-popup.nextunsubscribe-popup
feeds.unsubscribe-popup.selectunsubscribe-popup
feeds.unsubscribe-popup.cancelunsubscribe-popup
filter.requirement.prevfilter
filter.requirement.nextfilter
filter.categoryfilter
filter.searchfilter
filter.closefilter
github-notifications.prevgithub-notifications
github-notifications.nextgithub-notifications
github-notifications.firstgithub-notifications
github-notifications.lastgithub-notifications
github-notifications.opengithub-notifications
github-notifications.open-and-donegithub-notifications
github-notifications.reloadgithub-notifications
github-notifications.mark-donegithub-notifications
github-notifications.mark-all-donegithub-notifications
github-notifications.unsubscribe-threadgithub-notifications
github-notifications.filter.opengithub-notifications
github-notifications.filter.closegithub-notification-filter-popup
github-notifications.filter.include-unread.togglegithub-notification-filter-popup
github-notifications.filter.participating.togglegithub-notification-filter-popup
github-notifications.filter.visibility-public.togglegithub-notification-filter-popup
github-notifications.filter.visibility-private.togglegithub-notification-filter-popup
github-notifications.filter.pr-open.togglegithub-notification-filter-popup
github-notifications.filter.pr-closed.togglegithub-notification-filter-popup
github-notifications.filter.pr-merged.togglegithub-notification-filter-popup
github-notifications.filter.reason-mentioned.togglegithub-notification-filter-popup
github-notifications.filter.reason-review-requested.togglegithub-notification-filter-popup

Default Key Bindings

KeyDescription
k/jMove up/down
ggGo to first
geGo to end
TabSwitch tab
EnterOpen entry/feed with web browser
SpaceOpen entry with text browser ($SYND_BROWSER)
aAdd feed subscription on the Feeds tab
eEdit subscribed feed on the Feeds tab
dDelete subscribed feed on the Feeds tab
rReload entries/feeds
h/lChange requirement filter
cActivate category filter (Esc to deactivate)
+Activate all categories on category filter
-Deactivate all categories on category filter
/Activate keyword search (Esc to deactivate)
qQuit app

Privacy Policy

Personal Information You Provide

When logging in using Google

The email address associated with your Google account.

When logging in using GitHub

The email address associated with your GitHub account.

Our Use of Personal Information

We use a hashed value of your email address as the user_id.
The email address is never used for any other purpose.
The email address is not persisted in the filesystem or sent to external services.
The user_id is recorded in logs and traces, which are deleted after 14 days.
The user_id is used for applying rate limits on API requests and as the key for persisting subscribed feed data.
The user_id is used for error and performance investigations.