Skip to content
Education
Skill

/todo-queue

Process emails in a configured task label into Apple Reminders, including timing details. Requires macOS and connected email.

From plugin
claudeblattman
48229 skills7 agents2 commands

Claude Code

$ npx -y skills add chrisblattman/claudeblattman --skill todo-queue --agent claude-code

SKILL.md

todo-queue.SKILL.md
name: todo-queue
description: "Process emails in a configured task label into Apple Reminders, including timing details. Requires macOS and connected email."

Todo Queue

*v1.1 — Adapted for public use*

Batch-process emails in a designated Gmail label, converting them to Apple Reminders with timing extracted from the email body.

Usage

/todo-queue

Overview

This skill processes emails sent to `your-email+todo@gmail.com` (or manually labeled @ToSelf). It: 1. Searches for unread @ToSelf emails 2. Parses timing syntax from the email body 3. Creates Apple Reminders automatically (no confirmation needed) 4. Marks emails as read and archives them

**Note:** Auto-processing is enabled. Use `dryrun` argument to preview without creating.

**Platform note:** This skill uses `osascript` for Apple Reminders, which is **macOS-only**. On other platforms, you would need to replace Step 3 with a different reminder/task API.

Instructions

Step 1: Search for Pending Todo Emails

Search Gmail: `label:@ToSelf is:unread`

**If no emails found:**

No pending todo emails in @ToSelf.

To add emails to the queue:
- Forward any email to: your-email+todo@gmail.com
- Add timing in the body: "due:Friday" or "due:tomorrow list:Personal"

Stop here.

Step 2: Fetch and Parse Each Email

For each email found:

1. **Get email content** using `mcp__google_workspace__get_gmail_message_content`

2. **Extract task title:**

  • If forwarded email (subject starts with "Fwd:"): Use original subject, suggest "Review: [subject]" or "Reply to [sender] about [subject]"
  • If self-sent email: Use subject line directly
  • If subject contains "Re:": Suggest "Follow up on [topic]"

3. **Parse timing syntax from body** (case-insensitive, colon required):

| Syntax | Parsed As | |--------|-----------| | `due:tomorrow` | Tomorrow 9am | | `due:Friday` | Next Friday 9am | | `due:Feb 15` or `due:February 15` | Feb 15 9am | | `due:next week` | Next Monday 9am | | `due:3 days` or `due:in 3 days` | 3 days from now, 9am | | `due:2 weeks` | 14 days from now, 9am | | `time:2pm` or `time:14:00` | Overrides default 9am | | `list:Personal` | Personal list (default: Work) | | `list:Someday` | Someday list | | `list:Work` | Work list (explicit) | | `tag:#waiting` | Add #waiting tag | | `tags:#project #budget` | Multiple tags (space-separated) | | No timing found | No due date (task still created) |

**Parsing rules:**

  • Keywords can appear anywhere in email body
  • Multiple keywords on same line or different lines both work
  • Case-insensitive (`DUE:Friday` = `due:friday`)
  • Colon is required (`due:tomorrow` works, `due tomorrow` does not)
  • For forwarded emails, parse the ADDED text (before "---------- Forwarded message"), not the forwarded content

**Day name parsing:**

  • If today is Tuesday and body says `due:Friday`, that's Friday of THIS week (3 days away)
  • If today is Saturday and body says `due:Friday`, that's Friday of NEXT week (6 days away)
  • `due:Monday` when today is Monday means NEXT Monday (7 days away)

Step 3: Create Reminders (Auto-Processing)

**Process each email automatically** — no confirmation needed.

For each task:

1. **Create Apple Reminder** using osascript:

osascript -e '
tell application "Reminders"
    set targetList to list "[List Name]"
    set newReminder to make new reminder at end of targetList with properties {name:"[Task Title]", body:"[Gmail Link]\n\n[Any tags]"}
    [If due date:] set due date of newReminder to date "[formatted date]"
