hey
install
source · Clone the upstream repo
git clone https://github.com/basecamp/hey-cli
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/basecamp/hey-cli "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/hey" ~/.claude/skills/basecamp-hey-cli-hey && rm -rf "$T"
manifest:
skills/hey/SKILL.mdsource content
/hey - HEY Email Workflow Command
CLI for HEY email: mailboxes, email threads, replies, compose, calendars, todos, habits, time tracking, and journal entries.
Agent Invariants
MUST follow these rules:
- Always use
for structured, predictable output--json - Authentication required for all data commands — run
firsthey auth login - HTML output is available via
for commands that return HTML content--html
Quick Reference
| Task | Command |
|---|---|
| List mailboxes | |
| List emails in a box | |
| Read email thread | |
| Reply to email | |
| Compose email | |
| Compose with CC/BCC | |
| List drafts | |
| List calendars | |
| List calendar events | |
| List todos | |
| Add todo | |
| Complete todo | |
| Uncomplete todo | |
| Delete todo | |
| Mark as seen | |
| Mark as unseen | |
| Complete habit | |
| Uncomplete habit | |
| Start time tracking | |
| Stop time tracking | |
| Current timer | |
| List time entries | |
| List journal entries | |
| Read journal entry | |
| Write journal entry | |
| Check auth status | |
| Print access token | |
| Launch TUI | |
Decision Trees
Reading Email
Want to read email? ├── Which mailbox? → hey boxes --json ├── List emails in box? → hey box <name|id> --json ├── Read full thread? → hey threads <topic_id> --json ├── Mark as seen? → hey seen <posting-id> ├── Mark as unseen? → hey unseen <posting-id> └── Launch interactive UI? → hey (no args, launches TUI)
Sending Email
Want to send email? ├── Reply to thread? → hey reply <topic_id> -m "message" │ └── Open editor? → hey reply <topic_id> (omit -m to open $EDITOR) ├── Compose new? → hey compose --to <email> --subject "Subject" │ ├── With body? → hey compose --to <email> --subject "Subject" -m "Body" │ ├── With CC? → add --cc <email> │ └── With BCC? → add --bcc <email> └── Check drafts? → hey drafts --json
Managing Todos
Want to manage todos? ├── List todos? → hey todo list --json ├── Add todo? → hey todo add "Task description" ├── Complete? → hey todo complete <id> ├── Uncomplete? → hey todo uncomplete <id> └── Delete? → hey todo delete <id>
Resource Reference
Email - Boxes
hey boxes --json # List all mailboxes hey box imbox --json # List emails in Imbox (by name) hey box 123 --json # List emails in box (by ID)
Box names:
imbox, feedbox, trailbox, asidebox, laterbox, bubblebox
Response format:
hey box returns {"box": {...}, "postings": [...]}. Each posting has: id (posting ID), topic_id (topic ID), name (subject), seen (read status), created_at, contacts, summary, app_url. Use topic_id for hey threads and hey reply.
Email - Threads
hey threads <topic_id> --json # Read full email thread hey threads <topic_id> --html # Read with raw HTML content
ID note:
hey box returns postings with an id (posting ID) and a topic_id (topic ID). hey threads and hey reply expect the topic ID — use topic_id directly. The app_url field also contains the topic ID as a fallback (e.g. https://app.hey.com/topics/123 → 123).
Email - Reply & Compose
hey reply <topic_id> -m "Thanks!" # Reply with inline message hey reply <topic_id> # Reply via $EDITOR hey compose --to user@example.com --subject "Hello" # Compose new (opens $EDITOR) hey compose --to user@example.com --subject "Hi" -m "Body" # With inline body hey compose --to alice@example.com --cc bob@example.com --bcc carol@example.org --subject "Project update" -m "Body" # With CC/BCC hey compose --subject "Update" --thread-id 12345 -m "msg" # Post to existing thread
Email - Seen/Unseen
hey seen 12345 # Mark posting as seen hey seen 12345 67890 # Mark multiple postings as seen hey unseen 12345 # Mark posting as unseen hey unseen 12345 67890 # Mark multiple postings as unseen
Takes posting IDs (the
id field from hey box output).
Drafts
hey drafts --json # List drafts
Calendars
hey calendars --json # List calendars (returns array of {id, name, kind}) hey recordings 123 --json # List events in calendar
Response format:
hey recordings returns recordings grouped by type (e.g. {"Calendar::Event": [...], "Calendar::Habit": [...], "Calendar::Todo": [...]}). Each recording has: id, title, starts_at, ends_at, all_day, recurring, starts_at_time_zone. Access by type key in jq, e.g. .["Calendar::Event"].
Todos
hey todo list --json # List all todos hey todo add "Task description" # Add a todo hey todo complete 123 # Mark complete hey todo uncomplete 123 # Mark incomplete hey todo delete 123 # Delete a todo
Habits
hey habit complete 123 # Mark habit complete for today hey habit complete 123 --date 2024-01-15 # Mark complete for specific date hey habit uncomplete 123 # Unmark habit for today
Habit IDs can be found via
hey recordings <calendar-id> --json.
Time Tracking
hey timetrack start # Start timer hey timetrack stop # Stop timer hey timetrack current --json # Show current timer hey timetrack list --json # List time entries
Journal
hey journal list --json # List journal entries hey journal read 2024-03-15 --json # Read entry by date hey journal write "Today's entry" # Write entry inline hey journal write # Write entry via $EDITOR
Authentication
hey auth login # Log in (browser-based OAuth) hey auth status # Check if authenticated hey auth logout # Log out
If a command fails with an auth error, run
hey auth status to check, then hey auth login to re-authenticate.