# Today

> Today

- Skill: `matteotitta/today` (Agent Skill)
- Install (CLI): `npx skillmds@latest add matteotitta/today`
- Raw SKILL.md: https://api.skillmd.com/api/skills/matteotitta/today/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: matteotitta (https://skillmd.com/u/matteotitta)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/matteotitta/today

---


# /today — Daily productivity briefing

Pull a structured daily briefing from all connected productivity tools in one shot. Designed to replace the morning ritual of checking 4 separate apps.

---

## Claude Code Triggers

**Invoke this skill when user says:**
- "/today"
- "What's on my plate today?"
- "Morning briefing"
- "Daily summary"
- "What do I need to focus on?"

**Do NOT invoke when:**
- User asks about a single tool only (e.g., "check my email" → use Gmail MCP directly)
- User asks for a specific Linear issue or calendar event
- User wants to send an email or create a task (action, not briefing)

---

## Modes

### `/today` (default) — Morning briefing

Start-of-day overview. What happened overnight, what's coming up, what needs attention.

### `/today wrap` — End-of-day wrap-up

What was done today, what's still pending, what to prep for tomorrow.

### `/today focus` — Quick focus check

Minimal output. Just the top 3 things that need attention right now.

---

## Process

### Phase 1: Gather data (parallel)

Pull from all 4 sources simultaneously using parallel tool calls. Do NOT run these sequentially.

**1a. Gmail** — Use `mcp__google-workspace__search_gmail_messages`
- Morning mode: `query: "newer_than:12h"`, `page_size: 15`
- Wrap mode: `query: "newer_than:24h"`, `page_size: 20`
- Always pass `user_google_email: "matteo@genesysgrowth.com"`
- Then batch-fetch content for the returned message IDs using `get_gmail_messages_content_batch`

**1b. Calendar** — Use `mcp__google-workspace__get_calendar_events`
- Morning mode: today's events
- Wrap mode: today's events + tomorrow's first 3
- Always pass `user_google_email: "matteo@genesysgrowth.com"`
- Use calendar ID: `matteo@genesysgrowth.com`

**1c. Linear** — Use `mcp__plugin_linear_linear__list_issues`
- `assignee: "me"`, `limit: 15`
- Filter to active states: In Progress, In Review, Next Up
- Sort by priority (Urgent > High > Medium > Low)

**1d. Slack** — Use `mcp__claude_ai_Slack__slack_search_public_and_private`
- Morning mode: search for mentions in last 12 hours
- Wrap mode: search for mentions in last 24 hours
- Query: `from:me OR to:me` or recent channel activity

**1e. Recent decisions** — Pull from session recall index
```bash
python3.claude/hooks/session-indexer.py --decisions --days 1
```
- Morning mode: last 24h of decisions
- Wrap mode: today's decisions only
- If recall.db doesn't exist, skip this source silently

### Phase 2: Synthesize

Process raw data into a structured briefing. Apply these rules:

**Email triage:**
- Categorize: Action required / FYI / Can wait
- Flag emails from clients (match against known client names from CLAUDE.md)
- Surface any emails with deadlines or time-sensitive language

**Calendar awareness:**
- Flag meetings starting in the next 2 hours
- Note prep needed (if meeting has agenda or docs linked)
- Identify back-to-back blocks with no buffer

**Linear priorities:**
- Group by project (ClientCo, Genesys, GTM Engineer School, etc.)
- Highlight blockers or overdue items
- Note cycle progress if relevant

**Slack highlights:**
- Summarize unread mentions
- Flag any DMs that need responses
- Note active threads you're part of

### Phase 3: Output

Format as a structured briefing following the template below.

---

## Tool Reference

| Tool | MCP | Purpose |
|------|-----|---------|
| Gmail search | `mcp__google-workspace__search_gmail_messages` | Find recent emails |
| Gmail read | `mcp__google-workspace__get_gmail_messages_content_batch` | Read email content |
| Calendar | `mcp__google-workspace__get_calendar_events` | Today's schedule |
| Linear | `mcp__plugin_linear_linear__list_issues` | Active tasks |
| Slack search | `mcp__claude_ai_Slack__slack_search_public_and_private` | Recent mentions |
| Slack channel | `mcp__claude_ai_Slack__slack_read_channel` | Channel activity |

---

## Notes

- Always run Phase 1 sources in parallel — do not wait for one before starting the next
- If any source fails (MCP unavailable), skip it and note "[Source] unavailable" in the briefing
- Client name matching: use client names from CLAUDE.md (ClientCo, ClientCo, GTM Engineer School, etc.)
- The user's email is always `matteo@genesysgrowth.com`
- Calendar ID is `matteo@genesysgrowth.com`
- Keep the briefing scannable — no walls of text, use the structured format

---

## End-of-run HTML render (optional, prompted)

After the markdown briefing is produced and shown to the user, the skill asks:

> *"Render this as a shareable HTML file too? (y/n)"*

- **`y`** → emit a sibling `.html` file in the same location: a single self-contained page (inline CSS, no external assets) with the same content laid out as: priority section at top, agenda + Linear queue + decisions in two columns below, source-of-data footer. Filename: `today-{YYYYMMDD}.html`.
- **`n`** → stop; markdown stays primary.

**Rationale:** most `/today` runs are terminal-only (just for me); occasional runs get forwarded to the team or a client weekly. The prompt keeps the choice in the moment of "I just saw the output, do I want to share it?" rather than buried in a flag I'd forget. Convention from `.claude/rules/throwaway-editor-pattern.md` (output-not-export variant — no copy-back button, since this is a one-way shareable).

