Meeting brief

Daily meeting preparation system that checks your calendar each morning, deeply researches external attendees (LinkedIn, company info, GitHub, past notes), and sends you personalized briefs via email (1 per person).

How to use it

  1. Hit Copy SKILL.md — or use the Claude Code line below to get every file.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/sales/composites/meeting-brief#main ~/.claude/skills/meeting-brief

For one project only, change the path to .claude/skills/meeting-brief. This skill also uses config.json, run_daily.sh, MEMORY.md, research_output.json, meeting_context.json, 2026-02-21.json — copying SKILL.md alone won't be enough. See the folder on GitHub.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text313 lines
meeting-brief/SKILL.md313 lines9.0 KBpushed 96d agoRawView on GitHub

Meeting Brief

Automated daily meeting preparation system that researches meeting attendees and sends you personalized briefs.

What It Does

Every morning (configurable time):

  1. Checks your calendar for today's meetings (via gcalcli)
  2. Extracts attendees from each meeting
  3. Filters out your team members (configurable)
  4. Deep researches each external person:
    • LinkedIn profile (web search)
    • Company information
    • GitHub profile (if engineer)
    • Past interactions/notes (memory search)
    • Recent news/activity
  5. Generates AI-powered brief per person
  6. Sends 1 email per person to your inbox

Setup

1. Configure Team Members

Edit config.json to list your team members (these will be skipped):

{
  "team_members": [
    "[email protected]",
    "[email protected]",
    "[email protected]"
  ],
  "team_domains": [
    "@yourcompany.com"
  ],
  "schedule": "0 7 * * *",
  "timezone": "America/Los_Angeles",
  "your_email": "[email protected]",
  "brief_from": "Meeting Brief <[email protected]>",
  "slack_webhook": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL",
  "send_email": true,
  "send_slack": true,
  "include_calendar_details": true,
  "research_depth": "standard"
}

Config options:

  • team_members: Emails to skip (exact match)
  • team_domains: Domain patterns to skip (e.g., skip all @yourcompany.com)
  • schedule: Cron expression for daily run (default: 7am)
  • timezone: Timezone for schedule
  • your_email: Where to send briefs
  • brief_from: From address for briefs
  • slack_webhook: Slack incoming webhook URL (optional)
  • send_email: Whether to send email briefs (default: true)
  • send_slack: Whether to send Slack notifications (default: false)
  • include_calendar_details: Include meeting time/location in brief
  • research_depth: quick (web only), standard (web + GitHub), deep (web + GitHub + past notes)

2. Run Daily (Manual or Scheduled)

Run manually each morning:

cd skills/meeting-brief
./scripts/run_daily.sh

How It Works

Main Workflow (scripts/run_daily.sh)

  1. Fetch today's meetings (scripts/check_calendar.sh)

    • Uses gcalcli to get today's agenda
    • Parses meeting times, titles, attendees
    • Outputs JSON with meeting details
  2. Filter external attendees (built into run_daily.sh)

    • Loads config.json
    • Filters out team members and team domains
    • Creates list of people to research
  3. Research each person (scripts/research_person.js)

    • Web search: LinkedIn profile, company info
    • GitHub search: Profile and repos (if applicable)
    • Memory search: Past interactions/notes
    • News search: Recent activity
    • Outputs structured research JSON
  4. Generate brief (scripts/generate_brief.js)

    • Uses AI agent to generate the brief
    • Inputs: research data + meeting context
    • Outputs: Two formats:
      • Email: Concise bullet-point brief
      • Slack: Rich paragraph-style story with deeper context and narrative
  5. Send brief

    • Email: Uses Gmail skill (send_email: true)
    • Slack: Uses webhook (send_slack: true, scripts/send_slack.sh)
    • Subject: "Meeting Brief: [Person Name] - [Meeting Title]"
    • Body: AI-generated brief with research
  6. Save to personal CRM (supernotes/people/)

    • Each researched person saved as markdown file
    • Includes: research data, meeting context, date
    • Builds personal relationship database over time
  7. Track sent briefs (logs to data/sent/YYYY-MM-DD.json)

    • Prevents duplicates
    • Enables analytics

Research Process

For each external attendee, the system researches:

Web Search (Always)

  • LinkedIn profile (name + company)
  • Company information
  • Recent news mentions
  • Professional background

GitHub (If research_depth is standard or deep)

  • GitHub profile lookup (by name/email)
  • Recent repos and contributions
  • Technical focus areas

Memory/Past Notes (If research_depth is deep)

  • Search MEMORY.md and daily notes
  • Past meeting notes
  • Previous interactions
  • Context from past conversations

Output Format

Research is structured as JSON:

