Releases: paperfoot/email-cli
Releases · paperfoot/email-cli
v0.6.6
v0.6.6: parallel sync, bounded cold start, live progress
On a 6-account config a full sync took 3m42s. Worse: the menu bar
status showed just a spinning glyph for the whole duration, so users
couldn't tell if it was working or hung. Root causes:
1. Accounts synced serially -- a 6x multiplier on wall time.
2. Cold-start pagination was unbounded -- if no cursor was stored,
the loop walked the entire Resend history, one detail call per
message. First sync of an active mailbox could take hours.
3. The daemon only knew "syncing yes/no", never "2 of 6 done".
Fixes:
* sync_once fans out one thread per account. Each thread opens its
own SQLite connection (rusqlite::Connection is !Sync); WAL mode
serialises the writes. Errors are collected per-account so one
bad account doesn't poison the rest of the batch.
* sync_sent_account and sync_received_account_with_details stop
after the first page when no cursor exists. Older history stays
on Resend; users can backfill manually if they want it.
* sync_progress() exposes (done, total) atomics. Daemon's NSTimer
tick reads them and renders "Syncing 3/6" in the menu bar badge
and "Syncing 3/6 · All accounts" in the status label.
Measured: same 6-account config went from 3m42s to 2.5s (after
cursors were set; cold start is now bounded by max-per-account
time instead of sum).
v0.6.5
v0.6.5: ship notifications, autostart, code cleanup - feat(notifications): embed EmailCLI.app, extract on first use so native UNUserNotificationCenter works for brew/cargo/curl installs - feat(autostart): LaunchAgent install/uninstall/status subcommands - refactor(daemon): consolidate daemon_sync onto the shared sync path - chore: delete dead code and the stale notify binary; clippy with -D warnings passes - docs(readme): daemon + autostart + notification-bundle explainer
v0.6.4
v0.6.4: reply --cc/--bcc + self-update org fix Bundles the reply cc/bcc feature (e4562f3) and the self-update org fix (e2f8aa8) into a release and refreshes crates.io metadata to the paperfoot repo URL (v0.6.3 was published before the migration, so its crates.io entry still points at the old org).
v0.6.3
v0.6.3: Zero clippy warnings, cargo fmt across tree
v0.6.2
v0.6.2: Server-side 4xx error mapping + silent list truncation fix
v0.6.1
v0.6.1: Broadcasts, Topics, Segments, Properties + flat contacts API
v0.4.0 — Agent-quality release
What's new
Agent-breaking bug fixes
- Errors to stdout — JSON error envelopes now go to stdout (not stderr) so agents always get the response
- Typed error codes — "not found" → exit 3, network errors → exit 1 (retryable), not just "internal_error"
- FTS triggers — search is now O(1) instead of rebuilding the entire index on every query
- Lean list payloads —
inbox list,search,threadno longer return full HTML bodies (saves tokens) archivedfield — now present in all message responses (was a ghost column)
New commands
inbox mark <ids...> --read/--unread— toggle read state (bulk)inbox thread <id>— conversation view via RFC 5322 headersinbox unarchive <ids...>— restore archived messages (bulk)inbox stats— mailbox counts: total, inbox, unread, archived, sentinbox delete/archive— now accept multiple IDs
Improvements
- Cursor pagination with
--after <id>+has_more+next_cursor - Bulk mutation responses:
{requested_ids, updated_ids, missing_ids} - Thread indexes on
rfc_message_idandin_reply_to - Cursor ordering:
(created_at DESC, id DESC)for stable pagination - Updated
agent-infomanifest with all new commands
macOS menu bar daemon
- Fixed menu item clicks (proper ObjC action targets via
define_class!) app.run()+finishLaunching()for correct AppKit event handling- NSTimer-based display refresh (live unread count updates)
- Optimistic UI: Mark All Read clears badge instantly
Install
cargo install email-cli
# or
brew install 199-biotechnologies/tap/email-cliv0.3.0
Install
curl -fsSL https://raw.githubusercontent.com/199-biotechnologies/email-cli/main/install.sh | shNew Features
Menu Bar Daemon
email-cli daemon --interval 60Shows ✉ in your macOS menu bar. Click for unread count, Sync Now, Quit. Sends desktop notifications with sound when new email arrives.
Self-Update
email-cli update --check # check for new version
email-cli update # download and install latestRFC 5322 Email Threading
- Message-ID generation for all outgoing mail
- Reply All (
reply --all) send --reply-to-msg <id>for threading- Forward command
- Desktop notifications (
--notify)
Agent UX
--helpexits 0 (was 3)- Consistent aliases: list/ls, delete/rm, create/new, get/show
- Rewritten agent-info with workflow hints
v0.2.1
Fixes (from Codex GPT-5.4 review)
- Reply-all to sent messages no longer replies to self
- References chain preserves thread ancestry per RFC 5322 §3.6.4
- Message-ID import falls back to raw header
- Empty-recipient guard on reply-all
- Address parsing handles quoted display names with commas ("Smith, John")
New
--notifyflag onsync --watchandwebhook listen— sends macOS desktop notifications (with sound) when new email arrives. Zero dependencies (uses osascript).
Usage
email-cli sync --watch --notify --interval 30v0.2.0
What's New
Email Threading (RFC 5322 compliant)
- Message-ID generation — Every outgoing email now includes a
<uuid@domain>Message-ID header, enabling proper thread chains. Previously sent emails had no Message-ID, breaking all downstream threading. - Reply All —
reply --allpreserves CC recipients. Computes To from Reply-To/From, CC from original To+CC minus self. - Send with threading —
send --reply-to-msg <id>auto-builds In-Reply-To/References from a local message for proper threading. - Forward —
forward <id> --to <addr>with Fwd: subject, forwarded-message header block, and original body. - Reply to sent messages — Can now reply to your own sent messages (continues conversation with original recipients).
Agent UX (from v0.1.1)
--help/--versionnow exit 0 (was exit 3, breaking agent workflows)- Consistent subcommand aliases:
list/ls,delete/rm,create/new,get/show inbox syncconvenience alias for top-levelsync- Rewritten
agent-infowith categorized command map and workflow hints