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.

This documents the configuration Antiphon understands today; keys arrive here in the same commit that makes them real. 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
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, ...)

[vault]
backend = "auto"           # auto | luks2 | apfs | gocryptfs
passphrase_cmd = "pass show antiphon/vault"  # unlock secret
idle_lock_minutes = 0      # seal after N client-less
                           # minutes; 0 = never
unlock = ["touchid", "yubikey", "passphrase"]

[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

[keys]
# action = "key sequence"; every action is rebindable
half-page-down = "ctrl-d"
sync = ",s"

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

Gallery themes: vespers (default), kanagawa-wave, catppuccin-mocha, gruvbox-dark, tokyo-night, nord, rose-pine. 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.

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 states a preference order; of the three methods, passphrase is the one that works today, so list it last and the others are tried first once they exist.

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