Repository navigation
Releases: pimalaya/carillon
Release list
v0.2.0
Added
-
Added
imap.alpn,jmap.alpn,caldav.alpnandcarddav.alpn.The ALPN identifiers offered during the TLS handshake,
[]skipping negotiation; unset keeps the protocol default. -
Added
proxyand<backend>.proxy.A SOCKS5 or HTTP proxy for every network backend,
all_proxyandhttps_proxybeing read when unset. -
Added
jmap.addressbookandjmap.calendar.One JMAP account watches contacts and calendar events beside its mail, over one connection, firing
on-card-*andon-event-*. -
Added the
msgraphbackend.Watches a Microsoft Graph mail folder, contact folder and calendar over one connection.
-
Added the
gmailbackend.Watches a Gmail label through its history.
-
Added the
gcalbackend.Watches a Google calendar through its sync token.
-
Added the
gpeoplebackend.Watches a Google contact group through its sync token.
-
Added
carillon json-schema.Generates the JSON Schema of a command's
--jsonoutput.
Changed
-
Renamed
completionsandmanualstocompletionandmanual, the plural staying as a hidden alias. -
Made
jmap.mailboxoptional, at least one JMAP collection being required. -
Offered the Microsoft Graph and Google APIs first in the wizard for a Microsoft or Google address.
-
Spawned a credential command once per checked account rather than once per backend.
Fixed
-
Fixed the leading tilde and shell variables of
<backend>.tls.certnot being expanded. -
Fixed the JMAP event stream never waking the watch up.
The stream is now dropped as soon as it pushes a state the watch does not hold, Fastmail never closing it.
v0.1.0
First release, renamed from mirador. The binary, the config directory, the CARILLON_CONFIG variable and the systemd unit all carry the new name; a prototype configuration only needs mv ~/.config/mirador ~/.config/carillon.
Added
-
Watched an IMAP mailbox, over a held RFC 2177 idle connection or a poll.
The watch is io-imap's own, so carillon owns no watcher, and it needs no QRESYNC: io-imap re-reads the mailbox and diffs locally against a server that lacks it.
imap.sasltakes one ofplain,login,anonymous,oauthbearer,xoauth2andscram-sha-256, and the RFC 4959 SASL-IR and RFC 2971 ID quirks are configurable for the providers that need them. -
Watched a JMAP mailbox, over the RFC 8620 event stream or an
Email/changespoll.The stream runs on a connection of its own, since a stream asked to close after each state change is the connection the server hangs up. A round that fails is retried once on a fresh connection.
-
Watched a local Maildir mailbox, re-listing it on an interval.
The mailbox is resolved through io-maildir's store, so a Maildir++ subfolder resolves and a wrong name fails at startup rather than watching a directory that does not exist.
.andINBOXboth name the root. -
Watched a CalDAV calendar and a CardDAV addressbook, polling an RFC 6578
sync-collectionreport.The report asks for etags only, so a poll carries no event and no contact. A calendar is asked which components it holds when the watch starts, so hooks it can never fire are refused there.
-
Fired a desktop notification, a shell command, or both, on every change.
Hooks live under the
hooktable of the backend that fires them (hooksalso reads), named after what that backend holds:on-message-*over IMAP, JMAP and Maildir,on-card-*over CardDAV,on-event-*andon-task-*over CalDAV, andon-flag-*wherever flags exist. Acmdis a string handed to the platform shell or a[program, args…]list spawned directly, and the placeholders reach it as environment variables either way. -
Checked every hook against what its backend and its event can carry, when the configuration is read.
A hook a backend can never fire is refused, and so is a notification naming a variable its event cannot fill.
$idis available everywhere, the collection under the name its backend configures it as ($mailbox,$calendar,$addressbook),$flagon a flag hook, and the envelope names on the IMAP and JMAP arrival hooks alone. Write${name:default}where a hook can do without the value. -
Reported flags under one set of names whatever the backend spells them as.
IMAP
\Seen, JMAP$seenand the MaildirSletter all arrive asSeen, so a filter written once fires everywhere. A flag hook fires once per flag that moved, andflags = [...]narrows it to the flags it lists. -
Resolved an arrival's envelope for
on-message-added, only when that hook is configured.IMAP fetches it on a second connection, never the one holding the watch. JMAP takes it from the
Email/getits round already makes, so an arrival costs no second request there. -
Watched every configured account at once, one thread each under a shared Ctrl+C shutdown.
-a/--accountnarrows the watch to one. A session that ends is reopened after a capped exponential backoff a healthy session resets, and the credential is resolved again on every attempt, so a rotated secret is picked up by the next reconnect. -
Generated a working account from one prompt with
carillon configure(aliaswizard).It discovers the services reachable from an email address, asks which one to watch and how to authenticate against it, collects the credential through the OS keyring and OAuth-broker picker, and tests the connection before writing anything. The IMAP mechanism menu is read from the server's own
CAPABILITY, and the watch method is never asked: an account takes the best one its backend has. A DAV account is completed from the server, its calendars or addressbooks listed under the home-set. The account is then saved, appended to the configuration already there, or printed on stdout. -
Offered that wizard from a bare
carillon, and from any command finding no configuration.The welcome names the file that is missing. Nothing prompts when stdin is not a terminal or when
--jsonis set: both get an error naming the file and the command that would create it. -
Validated an account against every backend it declares with
carillon check, opening each one the way a watch would. -
Read every secret from a command, so nothing has to be stored in the configuration.
Any CLI printing it on stdout works, such as
secret-tool lookup,pass showor an OAuth 2.0 broker like ortie. -
Shared the
[accounts.<name>]shape with himalaya and himalaya-tui.An account block is written the same way in the three, but one file does not load in all of them: every backend block is strict on each side and carries keys the others do not know.
-
Gated every backend behind its own cargo feature (
imap,jmap,maildir,dav, all on by default), and every TLS provider behindrustls-ring(default),rustls-aws,native-tlsandvendored. -
Generated the man pages and the shell completions, and shipped a systemd user unit.