| name | meeting-to-slides |
| description | Convert meeting transcripts and notes into professional presentations automatically. Upload a Fireflies, Otter, or text transcript and get a structured slide deck (PPTX or HTML) with key points, action items, and visual layouts. |
Meeting-to-Slides Converter
Transform meeting transcripts into polished presentations in minutes. Upload a transcript from Fireflies, Otter.ai, Google Meet, Zoom, or plain text notes — Sai extracts key discussion points, decisions, and action items, then builds a professional slide deck.
Sai's unfair advantage: Unlike AI tools that only generate bullet points, Sai produces actual deliverable files — PPTX slides you can open in PowerPoint/Google Slides, or HTML slide decks you can present in-browser. It understands meeting structure (agenda items, decisions, action items) and maps them to proper slide layouts.
When to Use
- "Turn this meeting transcript into a presentation"
- "Create slides from these meeting notes"
- "I need a deck summarizing yesterday's standup"
- "Convert this Fireflies transcript to a board update"
- "Make a recap presentation from this Zoom recording transcript"
- "Generate weekly meeting summary slides"
Required Context (ask if not provided)
- Transcript/notes: File upload (.txt, .docx, .pdf, .vtt, .srt) or pasted text
- Slide format: PPTX (default, for PowerPoint/Google Slides) or HTML (for browser presentation)
- Audience: Internal team, executives, clients, board? (affects formality and detail level)
- Slide count target: Auto (let Sai decide), or specific number (e.g., "keep it to 8 slides")
- Include action items slide?: Yes (default) / No
- Brand/style: Any color preferences or template to match?
Workflow
Phase 1: Parse the Transcript
var transcript = readFile({ path: "uploads/meeting-transcript.txt" })
var parsed = {
metadata: {
date: "",
attendees: [],
duration: "",
meetingType: ""
},
topics: [
{
title: "",
keyPoints: [],
decisions: [],
dataPoints: [],
speaker: ""
}
],
actionItems: [
{
task: "",
owner: "",
deadline: "",
priority: ""
}
],
parkingLot: []
}
Phase 2: Design Slide Structure
var slides = [
{
type: "title",
title: "[Meeting Type] Summary",
subtitle: parsed.metadata.date + " | " + parsed.metadata.attendees.join(", "),
layout: "cover"
},
{
type: "agenda",
title: "Topics Discussed",
bullets: parsed.topics.map(t => t.title),
layout: "bullet-list"
}
]
for (var topic of parsed.topics) {
slides.push({
type: "content",
title: topic.title,
bullets: topic.keyPoints,
notes: topic.decisions.length > 0 ? "Decision: " + topic.decisions.join("; ") : "",
layout: topic.dataPoints.length > 0 ? "split-text-data" : "bullet-list"
})
}
if (parsed.topics.some(t => t.decisions.length > 0)) {
slides.push({
type: "decisions",
title: "Key Decisions",
bullets: parsed.topics.flatMap(t => t.decisions),
layout: "highlight-list"
})
}
slides.push({
type: "actions",
title: "Action Items",
table: parsed.actionItems.map(a => [a.task, a.owner, a.deadline]),
headers: ["Task", "Owner", "Due Date"],
layout: "table"
})
slides.push({
type: "closing",
title: "Next Steps",
bullets: ["Next meeting: [date]", ...parsed.parkingLot.map(p => "Parking lot: " + p)],
layout: "bullet-list"
})
console.log("Designed", slides.length, "slides")
Phase 3A: Generate PPTX (Default)
var pptxScript = `
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
# ... generate slides based on the structure
prs.save(r"artifacts/meeting-summary.pptx")
`
await exec({ command: "python -c \"" + pptxScript + "\"" })
Phase 3B: Generate HTML Slides (Alternative)
var htmlContent = `<!DOCTYPE html>
<html>
<head><title>Meeting Summary</title></head>
<!-- Slide deck with CSS transitions -->
</html>`
writeToFile({ text: htmlContent, path: "artifacts/meeting-summary-slides.html", overwrite: true })
Phase 4: Deliver
console.log("✅ Slide deck created!")
console.log("Format: PPTX")
console.log("Slides: " + slides.length)
console.log("File: artifacts/meeting-summary.pptx")
console.log("")
console.log("Slide breakdown:")
slides.forEach((s, i) => console.log(" Slide " + (i+1) + ": " + s.title + " (" + s.type + ")"))
Meeting Type Templates
Standup / Daily Sync
- Cover → What was done → What's planned → Blockers → (no action items slide)
- Keep to 4-6 slides, minimal text
Sprint Review / Planning
- Cover → Sprint goals → Completed items → Demo highlights → Upcoming sprint → Action items
- Include velocity/metrics if mentioned
Executive / Board Update
- Cover → Key metrics → Strategic updates (1 slide each) → Risks & mitigations → Decisions needed → Next steps
- More formal language, data-heavy slides
Client Meeting
- Cover → Discussion summary → Agreed deliverables → Timeline → Action items → Next meeting
- Professional tone, clear ownership
Brainstorm / Workshop
- Cover → Problem statement → Ideas generated (grouped) → Top ideas → Evaluation criteria → Next steps
- Visual/creative layouts preferred
Quality Checklist