Meeting Notes Generator

Transform meeting recordings into structured notes with action items, decisions, and key takeaways.

This workflow processes transcripts, identifies speakers, extracts decisions, and generates shareable summaries.

Implementation

1import { relay } from "@relayplane/workflows";
2
3const result = await relay
4 .workflow("meeting-notes")
5
6 // Step 1: Clean and structure transcript
7 .step("structure-transcript")
8 .with("openai:gpt-4o")
9 .prompt(`Clean and structure this meeting transcript:
10
11{{rawTranscript}}
12
13Participants: {{participants}}
14Meeting Type: {{meetingType}}
15
16Tasks:
17- Identify and label speakers
18- Fix transcription errors
19- Add paragraph breaks
20- Remove filler words (um, uh)
21- Maintain natural flow
22
23Return cleaned transcript with speaker labels.`)
24
25 // Step 2: Extract key discussion topics
26 .step("extract-topics")
27 .with("anthropic:claude-3.5-sonnet")
28 .depends("structure-transcript")
29 .prompt(`Extract main discussion topics:
30
31{{structure-transcript.output}}
32
33For each topic:
34- Topic name/title
35- Time spent (approximate)
36- Key points discussed
37- Who contributed most
38- Outcome (resolved, tabled, ongoing)
39
40Group related discussion into coherent topics.`)
41
42 // Step 3: Identify decisions and action items
43 .step("decisions-actions")
44 .with("anthropic:claude-3.5-sonnet")
45 .depends("structure-transcript")
46 .prompt(`Extract decisions made and action items:
47
48{{structure-transcript.output}}
49
50DECISIONS (things that were agreed upon):
51- What was decided
52- Who made/approved the decision
53- Any deadlines or conditions
54
55ACTION ITEMS:
56- Specific task
57- Owner (who is responsible)
58- Due date (if mentioned)
59- Dependencies
60
61Be specific - extract exact commitments made.`)
62
63 // Step 4: Generate executive summary
64 .step("executive-summary")
65 .with("openai:gpt-4o")
66 .depends("extract-topics", "decisions-actions")
67 .prompt(`Create executive summary:
68
69Topics: {{extract-topics.output}}
70Decisions & Actions: {{decisions-actions.output}}
71
72Write a 3-5 sentence summary covering:
73- Meeting purpose
74- Most important decisions
75- Critical action items
76- Overall outcome
77
78For someone who couldn't attend but needs to know the essentials.`)
79
80 // Step 5: Generate full meeting notes
81 .step("full-notes")
82 .with("anthropic:claude-3.5-sonnet")
83 .depends("structure-transcript", "extract-topics", "decisions-actions", "executive-summary")
84 .prompt(`Generate complete meeting notes:
85
86Transcript: {{structure-transcript.output}}
87Topics: {{extract-topics.output}}
88Decisions: {{decisions-actions.output}}
89Summary: {{executive-summary.output}}
90
91Meeting: {{meetingTitle}}
92Date: {{meetingDate}}
93Attendees: {{participants}}
94
95Format:
96# {{meetingTitle}}
97**Date:** {{meetingDate}}
98**Attendees:** [list]
99
100## TL;DR
101[Executive summary]
102
103## Decisions Made
104- Decision 1
105- Decision 2
106
107## Action Items
108- [ ] Task 1 (@owner, due: date)
109- [ ] Task 2 (@owner, due: date)
110
111## Discussion Topics
112
113### Topic 1
114- Key points
115- Notable quotes
116
117### Topic 2
118...
119
120## Next Steps
121- Follow-up items
122- Next meeting agenda
123
124Clear, scannable, professional.`)
125
126 .run({
127 rawTranscript: zoomTranscript,
128 participants: ["Sarah Chen", "Mike Johnson", "Alex Smith", "Jordan Lee"],
129 meetingType: "Sprint Planning",
130 meetingTitle: "Q4 Sprint 3 Planning",
131 meetingDate: "2024-11-18",
132 });
133
134// Save and distribute
135await saveToNotion({
136 database: "Meeting Notes",
137 title: "Q4 Sprint 3 Planning",
138 content: result.steps["full-notes"].output,
139});
140
141// Post to Slack
142await postToSlack({
143 channel: "#team-engineering",
144 text: `📝 *Meeting Notes: Q4 Sprint 3 Planning*\n\n${result.steps["executive-summary"].output}\n\n`,
145});
146
147// Create tasks
148const actions = parseActionItems(result.steps["decisions-actions"].output);
149for (const action of actions) {
150 await createJiraTask(action);
151}

Zoom/Teams Integration

