release: v3.5.0 - #66
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ri9XAwMqKiHLrDyTuA3np
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Minor bump: watching mail is new capability, nothing changed under existing callers.
Cargo.toml3.4.0 → 3.5.0, lockfile regenerated (cargo check --lockedpasses), changelog dated and linked. No version references in the README to chase.Changelog entry
[3.5.0] - 2026-08-28
Added
fastmail watch(#65,requested by @davidcelis in
#64). Blocks and
emits one JSON object per line as mail arrives, so incoming email can drive a
shell loop instead of a cron job that re-lists the inbox and diffs it by hand.
--mailboxnarrows to one folder,--fullincludes bodies, and--poll <seconds>swaps the push connection forperiodic checks where a long-lived one will not survive the network.
JMAP has offered the transport all along: the session advertises an
eventSourceUrl(RFC 8620 §7.3) that we parsed and threw away. The designdecision worth knowing is that push is only ever a wake-up. The
Emailstatecursor lives in the CLI, and every notification — or poll tick, or reconnect —
runs
Email/changesagainst it, so all three paths converge on the sameanswer and a lost notification costs latency rather than mail. When the server
has discarded history back past the cursor, the watcher resyncs and says so on
stderr rather than replaying the mailbox as new; stdout stays pure NDJSON
either way.
Only creations are reported. Reporting updates too would replay every flag
change and folder move as an arrival, which is not what a mail loop means by
"new".
The
emailsGraphQL subscription(#65), at
/graphql/streamover Server-Sent Events when the HTTP surface is up. Samewatcher as
fastmail watch, so the cursor semantics are identical rather thanmerely similar — the CLI and the subscription are two front ends on one
implementation, which is the only way they stay that way.
SSE rather than WebSockets: the subscription is a server-to-client firehose,
nothing is ever sent back up the socket, and SSE reconnects on its own.
MCP deliberately has none of this. Tools are request/response and a
subscription never returns, so the
graphqltool's description says so andpoints at the other two ways to get it.
[3.4.0] - 2026-08-17
Tag is yours to cut — nothing here creates or pushes one. The publish workflow triggers on the tag.