Skip to content

Templates, signatures and composing

A compose (compose, reply, reply-list, :template, :unsubscribe) opens a fields stage, aerc style: To, Cc, Bcc and Subject are structured fields edited in place, and From cycles through every configured identity with left/right or space rather than taking free text; replies preselect the identity the resolution engine picked. tab/shift-tab move between fields, enter advances and, on From, opens $EDITOR on the body alone; headers never pass through the editor. ctrl-e (or ctrl-h) toggles between the fields and the running editor, both ways, so one chord covers the round trip. esc backs out of the fields stage (to the review screen once one exists, else out of the compose). The stage's keys are always spelt out in the status line.

Leaving the editor lands on a review screen, Mutt style, showing the recipients, subject, seal plan, attachments and the first body lines; nothing is sent until confirmed there. Its keys:

y    send (seal per the plan, queue for antiphond)
e    edit the body again (ctrl-e works too)
h    edit the header fields again (ctrl-h works too)
a    add an attachment (path prompt, ~ expands)
d    remove the selected attachment
j/k  move the attachment selection
s    toggle signing for this message
x    toggle encryption for this message
q    close, asking first whether to save a draft
^c   stays on review; nothing is discarded

Attachments are read in full when added, so a bad path fails at the prompt (named error, then re-asked) rather than at send time. The message ships as multipart/mixed with base64 parts; the content type is inferred from the file extension, falling back to application/octet-stream, and signing or encryption wraps the whole multipart per RFC 3156.

q writes the compose, fields, plan and attachment paths included, to a file under store/drafts/ and names it in the statusline; :resume <path> reopens it on the fields stage exactly as saved (a vanished attachment file is reported and dropped).

OpenPGP at compose time

pgp_sign sets the default for mail sent from that identity; signing is off unless enabled. Before composing, :sign, :nosign, :encrypt and :noencrypt override the default for the next message only, and the compose statusline shows the resulting plan ([sign], [sign+encrypt]). Signing goes through gpg-agent, so pinentry and smartcards work as they do for gpg; the signer is the pgp_key fingerprint or, absent that, the agent key whose user ID carries the identity address.

Encryption requires a cert for every To and Cc address in the trusted keyring (.asc/.pgp files under the config directory's pgp/; see OpenPGP). If a cert is missing, signing fails, or the agent refuses, nothing is sent: the compose stays on the review screen and the statusline names the problem. Received multipart/encrypted mail is decrypted through gpg-agent when opened, and any signature inside is verified against the same keyring.

Machine state and data

State (nothing precious) goes to $XDG_STATE_HOME/antiphon, caches to $XDG_CACHE_HOME/antiphon, and the message store, index, operation log, outbox and sync state live under $XDG_DATA_HOME/antiphon/store, the path the vault mounts over from M6. antiphon doctor reports every resolved path and --init-store creates or repairs the store.