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";23const result = await relay4 .workflow("meeting-notes")56 // Step 1: Clean and structure transcript7 .step("structure-transcript")8 .with("openai:gpt-4o")9 .prompt(`Clean and structure this meeting transcript:1011{{rawTranscript}}1213Participants: {{participants}}14Meeting Type: {{meetingType}}1516Tasks:17- Identify and label speakers18- Fix transcription errors19- Add paragraph breaks20- Remove filler words (um, uh)21- Maintain natural flow2223Return cleaned transcript with speaker labels.`)2425 // Step 2: Extract key discussion topics26 .step("extract-topics")27 .with("anthropic:claude-3.5-sonnet")28 .depends("structure-transcript")29 .prompt(`Extract main discussion topics:3031{{structure-transcript.output}}3233For each topic:34- Topic name/title35- Time spent (approximate)36- Key points discussed37- Who contributed most38- Outcome (resolved, tabled, ongoing)3940Group related discussion into coherent topics.`)4142 // Step 3: Identify decisions and action items43 .step("decisions-actions")44 .with("anthropic:claude-3.5-sonnet")45 .depends("structure-transcript")46 .prompt(`Extract decisions made and action items:4748{{structure-transcript.output}}4950DECISIONS (things that were agreed upon):51- What was decided52- Who made/approved the decision53- Any deadlines or conditions5455ACTION ITEMS:56- Specific task57- Owner (who is responsible)58- Due date (if mentioned)59- Dependencies6061Be specific - extract exact commitments made.`)6263 // Step 4: Generate executive summary64 .step("executive-summary")65 .with("openai:gpt-4o")66 .depends("extract-topics", "decisions-actions")67 .prompt(`Create executive summary:6869Topics: {{extract-topics.output}}70Decisions & Actions: {{decisions-actions.output}}7172Write a 3-5 sentence summary covering:73- Meeting purpose74- Most important decisions75- Critical action items76- Overall outcome7778For someone who couldn't attend but needs to know the essentials.`)7980 // Step 5: Generate full meeting notes81 .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:8586Transcript: {{structure-transcript.output}}87Topics: {{extract-topics.output}}88Decisions: {{decisions-actions.output}}89Summary: {{executive-summary.output}}9091Meeting: {{meetingTitle}}92Date: {{meetingDate}}93Attendees: {{participants}}9495Format:96# {{meetingTitle}}97**Date:** {{meetingDate}}98**Attendees:** [list]99100## TL;DR101[Executive summary]102103## Decisions Made104- Decision 1105- Decision 2106107## Action Items108- [ ] Task 1 (@owner, due: date)109- [ ] Task 2 (@owner, due: date)110111## Discussion Topics112113### Topic 1114- Key points115- Notable quotes116117### Topic 2118...119120## Next Steps121- Follow-up items122- Next meeting agenda123124Clear, scannable, professional.`)125126 .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 });133134// Save and distribute135await saveToNotion({136 database: "Meeting Notes",137 title: "Q4 Sprint 3 Planning",138 content: result.steps["full-notes"].output,139});140141// Post to Slack142await postToSlack({143 channel: "#team-engineering",144 text: `📝 *Meeting Notes: Q4 Sprint 3 Planning*\n\n${result.steps["executive-summary"].output}\n\n` ,145});146147// Create tasks148const actions = parseActionItems(result.steps["decisions-actions"].output);149for (const action of actions) {150 await createJiraTask(action);151}Zoom/Teams Integration
1// Automatic processing after meetings2import { relay } from "@relayplane/workflows";34async function processZoomRecording(webhook: ZoomWebhook) {5 if (webhook.event !== "recording.completed") return;67 const { meeting_id, recording_files } = webhook.payload;89 // Download transcript10 const transcriptFile = recording_files.find(f => f.file_type === "TRANSCRIPT");11 const transcript = await downloadFile(transcriptFile.download_url);1213 // Get meeting details14 const meeting = await zoomApi.meetings.get(meeting_id);1516 // Generate notes17 const notes = await relay18 .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 });2627 // Email to attendees28 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}3637// Register Zoom webhook38app.post("/webhooks/zoom", processZoomRecording);Different Meeting Types
1// Customize prompts for meeting type2const 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};2021const template = meetingTemplates[meetingType];22await relay23 .workflow("meeting-notes")24 .step("extract-topics")25 .prompt(`${template.topics}...\n\nFormat: ${template.format}`)26 .run({ ... });Sample Output
1# Q4 Sprint 3 Planning2**Date:** November 18, 20243**Attendees:** Sarah Chen, Mike Johnson, Alex Smith, Jordan Lee45## TL;DR6Team 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.78## Decisions Made9- ✅ **Billing dashboard MVP for Dec 1 launch** - Approved as top priority10- ✅ **Mobile app deferred to Q1** - Need dedicated mobile developer11- ✅ **Use PostgreSQL read replicas** for performance (not Elasticsearch)12- ✅ **Hire contractor for QA** - Jordan to post job this week1314## Action Items15- [ ] Mike: Database query optimization by Friday, Nov 2216- [ ] Sarah: Billing dashboard wireframes by Wednesday, Nov 2017- [ ] Alex: Update API rate limiting logic by end of sprint18- [ ] Jordan: Post QA contractor job on Upwork by Tuesday1920## Discussion Topics2122### Sprint Velocity Review23- 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 302627### Billing Dashboard Prioritization28Sarah presented MVP scope. Team agreed to cut:29- CSV export (move to v1.1)30- Custom date ranges (move to v1.1)3132Mike: "We can add these in a fast-follow, let's nail the core experience first"3334### API Performance Issues35Alex reported P95 latency at 2.3s (target: 500ms)36Root cause: N+1 queries on user dashboard37Solution: Implement read replicas + query optimization3839### Resource Planning40Discussed need for QA help. Jordan will hire contractor through Upwork.41Budget: $50-75/hour, 20 hours/week for 6 weeks.4243## Next Steps44- **Next sprint planning:** December 2, 2024, 10am45- **Mike to demo** read replica setup at Thursday standup46- **Sarah to share** billing wireframes in Figma by WednesdayIntegrations
- 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.