Skip to content

Releases: paperfoot/email-cli

v0.6.6

19 Apr 04:10

Choose a tag to compare

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

18 Apr 20:27

Choose a tag to compare

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

18 Apr 15:22

Choose a tag to compare

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

08 Apr 01:27

Choose a tag to compare

v0.6.3: Zero clippy warnings, cargo fmt across tree

v0.6.2

08 Apr 01:04

Choose a tag to compare

v0.6.2: Server-side 4xx error mapping + silent list truncation fix

v0.6.1

08 Apr 00:55

Choose a tag to compare

v0.6.1: Broadcasts, Topics, Segments, Properties + flat contacts API

v0.4.0 — Agent-quality release

05 Apr 05:41

Choose a tag to compare

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 payloadsinbox list, search, thread no longer return full HTML bodies (saves tokens)
  • archived field — 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 headers
  • inbox unarchive <ids...> — restore archived messages (bulk)
  • inbox stats — mailbox counts: total, inbox, unread, archived, sent
  • inbox 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_id and in_reply_to
  • Cursor ordering: (created_at DESC, id DESC) for stable pagination
  • Updated agent-info manifest 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-cli

v0.3.0

03 Apr 22:30

Choose a tag to compare

Install

curl -fsSL https://raw.githubusercontent.com/199-biotechnologies/email-cli/main/install.sh | sh

New Features

Menu Bar Daemon

email-cli daemon --interval 60

Shows ✉ 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 latest

RFC 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

  • --help exits 0 (was 3)
  • Consistent aliases: list/ls, delete/rm, create/new, get/show
  • Rewritten agent-info with workflow hints

v0.2.1

03 Apr 17:52

Choose a tag to compare

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

  • --notify flag on sync --watch and webhook listen — sends macOS desktop notifications (with sound) when new email arrives. Zero dependencies (uses osascript).

Usage

email-cli sync --watch --notify --interval 30

v0.2.0

03 Apr 16:48

Choose a tag to compare

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 Allreply --all preserves CC recipients. Computes To from Reply-To/From, CC from original To+CC minus self.
  • Send with threadingsend --reply-to-msg <id> auto-builds In-Reply-To/References from a local message for proper threading.
  • Forwardforward <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 / --version now exit 0 (was exit 3, breaking agent workflows)
  • Consistent subcommand aliases: list/ls, delete/rm, create/new, get/show
  • inbox sync convenience alias for top-level sync
  • Rewritten agent-info with categorized command map and workflow hints