{
  "person": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "company": "Example Corp",
    "title": "VP Engineering"
  },
  "linkedin": {
    "url": "...",
    "bio": "...",
    "experience": [...]
  },
  "github": {
    "username": "janedoe",
    "profile_url": "...",
    "recent_repos": [...]
  },
  "company": {
    "name": "Example Corp",
    "industry": "...",
    "recent_news": [...]
  },
  "past_interactions": [
    "Met at conference in 2024",
    "Discussed partnership opportunity"
  ]
}

Brief Generation

The AI-generated brief comes in two formats:

Email Format (Concise Bullets)

  1. Quick Overview

    • Who they are (name, title, company)
    • Why you're meeting (meeting title/description)
  2. Background

    • Professional background (LinkedIn)
    • Company context
    • Technical expertise (GitHub, if applicable)
  3. Conversation Starters

    • Based on recent activity
    • Shared interests/connections
    • Relevant topics
  4. Action Items / Notes

    • Past interactions (if any)
    • Things to remember
    • Follow-up items

Slack Format (Rich Story)

Deeper, narrative-driven brief with:

  • Paragraph-style storytelling about the person
  • Context about their journey and recent work
  • Compelling hooks and conversation angles
  • More background color and detail
  • Stronger narrative flow than bullet points

Example Brief:

Subject: Meeting Brief: Jane Doe - Product Partnership Discussion

Hi,

You're meeting with Jane Doe today at 2pm.

## Quick Overview
Jane is VP of Engineering at Example Corp, a B2B SaaS company in the dev tools space. She's been there for 3 years and previously worked at GitHub and Microsoft.

## Background
- Strong background in developer tooling and infrastructure
- Recently led Example Corp's API platform overhaul (launched Q4 2025)
- Active on GitHub (janedoe) - maintains several open-source CLI tools
- Technical blog focuses on API design and developer experience

## Conversation Starters
- Their new API platform (just launched, getting good traction)
- Recent blog post on GraphQL vs REST (published last week)
- Shared interest in developer experience (noted in her LinkedIn)

## Notes
- You met briefly at DevTools Summit 2024
- She mentioned interest in partnering on integration opportunities

---
Meeting: Product Partnership Discussion
Time: Today at 2:00 PM
Location: Zoom (link in calendar)

Manual Usage

Run for a specific person:

# Research a person
node scripts/research_person.js "Jane Doe" "[email protected]" "Example Corp"

# Generate brief
node scripts/generate_brief.js research_output.json meeting_context.json

# Send brief
./scripts/send_brief.sh brief.html "Jane Doe"

Run for today's meetings:

./scripts/run_daily.sh

Data & Logs

meeting-brief/
├── data/
│   ├── sent/              # Sent brief logs (by date)
│   │   └── 2026-02-21.json
│   ├── research/          # Research cache (by person)
│   │   └── jane-doe.json
│   └── meetings/          # Meeting data (by date)
│       └── 2026-02-21.json
└── logs/
    └── run.log            # Execution logs

Tips

  1. Test with dry-run first: Set DRY_RUN=true in run_daily.sh to preview without sending
  2. Adjust research depth: Start with quick, upgrade to standard or deep as needed
  3. Refine team filter: Add domains/emails to skip internal meetings
  4. Review briefs: Check data/sent/ logs to see what's being sent
  5. Iterate on prompts: Edit generate_brief.js to customize AI prompt

Troubleshooting

No briefs sent:

  • Check gcalcli authentication (gcalcli agenda today tomorrow)
  • Verify calendar has events with external attendees
  • Check logs in logs/run.log

Briefs missing information:

  • Increase research_depth in config.json
  • Check web_search and GitHub CLI are working
  • Review research data in data/research/

Duplicate briefs:

  • Check data/sent/ for already-sent tracking
  • Verify cron job isn't running multiple times

Tools Used

  • gcalcli: For fetching today's meetings from Google Calendar
  • web_search: For LinkedIn and company research
  • GitHub CLI (gh): For GitHub profile lookup (optional)
  • Gmail: For sending brief emails (optional — can also output to file)

Privacy & Security

  • Research data is cached locally in data/research/
  • No external APIs (uses web_search, GitHub CLI, memory_search)
  • Briefs sent only to configured email
  • Team member filtering prevents leaking internal info
  • All data stored in skill directory (no cloud storage)
