Changelog¶
Unreleased¶
- Added
initwizard — interactive command that generates server and client config files with feature toggles for GMAP, encryption, verification, auto-reply, rate limiting, and access control - Added per-mailbox contact blocking — server rejects messages from blocked senders with status 61 (Unauthorized Sender). Manage via
mail block/mail unblockCLI commands or a.blockedfile in the mailbox directory - Added unread tracking — server stores new messages with a
.gemmail.newsuffix (.gemmail.enc.newfor encrypted).mail listshows aNEWindicator and new message count.mail readmarks messages as read by removing the.newsuffix. GMAP sync preserves tags when files are renamed - Added server-side auto-reply — place a
.auto-replyfile in a mailbox directory to send automatic replies. Includes loop prevention ([Auto-Reply]subject detection) and per-sender rate limiting. Enable with[auto_reply]in server config - Added GMAP (Gemini Mailbox Access Protocol) support for remote mailbox access on a separate port
- Message retrieval (
/msgid/<id>), tag management (/tag/,/untag/), and deletion (/delete) - Per-mailbox JSON index (
.gmap.json) with auto-tagging (Inbox, Unread) and filesystem sync - Separate TLS context with client certificate authentication using Misfin identity certs
- Enable with
[gmap] enable = truein server config
- Message retrieval (
- Added mailing list support — server forwards messages to all subscribers when a mailbox contains
subscribers.txt. CLI commands:list create,list subscribers,list add,list remove. Enable with[lists]in server config - Added self-service mailing list subscription — users can send
subscribe,confirm <TOKEN>, orunsubscribeas the message body to a list address. Command messages are intercepted before the subscriber-only posting check and are never stored or forwarded - Added address verification for mailing list subscriptions —
list addnow sends a confirmation token by default (use--no-verifyto skip). Pending tokens are stored in a SQLite database (subscription_pending.db) with 24-hour expiry.list subscribersshows[confirmed]vs[pending]status.list removealso cleans up pending entries - Added SPKI-based sender verification as an alternative to probe-based verification. Uses a TOFU model for server TLS certificate public key hashes. Configure with
method = "spki"in[verification] - Added
verification spki listandverification spki clearCLI commands for managing the server SPKI cache - Added
mail searchcommand with per-field filters (--from,--subject,--body) and encrypted message support - Added
mail deletesupport for message indices in addition to file paths - Added
admin fixpermscommand to audit and fix mailbox directory permissions - Added
identity generate --installflag to register certificates for GMAP authentication and create the mailbox subdirectory - Added
identity_cert_dirserver config field for per-mailbox identity certificates used by GMAP - Added OS-user-based mailbox isolation —
mailcommands verify the current user owns the mailbox directory mail listno longer requires a directory argument — auto-detects from client config (~/.config/titlani/config.toml) and mailbox name from$USERmail readaccepts a message index (e.g.,titlani mail read 2) in addition to file paths, using the same ordering asmail listmail listoutput now includes a#index column for easy reference- Added client configuration file support (
[mail] mailbox_dir) at the XDG config path - New
--mailbox-dir/-doption onmail readfor index resolution
v0.1.0¶
Initial release.
- Misfin(C) wire protocol implementation (request/response parsing, status codes)
- Gemmail message format (addresses, timestamps, gemtext body)
- Identity certificate generation with Misfin-specific layout (USER_ID, CN, SAN DNS)
- Async client with TOFU support, redirect handling, and context manager
- Async server with two-phase buffering, file-based mailbox storage, and TOML config
- Middleware support via tlacacoca: rate limiting (token bucket) and access control (allow/deny lists)
- CLI commands:
send,serve,identity generate/info,tofu list/revoke,version