1// Automatic processing after meetings
2import { relay } from "@relayplane/workflows";
3
4async function processZoomRecording(webhook: ZoomWebhook) {
5 if (webhook.event !== "recording.completed") return;
6
7 const { meeting_id, recording_files } = webhook.payload;
8
9 // Download transcript
10 const transcriptFile = recording_files.find(f => f.file_type === "TRANSCRIPT");
11 const transcript = await downloadFile(transcriptFile.download_url);
12
13 // Get meeting details
14 const meeting = await zoomApi.meetings.get(meeting_id);
15
16 // Generate notes
17 const notes = await relay
18 .workflow("meeting-notes")
19 .run({
20 rawTranscript: transcript,
21 participants: meeting.participants.map(p => p.name),
22 meetingType: meeting.topic.includes("standup") ? "Standup" : "General",
23 meetingTitle: meeting.topic,
24 meetingDate: meeting.start_time,
25 });
26
27 // Email to attendees
28 for (const participant of meeting.participants) {
29 await sendEmail({
30 to: participant.email,
31 subject: `Meeting Notes: ${meeting.topic}`,
32 body: notes.steps["full-notes"].output,
33 });
34 }
35}
36
37// Register Zoom webhook
38app.post("/webhooks/zoom", processZoomRecording);

Different Meeting Types

1// Customize prompts for meeting type
2const meetingTemplates = {
3 standup: {
4 topics: "Extract: completed work, planned work, blockers",
5 format: "List by person: Done, Doing, Blockers",
6 },
7 planning: {
8 topics: "Extract: prioritized items, estimates, assignments",
9 format: "Sprint backlog with story points and owners",
10 },
11 retro: {
12 topics: "Extract: what went well, improvements, action items",
13 format: "Keep/Stop/Start format",
14 },
15 "1on1": {
16 topics: "Extract: wins, challenges, career goals, feedback",
17 format: "Private notes, next 1:1 agenda items",
18 },
19};
20
21const template = meetingTemplates[meetingType];
22await relay
23 .workflow("meeting-notes")
24 .step("extract-topics")
25 .prompt(`${template.topics}...\n\nFormat: ${template.format}`)
26 .run({ ... });

Sample Output

1# Q4 Sprint 3 Planning
2**Date:** November 18, 2024
3**Attendees:** Sarah Chen, Mike Johnson, Alex Smith, Jordan Lee
4
5## TL;DR
6Team planned 32 story points for Sprint 3, prioritizing the new billing dashboard and API performance improvements. Key decision to delay the mobile app feature to Q1 due to resource constraints. Mike taking lead on database optimization with a Friday deadline.
7
8## Decisions Made
9- ✅ **Billing dashboard MVP for Dec 1 launch** - Approved as top priority
10- ✅ **Mobile app deferred to Q1** - Need dedicated mobile developer
11- ✅ **Use PostgreSQL read replicas** for performance (not Elasticsearch)
12- ✅ **Hire contractor for QA** - Jordan to post job this week
13
14## Action Items
15- [ ] Mike: Database query optimization by Friday, Nov 22
16- [ ] Sarah: Billing dashboard wireframes by Wednesday, Nov 20
17- [ ] Alex: Update API rate limiting logic by end of sprint
18- [ ] Jordan: Post QA contractor job on Upwork by Tuesday
19
20## Discussion Topics
21
22### Sprint Velocity Review
23- Last sprint: 28 points completed (target 30)
24- Carried over: Authentication bug (3 points)
25- Discussion on whether to add 2 more points to reach 30
26
27### Billing Dashboard Prioritization
28Sarah presented MVP scope. Team agreed to cut:
29- CSV export (move to v1.1)
30- Custom date ranges (move to v1.1)
31
32Mike: "We can add these in a fast-follow, let's nail the core experience first"
33
34### API Performance Issues
35Alex reported P95 latency at 2.3s (target: 500ms)
36Root cause: N+1 queries on user dashboard
37Solution: Implement read replicas + query optimization
38
39### Resource Planning
40Discussed need for QA help. Jordan will hire contractor through Upwork.
41Budget: $50-75/hour, 20 hours/week for 6 weeks.
42
43## Next Steps
44- **Next sprint planning:** December 2, 2024, 10am
45- **Mike to demo** read replica setup at Thursday standup
46- **Sarah to share** billing wireframes in Figma by Wednesday

Integrations

  • Zoom, Teams, Meet: Auto-trigger on recording completion
  • Notion/Confluence: Save notes to team wiki
  • Jira/Linear: Create action items as tasks
  • Slack/Email: Distribute to attendees
  • Calendar: Attach notes to calendar event
Time Saved: 15-30 minutes per meeting. Multiply by number of meetings per week for significant productivity gains.