Skip to content

Configuration

The settings view

Most of what follows can be changed without leaving the client: :settings opens a tabbed view over accounts and the daily-driver preferences, walked through step by step in the settings view. The files below remain the source of truth; the settings view is a well-mannered editor of them, nothing more.

Everything lives under $XDG_CONFIG_HOME/antiphon (defaulting to ~/.config/antiphon on Linux and macOS alike):

config.toml          global settings
accounts/*.toml      one file per account
local.toml           per-machine overrides, loaded last
signatures/<name>    signature files referenced by name
templates/<name>     compose templates referenced by name

Templates named new and reply, when present, shape fresh composes and replies automatically; :template <name> opens a fresh compose from any named template. Tokens {from}, {name}, {date} and {quoted} expand; unknown braces pass through.

Parsing is strict: an unknown key fails with the file, the line, and the nearest valid key. Empty or relative XDG variables are ignored per the specification. No secrets belong in any of these files; passwords come from password_cmd.

local.toml holds the same keys as config.toml and wins where both set a value; defects in it are reported against local.toml.

config.toml

[ui]
theme = "vespers"          # or a gallery name, see below
reading_pane = "below"     # below | right | off
date_format = "%Y-%m-%d %H:%M"  # chrono strftime
composer = "embedded"      # embedded terminal pane for the
                           # editor, or "suspend" to hand the
                           # whole screen over
accounts_bar = "sidebar"   # sidebar | tabs; see below
list_rows = 7              # message rows when the reading
                           # pane is below; with "right" or
                           # "off" the list fills the height
                           # and this key does not apply
sidebar_width = 16         # columns, clamped to 10-40
headers = ["from", "to", "date", "subject"]
                           # headers the pager and reading
                           # pane show, in this order; any
                           # RFC 5322 name is legal, matched
                           # case-insensitively (x-mailer,
                           # message-id, ...)
inline_images = true       # render a message's images inline
                           # in the reading pane

[accounts]
order = ["work", "personal"]  # rank accounts; first is
                              # primary, see below

[export]
recipients = ["age1..."]   # age keys :export encrypts to;
                           # see the export guide

[compose]
request_dsn = false        # ask for a delivery status
                           # notification (RFC 3461) on new
                           # mail; toggle it per message on
                           # the review screen

[vault]
backend = "auto"           # auto | luks2 | apfs | gocryptfs
passphrase_cmd = "pass show antiphon/vault"  # unlock secret
yubikey_pin_cmd = "pass show antiphon/fido2-pin"  # FIDO2 PIN
idle_lock_minutes = 0      # seal after N client-less
                           # minutes; 0 = never
unlock = ["passphrase"]    # methods to try, in order:
                           # passphrase, touchid, yubikey

[sync]
interval_minutes = 2       # periodic daemon sync; 0 disables
idle = false               # IMAP IDLE push on each INBOX

[daemon]
autostart = true           # client starts antiphond if absent

[notifications]
enabled = true             # desktop notification on new mail
folders = ["INBOX"]        # folders that raise one; empty
                           # watches every folder
sound = false              # play a sound with the notification
speech = false             # speak the sender and subject

[keys]
# action = "key sequence"; every action is rebindable,
# see the keys page for the full action list
half-page-down = "ctrl-f"
sync = ",s"

[[saved_searches]]
name = "unread"
query = "tag:unread"

Built-in themes: vespers (default), kanagawa-wave, catppuccin-mocha, catppuccin-latte, gruvbox-dark, gruvbox-light, tokyo-night, nord, rose-pine, dracula, solarized-dark, solarized-light, one-dark, everforest-dark, ayu-dark, github-dark, monokai. :theme with no name lists them; truecolor terminal required.

In the message list the rendered date_format splits at its last space: the left part wears the theme's date colour, the right its time colour, whatever strftime pattern you set; a single-token format is coloured entirely as a date.

[accounts] order lists account names to place first, in that order, everywhere accounts appear: the sidebar, the tab bar, account cycling and unified queries. Unlisted accounts follow, alphabetically by file name. The first account is the primary: it is selected on startup, and a fresh compose in the unified view sends from it (a scoped view's fresh compose uses the account in view). Shift-J/K on the settings Accounts tab edit the same list in place.

accounts_bar chooses how accounts are presented: "sidebar" (the default) nests every account's folders in the sidebar, "tabs" puts a one-line bar of tabs above the panes instead; see appearance. The settings Essentials tab toggles it live.

The vault seals the store at rest (see the vault): antiphon vault create sets it up, passphrase_cmd supplies the unlock secret to antiphond, and an absent vault leaves the store an ordinary directory. unlock lists the methods to try in order, defaulting to ["passphrase"]. Enrol Touch ID on macOS with antiphon vault touchid-enrol, or a YubiKey with antiphon vault yubikey-enrol (a primary and a backup key both open the vault with one touch), then add touchid or yubikey to the list. The YubiKey's FIDO2 PIN comes from its own yubikey_pin_cmd, kept apart from passphrase_cmd so the two secrets never share a source. A hardware method that fails falls through to the next, never past the vault.

[export] recipients lists the age public keys the client's :export command encrypts to; the command refuses until at least one is set. The command line can encrypt to a passphrase instead; see export and archives.

[compose] request_dsn sets whether a new message starts with a delivery status notification (DSN, RFC 3461) requested, and defaults to false. The review screen's n toggles it per message, and a server only sees the request when it advertises the DSN ESMTP extension.

Compose behaviour (:sign overrides, templates, drafts) is covered with the rest of composing in templates and signatures and the writing guide.