Transcript Summarizer Skill
Purpose
Convert meeting transcripts into structured, actionable summaries. Supports multiple transcript formats and LLM backends.
Environment Variables
| Variable |
Description |
Default |
REFLEX_TRANSCRIPT_SRC_DIR |
Default directory to look for transcript files |
. |
REFLEX_TRANSCRIPT_DST_DIR |
Root output directory for processed transcripts |
./meetings |
REFLEX_TRANSCRIPT_LLM |
LLM provider: ollama, openai, anthropic |
ollama |
REFLEX_TRANSCRIPT_MODEL |
Model name override |
Provider default |
When to Use
- After a meeting recording has been transcribed
- Processing VTT/SRT captions from video calls
- Summarizing pasted meeting notes
- Extracting action items and decisions from long discussions
Output Structure
Each meeting produces a directory with three files:
${REFLEX_TRANSCRIPT_DST_DIR:-./meetings}/
└── <YYYY-MM-DD>/
└── <HH-MM>/
├── original.txt # Raw transcript (unmodified source)
├── readable.md # Cleaned, formatted transcript
└── summary.md # Structured summary (stored in Qdrant)
File Descriptions
original.txt
- Exact copy of the input transcript
- Preserves VTT/SRT timestamps, formatting artifacts, etc.
- Useful for debugging or re-processing with different settings
readable.md
- Cleaned transcript with preprocessing applied (see Transcript Format Preprocessing)
- Speaker labels normalized
- Timestamps and artifacts removed
- Consecutive same-speaker lines merged
- Human-readable format for reviewing what was actually said
summary.md
- Structured summary following the Summary Template
- This is the file stored in Qdrant for RAG retrieval
- Contains executive summary, decisions, action items, etc.
Directory Naming
- Date: ISO format
YYYY-MM-DD (e.g., 2024-01-15)
- Time: 24-hour format
HH-MM (e.g., 14-30 for 2:30 PM)
- If meeting time is unknown, use
00-00 or prompt user
Workflow
- Copy original transcript to
original.txt
- Clean transcript using format-specific preprocessing →
readable.md
- Summarize cleaned transcript →
summary.md
- Store summary.md content in Qdrant with metadata pointing to directory
Summary Template
The summarizer produces this structured output:
# Meeting Summary: <title>
**Date:** <YYYY-MM-DD>
**Attendees:** <comma-separated names>
**Duration:** <if detectable from timestamps>
## Executive Summary
<2-4 sentence overview of the meeting's purpose and outcomes>
## Key Topics
1. **<Topic>** - <1-sentence description>
2. **<Topic>** - <1-sentence description>
(3-7 topics)
## Decisions Made
- **<Decision>**: <reasoning or context>
- **<Decision>**: <reasoning or context>
## Action Items
| Action | Owner | Deadline |
|--------|-------|----------|
| <task> | <person> | <date or TBD> |
## Open Questions
- <Question or unresolved item>
- <Question or unresolved item>
Extraction Cues
Decisions
Look for phrases indicating agreement or resolution:
- "let's go with", "we decided", "agreed", "the plan is"
- "we'll use", "going forward", "the approach will be"
- Unanimous or majority agreement markers
Action Items
Look for commitment language:
- "I'll do", "I will", "I can take that"
- "can you", "please handle", "your task is"
- "@name" followed by a task
- "by Friday", "next week", "before the release"
Open Questions
Look for unresolved items:
- "TBD", "to be determined", "parking lot"
- "we need to figure out", "open question"
- "let's revisit", "follow up on"
- Questions without clear answers in the transcript
Attendees
- Speaker labels (e.g., "John:", "Sarah Smith:")
- "attendees:", "participants:", "present:"
- Names mentioned in greetings ("hi John", "thanks Sarah")
Transcript Format Preprocessing
VTT (WebVTT)
- Strip
WEBVTT header and metadata lines
- Remove timestamp lines (
00:00:00.000 --> 00:00:05.000)
- Remove position/alignment tags (
<c>, align:, position:)
- Deduplicate rolling captions (many VTT files repeat lines with slight timestamp shifts)
- Merge consecutive lines from same speaker
SRT (SubRip)
- Strip sequence numbers (standalone integers)
- Remove timestamp lines (
00:00:00,000 --> 00:00:05,000)
- Remove blank separator lines
- Merge consecutive same-speaker lines
Plain Text
- Use as-is
- Detect speaker labels:
Name:, [Name], SPEAKER_01:
- Normalize speaker label formats for consistency
DOCX
- Extract paragraph text via python-docx
- Preserve heading structure
- Strip formatting artifacts
Google Doc
- Fetched via Google Workspace MCP as plain text
- Treat same as plain text after retrieval
Long Transcript Strategy
Threshold: 30,000 words
Single Pass (<30K words)
Send entire cleaned transcript to LLM with the system prompt and template.
Two-Pass Chunked (>30K words)
- Chunk: Split at ~20,000 word boundaries, preferring natural breaks (speaker changes, topic shifts, timestamp gaps)
- Extract: Summarize each chunk independently, extracting topics, decisions, action items, and questions
- Synthesize: Combine chunk summaries into a single coherent summary, deduplicating items and merging topics
Qdrant Storage Schema
Always store summaries in Qdrant for RAG retrieval. The full summary content must be stored in the information field to enable semantic search across meeting contents.
Information Field (embedded content):
Store the complete generated summary markdown, including:
- Executive summary
- Key topics with descriptions
- Decisions with reasoning
- Action items (as formatted text)
- Open questions
This enables queries like "what did we decide about X?" or "who is responsible for Y?" to find relevant meetings.
Metadata Fields:
source: "meeting_transcript"
content_type: "meeting_summary"
harvested_at: "<ISO 8601 timestamp>"
# Meeting context
meeting_title: "<title>"
meeting_date: "<YYYY-MM-DD>"
meeting_time: "<HH-MM>"
attendees: "<comma-separated names>"
output_dir: "<path to YYYY-MM-DD/HH-MM directory>"
source_format: "<vtt|srt|txt|docx|gdoc|pasted>"
# Extracted counts (for filtering)
action_item_count: <integer>
decision_count: <integer>
topics: "<comma-separated key topics>"
# Classification
category: "business"
type: "meeting_summary"
confidence: "high"
LLM System Prompt
The summarize.py script uses this system prompt:
You are a meeting transcript summarizer. Your job is to extract structured
information from meeting transcripts.
Given a transcript, produce a summary with these sections:
- Executive Summary (2-4 sentences)
- Key Topics (3-7 bullet points)
- Decisions Made (with reasoning)
- Action Items (action, owner, deadline as table rows)
- Open Questions (unresolved items)
Rules:
- Only include information explicitly stated in the transcript
- If attendees are not clear, note "Attendees not identified"
- If no decisions were made, state "No explicit decisions recorded"
- Mark deadlines as "TBD" when not specified
- Keep the executive summary factual, not interpretive
1---2name: transcript-summarizer3description: Summarize meeting transcripts into structured notes with decisions, action items, and key topics.4---5
6# Transcript Summarizer Skill
7
8## Purpose
9
10Convert meeting transcripts into structured, actionable summaries. Supports multiple transcript formats and LLM backends.
11
12## Environment Variables
13
14| Variable | Description | Default |
15|----------|-------------|---------|
16| `REFLEX_TRANSCRIPT_SRC_DIR` | Default directory to look for transcript files | `.` |
17| `REFLEX_TRANSCRIPT_DST_DIR` | Root output directory for processed transcripts | `./meetings` |
18| `REFLEX_TRANSCRIPT_LLM` | LLM provider: `ollama`, `openai`, `anthropic` | `ollama` |
19| `REFLEX_TRANSCRIPT_MODEL` | Model name override | Provider default |
20
21## When to Use
22
23- After a meeting recording has been transcribed
24- Processing VTT/SRT captions from video calls
25- Summarizing pasted meeting notes
26- Extracting action items and decisions from long discussions
27
28## Output Structure
29
30Each meeting produces a directory with three files:
31
32```
33${REFLEX_TRANSCRIPT_DST_DIR:-./meetings}/
34└── <YYYY-MM-DD>/
35 └── <HH-MM>/
36 ├── original.txt # Raw transcript (unmodified source)
37 ├── readable.md # Cleaned, formatted transcript
38 └── summary.md # Structured summary (stored in Qdrant)
39```
40
41### File Descriptions
42
43**original.txt**
44- Exact copy of the input transcript
45- Preserves VTT/SRT timestamps, formatting artifacts, etc.
46- Useful for debugging or re-processing with different settings
47
48**readable.md**
49- Cleaned transcript with preprocessing applied (see Transcript Format Preprocessing)
50- Speaker labels normalized
51- Timestamps and artifacts removed
52- Consecutive same-speaker lines merged
53- Human-readable format for reviewing what was actually said
54
55**summary.md**
56- Structured summary following the Summary Template
57- This is the file stored in Qdrant for RAG retrieval
58- Contains executive summary, decisions, action items, etc.
59
60### Directory Naming
61
62- Date: ISO format `YYYY-MM-DD` (e.g., `2024-01-15`)
63- Time: 24-hour format `HH-MM` (e.g., `14-30` for 2:30 PM)
64- If meeting time is unknown, use `00-00` or prompt user
65
66### Workflow
67
681. **Copy** original transcript to `original.txt`
692. **Clean** transcript using format-specific preprocessing → `readable.md`
703. **Summarize** cleaned transcript → `summary.md`
714. **Store** summary.md content in Qdrant with metadata pointing to directory
72
73## Summary Template
74
75The summarizer produces this structured output:
76
77```markdown
78# Meeting Summary: <title>
79
80**Date:** <YYYY-MM-DD>
81**Attendees:** <comma-separated names>
82**Duration:** <if detectable from timestamps>
83
84## Executive Summary
85
86<2-4 sentence overview of the meeting's purpose and outcomes>
87
88## Key Topics
89
901. **<Topic>** - <1-sentence description>
912. **<Topic>** - <1-sentence description>
92 (3-7 topics)
93
94## Decisions Made
95
96- **<Decision>**: <reasoning or context>
97- **<Decision>**: <reasoning or context>
98
99## Action Items
100
101| Action | Owner | Deadline |
102|--------|-------|----------|
103| <task> | <person> | <date or TBD> |
104
105## Open Questions
106
107- <Question or unresolved item>
108- <Question or unresolved item>
109```
110
111## Extraction Cues
112
113### Decisions
114Look for phrases indicating agreement or resolution:
115- "let's go with", "we decided", "agreed", "the plan is"
116- "we'll use", "going forward", "the approach will be"
117- Unanimous or majority agreement markers
118
119### Action Items
120Look for commitment language:
121- "I'll do", "I will", "I can take that"
122- "can you", "please handle", "your task is"
123- "@name" followed by a task
124- "by Friday", "next week", "before the release"
125
126### Open Questions
127Look for unresolved items:
128- "TBD", "to be determined", "parking lot"
129- "we need to figure out", "open question"
130- "let's revisit", "follow up on"
131- Questions without clear answers in the transcript
132
133### Attendees
134- Speaker labels (e.g., "John:", "Sarah Smith:")
135- "attendees:", "participants:", "present:"
136- Names mentioned in greetings ("hi John", "thanks Sarah")
137
138## Transcript Format Preprocessing
139
140### VTT (WebVTT)
141- Strip `WEBVTT` header and metadata lines
142- Remove timestamp lines (`00:00:00.000 --> 00:00:05.000`)
143- Remove position/alignment tags (`<c>`, `align:`, `position:`)
144- Deduplicate rolling captions (many VTT files repeat lines with slight timestamp shifts)
145- Merge consecutive lines from same speaker
146
147### SRT (SubRip)
148- Strip sequence numbers (standalone integers)
149- Remove timestamp lines (`00:00:00,000 --> 00:00:05,000`)
150- Remove blank separator lines
151- Merge consecutive same-speaker lines
152
153### Plain Text
154- Use as-is
155- Detect speaker labels: `Name:`, `[Name]`, `SPEAKER_01:`
156- Normalize speaker label formats for consistency
157
158### DOCX
159- Extract paragraph text via python-docx
160- Preserve heading structure
161- Strip formatting artifacts
162
163### Google Doc
164- Fetched via Google Workspace MCP as plain text
165- Treat same as plain text after retrieval
166
167## Long Transcript Strategy
168
169**Threshold:** 30,000 words
170
171### Single Pass (<30K words)
172Send entire cleaned transcript to LLM with the system prompt and template.
173
174### Two-Pass Chunked (>30K words)
1751. **Chunk**: Split at ~20,000 word boundaries, preferring natural breaks (speaker changes, topic shifts, timestamp gaps)
1762. **Extract**: Summarize each chunk independently, extracting topics, decisions, action items, and questions
1773. **Synthesize**: Combine chunk summaries into a single coherent summary, deduplicating items and merging topics
178
179## Qdrant Storage Schema
180
181Always store summaries in Qdrant for RAG retrieval. The **full summary content** must be stored in the `information` field to enable semantic search across meeting contents.
182
183**Information Field (embedded content):**
184Store the complete generated summary markdown, including:
185- Executive summary
186- Key topics with descriptions
187- Decisions with reasoning
188- Action items (as formatted text)
189- Open questions
190
191This enables queries like "what did we decide about X?" or "who is responsible for Y?" to find relevant meetings.
192
193**Metadata Fields:**
194```yaml
195source: "meeting_transcript"
196content_type: "meeting_summary"
197harvested_at: "<ISO 8601 timestamp>"
198
199# Meeting context
200meeting_title: "<title>"
201meeting_date: "<YYYY-MM-DD>"
202meeting_time: "<HH-MM>"
203attendees: "<comma-separated names>"
204output_dir: "<path to YYYY-MM-DD/HH-MM directory>"
205source_format: "<vtt|srt|txt|docx|gdoc|pasted>"
206
207# Extracted counts (for filtering)
208action_item_count: <integer>
209decision_count: <integer>
210topics: "<comma-separated key topics>"
211
212# Classification
213category: "business"
214type: "meeting_summary"
215confidence: "high"
216```
217
218## LLM System Prompt
219
220The summarize.py script uses this system prompt:
221
222```
223You are a meeting transcript summarizer. Your job is to extract structured
224information from meeting transcripts.
225
226Given a transcript, produce a summary with these sections:
227- Executive Summary (2-4 sentences)
228- Key Topics (3-7 bullet points)
229- Decisions Made (with reasoning)
230- Action Items (action, owner, deadline as table rows)
231- Open Questions (unresolved items)
232
233Rules:
234- Only include information explicitly stated in the transcript
235- If attendees are not clear, note "Attendees not identified"
236- If no decisions were made, state "No explicit decisions recorded"
237- Mark deadlines as "TBD" when not specified
238- Keep the executive summary factual, not interpretive
239```