Courier is a command-line tool for managing email, calendar, contacts, and chat from your terminal. It connects to your existing providers through a unified interface — no switching between browser tabs to check your schedule, fire off a quick reply, or message a teammate.
Download v1.3.0
| Platform | File |
|---|---|
| Windows x64 | CourierCli.exe |
| Windows ARM64 | CourierCli.exe |
| macOS x64 (Intel) | CourierCli |
| macOS ARM64 (Apple Silicon) | CourierCli |
| Linux x64 | CourierCli |
| Linux ARM64 | CourierCli |
On Linux/macOS, make the binary executable after downloading:
chmod +x CourierCli
What it does
- Mail — List, search, read, send, reply (with cc/bcc/attachments), create/send/delete drafts, download attachments, trash or delete messages, access shared mailboxes
- Calendar — View today's agenda, this week's events, create/update/delete events, manage attendees, quick-add from natural language, set reminders
- Meetings — Read Microsoft Teams meeting transcripts (speaker-labeled text, raw VTT, or structured JSON)
- Contacts — Search people by name or email across providers
- Chat — List chats, read and send messages, find or create 1:1 conversations, list spaces/channels, post to channels
- Auth — Browser-based OAuth login, multi-account support with aliases, status check, logout
Usage examples
# Mail
courier mail list
courier mail list --from boss@work.com --since 3d
courier mail read <message-id>
courier mail send --to someone@example.com --subject "Hello" --body "Hi there"
courier mail reply <message-id> --body "Thanks!" --cc team@work.com --attach report.pdf
courier mail draft create --to someone@example.com --subject "Draft" --body "Work in progress"
courier mail draft send <draft-id>
courier mail list --mailbox shared@work.com # shared mailbox (Microsoft)
# Calendar
courier cal today
courier cal week
courier cal create "Team Standup" --start "2026-03-01 09:00" --end "2026-03-01 09:30" --reminder 15
courier cal update <event-id> --attendees alice@work.com --remove-attendees bob@work.com
courier cal quick "Lunch with Alex tomorrow at noon"
# Meetings (Microsoft Teams)
courier meeting transcript <event-id>
courier meeting transcript <event-id> --raw
courier meeting transcript <event-id> -o json
# Contacts
courier contacts search "John Smith"
# Chat
courier chat list
courier chat send <chat-id> --body "Hello!"
courier chat spaces
courier chat post <space-id> --body "Update for the team"
Output formats
All commands support --output text, --output json, and --output jsonl for easy scripting and piping into other tools.
Provider support
Courier is built on a provider abstraction layer. Currently supported providers:
- Google Workspace — Gmail, Google Calendar
- Microsoft 365 — Outlook/Exchange mail (incl. shared mailboxes), calendar, Teams chat, Teams meeting transcripts, contacts/directory search
Multiple accounts from different providers can be used simultaneously. Read commands aggregate across all accounts by default.
Built with
.NET, System.CommandLine, Google APIs, Microsoft Graph SDK (MSAL)
Security & your credentials
Courier uses OAuth to connect to your mail, calendar, and chat providers — it never sees your password. After you authenticate, your OAuth tokens are stored locally at ~/.config/courier/ (Linux/macOS) or %APPDATA%/courier/ (Windows).
You are responsible for protecting that folder. Anyone with access to those files can read and send your email and access your calendar on your behalf. A few things worth knowing:
- Do not share your courier config directory or its contents with anyone
- On shared machines, make sure your home directory permissions are restricted (
chmod 700 ~) - If you believe your tokens have been compromised, revoke access immediately via your Google account permissions or Microsoft account permissions and run
courier auth logout - Courier does not transmit your tokens anywhere — all authentication data stays on your machine
Courier is provided as-is. Use it at your own risk and keep your local environment secure.
Changelog
[1.3.0] — 2026-05-28
Added
- Draft management —
mail draft create,mail draft send <id>,mail draft delete <id>for both providers.mail draft createaccepts the same flags asmail send(--to,--subject,--body,--cc,--bcc,--attach,--mailbox). The existingmail drafts(plural) command continues to list drafts.
[1.2.1] — 2026-05-28
Changed
- Error output now includes the exception type and full inner-exception chain (e.g.
Error: were unable to deserialize [GoogleApiException] -> ... [JsonReaderException]). SetCOURIER_DEBUG=1to also dump the stack trace — makes generic SDK errors actionable.
Added
- macOS targets (
osx-x64,osx-arm64) added to defaultpublish.sh.
[1.2.0] — 2026-05-07
Added
mail replynow accepts--cc,--bcc, and--attach— matchesmail sendsemantics while preserving threading on both Gmail and Microsoftcal updateattendee management —--attendees(repeatable add),--remove-attendees(repeatable, case-insensitive),--clear-attendees. Idempotent and order-aware (clear → remove → add)courier meeting transcript <event-id>— read Microsoft Teams meeting transcripts. Speaker-labeled text by default,--rawfor VTT,-o jsonfor structured entries.--transcript-idto disambiguate when a meeting has multiple transcripts- Shared mailbox support —
--mailbox <email>on allmailsubcommands routes through the target mailbox (Microsoft only). Requires Exchange-level access plus admin consent forMail.ReadWrite.SharedandMail.Send.Shared - New Microsoft Graph scopes:
OnlineMeetings.Read,OnlineMeetingTranscript.Read.All,Mail.ReadWrite.Shared,Mail.Send.Shared(all require tenant admin consent)
Fixed
cal createon Microsoft — Graph rejected the create body with “Invalid format” becauseBody = nullwas explicitly serialized and the datetime format was second-resolution. Now omitsBodywhen no description is provided and uses 7-decimal datetime format- Gmail dates showed
0001-01-01 00:00—DateTimeOffset.TryParseon RFC 2822 Date headers fails under non-English locales. Now usesMessage.InternalDate(epoch ms) as the authoritative source with InvariantCulture parse fallback - Meeting transcript content fetch — bypassed Kiota for the content endpoint with a raw
HttpClientGET that sets a singleAccept: text/vttand a bearer token from MSAL
[1.1.1] — 2026-03-05
Fixed
chat listno longer fails on Microsoft accounts — removed unsupported$orderby=lastUpdatedDateTimequery parametermail attachmentnow saves files using the original filename (e.g.TicketFast.pdf) instead of the attachment ID, which could exceed filesystem limitsmail attachmenthandles filename collisions with a counter suffix (e.g.file (1).pdf)
Added
mail attachment --out-file <path>option to specify a custom output filename
[1.1.0] — 2026-03-05
Added
- Contacts search —
courier contacts search <query>resolves people by name/email across providers (Microsoft People API with directory fallback) - Chat commands — provider-agnostic chat abstraction:
chat list,chat read,chat send,chat find,chat spaces,chat space-messages,chat post
Changed
- Breaking:
courier teamscommand replaced bycourier chat— Teams-specific operations are now behind the provider-agnostic chat interface
[1.0.3] — 2026-03-04
Fixed
- Calendar view commands (
cal events,cal today,cal week) now query all calendars instead of only the primary — events on secondary/shared calendars are included in results - Added
--calendaroption to calendar view commands to filter by a specific calendar ID
[1.0.2] — 2026-03-02
Added
- Microsoft Graph provider — full Outlook/Exchange support for mail and calendar via
courier auth login --as outlook --provider microsoft --calendaroption oncal create,cal update,cal delete, andcal quickto target a specific calendar by ID--reminder/--no-reminderoptions oncal createandcal update- Headless auto-detection — both providers detect headless environments and fall back to device code auth
Fixed
- Trimmed publish builds now preserve reflection metadata — fixes
Property Get method was not foundon Linux ARM64
[0.1.0] — 2026-02-28
- Initial release with Google provider (Gmail + Google Calendar)
- Multi-account support with aliases and default account
- Mail commands: list, search, read, send, reply, labels, drafts, trash, delete, attachments
- Calendar commands: today, week, events, list, create, update, delete, quick add
- Output formats: text, json, jsonl
- Self-contained single-file builds for win-x64, linux-x64, linux-arm64
