Triage Joel's email inboxes via the joelclaw email CLI. Scan, categorize, archive noise, surface actionable items, and draft replies. Use when: 'check my email', 'scan inbox', 'triage email', 'what needs a reply', 'clean up inbox', 'archive junk', 'email summary', 'anything important in email', or any request involving email inbox review or cleanup.
90
88%
Does it follow best practices?
Impact
92%
2.87xAverage score across 3 eval scenarios
Advisory
Suggest reviewing before use
Scan Joel's email inboxes (Front), triage conversations by importance, archive noise, and surface items needing attention. All operations use the joelclaw email CLI.
gog gmail for triage — bricks@aihero.dev, VIP threads, and all inboxes are in Front.gog for Google Workspace operations (Calendar, Drive, Docs, etc.), not email triage.The search endpoint is GET /conversations/search/{url_encoded_query}.
Results sorted by last activity date (not configurable).
is: statusesopen, archived, assigned, unassigned, snoozed, trashed, unreplied, waiting, resolved
There is NO is:unread. Use is:unreplied for conversations where the last message was inbound.
Status conflicts (cannot combine):
archived ↔ open ↔ trashed ↔ snoozed (mutually exclusive)assigned ↔ unassigned (mutually exclusive)before:<unix_seconds> — messages/comments created before this timestampafter:<unix_seconds> — messages/comments created after this timestampduring:<unix_seconds> — messages/comments on same day as timestampFront does NOT accept before:YYYY-MM-DD — always convert to unix seconds.
The CLI --before and --after flags accept YYYY-MM-DD and convert automatically.
from:<handle> — sender (email, social handle)to:<handle> — recipient (includes to/cc/bcc)cc:<handle>, bcc:<handle> — specific fieldsrecipient:<handle> — any role (from, to, cc, bcc)from:a@x.com from:b@x.com → eitherfrom:a@x.com to:b@x.com → bothinbox:<inbox_id> — e.g. inbox:inb_41w25tag:<tag_id> — e.g. tag:tag_13o8r1assignee:<teammate_id> — e.g. assignee:tea_hjx3participant:<teammate_id>, author:<teammate_id>, mention:<teammate_id>, commenter:<teammate_id>contact:<contact_id>, link:<link_id>custom_field:"<name>=<value>"Bare words search subject + body. Phrases in quotes: "exact phrase".
Front search has no negation — no -from:, no NOT, no exclusion operators.
joelclaw email inbox # default: is:open, 50 results
joelclaw email inbox -n 100 # more results
joelclaw email inbox -q "is:open is:unreplied" # awaiting reply
joelclaw email inbox --from notifications@github.com # by sender
joelclaw email inbox --before 2026-02-01 # auto-converts to unix ts
joelclaw email inbox --after 2026-01-15 # auto-converts to unix ts
joelclaw email inbox --page-token "TOKEN" # pagination (from previous response)Flags can be combined:
joelclaw email inbox --from matt@totaltypescript.com --after 2026-02-01 -n 20joelclaw email archive --id cnv_xxxjoelclaw email archive-ids --ids cnv_abc,cnv_def,cnv_ghiRuns 10 concurrent requests. Best for triaging a page of results — grab the IDs of noise and blast them.
joelclaw email archive-bulk -q "is:open from:notifications@github.com" # dry run — shows count + sample
joelclaw email archive-bulk -q "is:open from:notifications@github.com" --confirm # execute
joelclaw email archive-bulk -q "is:open from:notifications@github.com" --limit 100 --confirm # batch sizejoelclaw email read --id cnv_xxx
joelclaw email read --id cnv_xxx --refresh # bypass local cachejoelclaw email read uses a local thread + attachment cache (default TTL: 60 minutes). Cache path: ~/.cache/joelclaw/email/. Use --refresh to bypass cache and force a fresh fetch from Front.
joelclaw email read returns:
result.conversation: {id, subject, status, from: {name, email}, date, tags}
result.messages[]: {id, from: {name, email}, date, is_inbound, body_preview (or body), attachments[]}
result.attachment_summary: {total, cached, metadata_only, cache_errors}
result.cache: {hit, source, cache_path, age_seconds, ttl_seconds}Message content is currently in body_preview, with a migration to body underway. Treat both as valid for backwards compatibility.
Correct extraction pattern (current field):
joelclaw email read --id cnv_xxx 2>&1 | jq '.result.messages[] | {from: .from.email, date: .date, body: .body_preview}'Backwards/forwards-compatible extraction pattern:
joelclaw email read --id cnv_xxx 2>&1 | jq '.result.messages[] | {from: .from.email, date: .date, body: (.body // .body_preview)}'joelclaw email inboxesjoelclaw email inbox -n 50Parse the JSON result. Each conversation has: id, subject, from (name + email), date, status, tags.
Useful follow-up queries:
joelclaw email inbox -q "is:open is:unreplied" -n 50 # awaiting reply
joelclaw email inbox --before 2026-01-01 -n 50 # old stuff to clean
joelclaw email inbox --from notifications@github.com # CI noise checkRead each conversation and decide its category based on sender, subject, and context. Do NOT use hardcoded domain lists. Use judgment:
Re:), questions, invitations to specific meetings, requests.Organize findings for Joel. Lead with what matters:
## 🔴 Reply needed (N)
- **Name** — Subject (why it needs a reply)
## ⚡ Actionable (N)
- **Sender** — Subject (what action)
## 📖 Read later (N)
- **Source** — Subject
## 🗑️ Archive candidates (N)
- Count by type (e.g., "14 marketing, 8 CI failures, 5 duplicate notifications")Fastest path for noise: scan a page, collect noise IDs, use archive-ids:
joelclaw email archive-ids --ids cnv_aaa,cnv_bbb,cnv_ccc,cnv_dddFor sender-based cleanup: use archive-bulk with from: filter:
joelclaw email archive-bulk -q "is:open from:notifications@github.com" --limit 100 --confirmRate limiting: Front allows ~50 req/s. If archiving large batches (>200), add pauses between batches or expect 429s. The CLI handles batching for archive-ids (10 concurrent), but archive-bulk iterates page-by-page and may hit limits on very large sets.
Read before deciding:
joelclaw email read --id cnv_xxxjoelclaw email inboxes lists them all with IDstea_hjx3secrets lease front_api_tokennext_page_token when more results exist; pass via --page-token[aih] subject prefix indicates AI Hero project threads via bricks@aihero.dev Google Group. Key participants: Alex Hillman (alex@indyhall.org), Matt Pocock (mattpocockvoice@gmail.com), Amy Hoy (team@stackingthebricks.com). Treat as VIP: always surface, never archive.These are heuristics, not rules. Use judgment for each:
Re: prefix + real person sender (not a bot/noreply)[aih] prefix — AI Hero collaboration via bricks@aihero.dev (Alex Hillman, Matt Pocock, Amy Hoy). VIP: always surface, never archive.noreply@, no-reply@, notifications@ senders with no actionable contentRESOLVED in subject)These are historically high-volume, low-signal senders. Use archive-bulk with from: filter:
notifications@github.com — CI failures, dependabot, PR notifications
alerts@alerts.betterstack.com — resolved uptime alerts
no-reply@is.email.nextdoor.com — neighborhood spamAlways dry-run first to verify the query matches what you expect.
825972c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.