1---
2name: meeting-brief
3description: Daily meeting preparation system that checks your calendar each morning, deeply researches external attendees (LinkedIn, company info, GitHub, past notes), and sends you personalized briefs via email (1 per person). Use when you want automated preparation for upcoming meetings with context about each person you're meeting.
4---
5 
6# Meeting Brief
7 
8Automated daily meeting preparation system that researches meeting attendees and sends you personalized briefs.
9 
10## What It Does
11 
12Every morning (configurable time):
131. Checks your calendar for today's meetings (via gcalcli)
142. Extracts attendees from each meeting
153. Filters out your team members (configurable)
164. Deep researches each external person:
17 - LinkedIn profile (web search)
18 - Company information
19 - GitHub profile (if engineer)
20 - Past interactions/notes (memory search)
21 - Recent news/activity
225. Generates AI-powered brief per person
236. Sends 1 email per person to your inbox
24 
25## Setup
26 
27### 1. Configure Team Members
28 
29Edit `config.json` to list your team members (these will be skipped):
30 
31```json
32{
33 "team_members": [
34 "[email protected]",
35 "[email protected]",
36 "[email protected]"
37 ],
38 "team_domains": [
39 "@yourcompany.com"
40 ],
41 "schedule": "0 7 * * *",
42 "timezone": "America/Los_Angeles",
43 "your_email": "[email protected]",
44 "brief_from": "Meeting Brief <[email protected]>",
45 "slack_webhook": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL",
46 "send_email": true,
47 "send_slack": true,
48 "include_calendar_details": true,
49 "research_depth": "standard"
50}
51```
52 
53**Config options:**
54- `team_members`: Emails to skip (exact match)
55- `team_domains`: Domain patterns to skip (e.g., skip all @yourcompany.com)
56- `schedule`: Cron expression for daily run (default: 7am)
57- `timezone`: Timezone for schedule
58- `your_email`: Where to send briefs
59- `brief_from`: From address for briefs
60- `slack_webhook`: Slack incoming webhook URL (optional)
61- `send_email`: Whether to send email briefs (default: true)
62- `send_slack`: Whether to send Slack notifications (default: false)
63- `include_calendar_details`: Include meeting time/location in brief
64- `research_depth`: `quick` (web only), `standard` (web + GitHub), `deep` (web + GitHub + past notes)
65 
66### 2. Run Daily (Manual or Scheduled)
67 
68Run manually each morning:
69```bash
70cd skills/meeting-brief
71./scripts/run_daily.sh
72```
73 
74## How It Works
75 
76### Main Workflow (`scripts/run_daily.sh`)
77 
781. **Fetch today's meetings** (`scripts/check_calendar.sh`)
79 - Uses gcalcli to get today's agenda
80 - Parses meeting times, titles, attendees
81 - Outputs JSON with meeting details
82 
832. **Filter external attendees** (built into run_daily.sh)
84 - Loads config.json
85 - Filters out team members and team domains
86 - Creates list of people to research
87 
883. **Research each person** (`scripts/research_person.js`)
89 - Web search: LinkedIn profile, company info
90 - GitHub search: Profile and repos (if applicable)
91 - Memory search: Past interactions/notes
92 - News search: Recent activity
93 - Outputs structured research JSON
94 
954. **Generate brief** (`scripts/generate_brief.js`)
96 - Uses AI agent to generate the brief
97 - Inputs: research data + meeting context
98 - Outputs: Two formats:
99 - **Email**: Concise bullet-point brief
100 - **Slack**: Rich paragraph-style story with deeper context and narrative
101 
1025. **Send brief**
103 - Email: Uses Gmail skill (`send_email: true`)
104 - Slack: Uses webhook (`send_slack: true`, `scripts/send_slack.sh`)
105 - Subject: "Meeting Brief: [Person Name] - [Meeting Title]"
106 - Body: AI-generated brief with research
107 
1086. **Save to personal CRM** (`supernotes/people/`)
109 - Each researched person saved as markdown file
110 - Includes: research data, meeting context, date
111 - Builds personal relationship database over time
112 
1137. **Track sent briefs** (logs to `data/sent/YYYY-MM-DD.json`)
114 - Prevents duplicates
115 - Enables analytics
116 
117## Research Process
118 
119For each external attendee, the system researches:
120 
121### Web Search (Always)
122- LinkedIn profile (name + company)
123- Company information
124- Recent news mentions
125- Professional background
126 
127### GitHub (If `research_depth` is `standard` or `deep`)
128- GitHub profile lookup (by name/email)
129- Recent repos and contributions
130- Technical focus areas
131 
132### Memory/Past Notes (If `research_depth` is `deep`)
133- Search MEMORY.md and daily notes
134- Past meeting notes
135- Previous interactions
136- Context from past conversations
137 
138### Output Format
139 
140Research is structured as JSON:
141 
142```json
143{
144 "person": {
145 "name": "Jane Doe",
146 "email": "[email protected]",
147 "company": "Example Corp",
148 "title": "VP Engineering"
149 },
150 "linkedin": {
151 "url": "...",
152 "bio": "...",
153 "experience": [...]
154 },
155 "github": {
156 "username": "janedoe",
157 "profile_url": "...",
158 "recent_repos": [...]
159 },
160 "company": {
161 "name": "Example Corp",
162 "industry": "...",
163 "recent_news": [...]
164 },
165 "past_interactions": [
166 "Met at conference in 2024",
167 "Discussed partnership opportunity"
168 ]
169}
170```
171 
172## Brief Generation
173 
174The AI-generated brief comes in **two formats**:
175 
176### Email Format (Concise Bullets)
177 
1781. **Quick Overview**
179 - Who they are (name, title, company)
180 - Why you're meeting (meeting title/description)
181 
1822. **Background**
183 - Professional background (LinkedIn)
184 - Company context
185 - Technical expertise (GitHub, if applicable)
186 
1873. **Conversation Starters**
188 - Based on recent activity
189 - Shared interests/connections
190 - Relevant topics
191 
1924. **Action Items / Notes**
193 - Past interactions (if any)
194 - Things to remember
195 - Follow-up items
196 
197### Slack Format (Rich Story)
198 
199Deeper, narrative-driven brief with:
200- Paragraph-style storytelling about the person
201- Context about their journey and recent work
202- Compelling hooks and conversation angles
203- More background color and detail
204- Stronger narrative flow than bullet points
205 
206**Example Brief:**
207 
208```
209Subject: Meeting Brief: Jane Doe - Product Partnership Discussion
210 
211Hi,
212 
213You're meeting with Jane Doe today at 2pm.
214 
215## Quick Overview
216Jane is VP of Engineering at Example Corp, a B2B SaaS company in the dev tools space. She's been there for 3 years and previously worked at GitHub and Microsoft.
217 
218## Background
219- Strong background in developer tooling and infrastructure
220- Recently led Example Corp's API platform overhaul (launched Q4 2025)
221- Active on GitHub (janedoe) - maintains several open-source CLI tools
222- Technical blog focuses on API design and developer experience
223 
224## Conversation Starters
225- Their new API platform (just launched, getting good traction)
226- Recent blog post on GraphQL vs REST (published last week)
227- Shared interest in developer experience (noted in her LinkedIn)
228 
229## Notes
230- You met briefly at DevTools Summit 2024
231- She mentioned interest in partnering on integration opportunities
232 
233---
234Meeting: Product Partnership Discussion
235Time: Today at 2:00 PM
236Location: Zoom (link in calendar)
237```
238 
239## Manual Usage
240 
241Run for a specific person:
242 
243```bash
244# Research a person
245node scripts/research_person.js "Jane Doe" "[email protected]" "Example Corp"
246 
247# Generate brief
248node scripts/generate_brief.js research_output.json meeting_context.json
249 
250# Send brief
251./scripts/send_brief.sh brief.html "Jane Doe"
252```
253 
254Run for today's meetings:
255 
256```bash
257./scripts/run_daily.sh
258```
259 
260## Data & Logs
261 
262```
263meeting-brief/
264├── data/
265│ ├── sent/ # Sent brief logs (by date)
266│ │ └── 2026-02-21.json
267│ ├── research/ # Research cache (by person)
268│ │ └── jane-doe.json
269│ └── meetings/ # Meeting data (by date)
270│ └── 2026-02-21.json
271└── logs/
272 └── run.log # Execution logs
273```
274 
275## Tips
276 
2771. **Test with dry-run first**: Set `DRY_RUN=true` in run_daily.sh to preview without sending
2782. **Adjust research depth**: Start with `quick`, upgrade to `standard` or `deep` as needed
2793. **Refine team filter**: Add domains/emails to skip internal meetings
2804. **Review briefs**: Check data/sent/ logs to see what's being sent
2815. **Iterate on prompts**: Edit generate_brief.js to customize AI prompt
282 
283## Troubleshooting
284 
285**No briefs sent:**
286- Check gcalcli authentication (`gcalcli agenda today tomorrow`)
287- Verify calendar has events with external attendees
288- Check logs in `logs/run.log`
289 
290**Briefs missing information:**
291- Increase `research_depth` in config.json
292- Check web_search and GitHub CLI are working
293- Review research data in `data/research/`
294 
295**Duplicate briefs:**
296- Check `data/sent/` for already-sent tracking
297- Verify cron job isn't running multiple times
298 
299## Tools Used
300 
301- **gcalcli**: For fetching today's meetings from Google Calendar
302- **web_search**: For LinkedIn and company research
303- **GitHub CLI (`gh`)**: For GitHub profile lookup (optional)
304- **Gmail**: For sending brief emails (optional — can also output to file)
305 
306## Privacy & Security
307 
308- Research data is cached locally in `data/research/`
309- No external APIs (uses web_search, GitHub CLI, memory_search)
310- Briefs sent only to configured email
311- Team member filtering prevents leaking internal info
312- All data stored in skill directory (no cloud storage)
313 

Discussion