end tell
'

**Date format for osascript:** "February 7, 2026 at 9:00:00 AM"

**Gmail link format:** `https://mail.google.com/mail/u/0/#inbox/[message_id]`

2. **Archive the email:**

  • Remove INBOX label (if present)
  • Keep @ToSelf label (for history/audit trail)
  • Mark as read

Use `mcp__google_workspace__modify_gmail_message_labels` with:

  • `remove_labels: ["INBOX", "UNREAD"]`
  • Do NOT remove @ToSelf

Step 4: Report Results

COMPLETE

Created 3 reminders:
  1. Reply to [Name] about grant proposal → Work (due Fri Feb 7)
  2. Review proposal draft → Work (no due date)
  3. Book dentist appointment → Personal (due Mon Feb 10)

Processed emails archived (kept in @ToSelf for history)

To find these reminders:
- Mac: Reminders app → Work / Personal lists
- iPhone: Reminders app → Work / Personal lists

Arguments

  • `dryrun` — Show what would be created without actually creating
  • `limit:N` — Only process first N emails (default: all)

Examples

/todo-queue              # Process all pending
/todo-queue dryrun       # Preview only
/todo-queue limit:5      # Process first 5 only

Usage Examples (Email Side)

**Example 1: Forward with timing**

Forward email from a colleague to: your-email+todo@gmail.com
Add to body before forwarded content:
"due:Friday

---------- Forwarded message ----------"
→ Creates: "Reply to [Name] about [subject]" due Friday 9am in Work list

**Example 2: Self-email quick capture**

Send to: your-email+todo@gmail.com
Subject: Book flights for March trip
Body: "due:next week list:Personal"
→ Creates: "Book flights for March trip" due Monday in Personal list

**Example 3: No timing**

Forward email to: your-email+todo@gmail.com
Body: (empty, just forward)
→ Creates: "Review: [subject]" with no due date in Work list

**Example 4: Multiple tags**

Send to: your-email+todo@gmail.com
Subject: Review project budget
Body: "due:Feb 15 tags:#project #budget"
→ Creates: "Review project budget" due Feb 15 in Work list with tags

Error Handling

  • **No @ToSelf label found**: "Error: @ToSelf label not found. Check Gmail labels — see Customization Points below."
  • **Apple Reminders unavailable**: "Error: Could not create reminder. Emails NOT processed (still unread in @ToSelf)."
  • **Partial failure**: If some reminders fail, report which succeeded/failed. Leave failed emails unread.
  • **List doesn't exist**: Create in "Reminders" default list with no
Read more
@chrisblattman
Ships withclaudeblattman

Claude Code for professionals who don't code — Skills, agents, and setup guides

48229 skills7 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
482
Star history of chrisblattman/claudeblattman on GitHub, a chart by star-history.com

Other skills on claudeblattman.

ask-agents

ask-agents

Ask the specific Claude, Codex, Gemini, or Grok agent the user names and automatically retrieve its response. Use for targeted…

council

council

Develop independent approaches to a task, decision, plan, or draft, then use a fresh worker to synthesize them. Use for an…

done

done

Close out current work by saving decisions, unresolved tasks, useful artifacts, a session log and a current-state handoff for the…

kit-setup

kit-setup

Discover and test optional Claude, Codex, Gemini through Antigravity, and Grok subscription connections. Help with missing CLI or…

More skills from other plugins.

lesson-quiz

lesson-quiz

Test a learner on a single Claude Code tutorial lesson (01-10) with 10 questions, scoring answers and flagging weak spots. Use…

@luongnv89@luongnv89Install Skill
build-personal-skill

build-personal-skill

Evidence-based creation of a reusable personal course-making Skill from the user's own classroom and chat history. Use when the…

@thu-maic@thu-maicInstall Skill

Questions about todo-queue.

Which coding agents can use todo-queue?
todo-queue installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.