transcript-summarizer
Summarize meeting transcripts into structured notes with decisions, action items, and key topics.
What this skill does
# 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
1. **Copy** original transcript to `original.txt`
2. **Clean** transcript using format-specific preprocessing → `readable.md`
3. **Summarize** cleaned transcript → `summary.md`
4. **Store** summary.md content in Qdrant with metadata pointing to directory
## Summary Template
The summarizer produces this structured output:
```markdown
# 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)
1. **Chunk**: Split at ~20,000 word boundaries, preferring natural breaks (speaker changes, topic shifts, timestamp gaps)
2. **Extract**: Summarize each chunk independently, extracting topics, decisions, action items, and questions
3. **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:**
```yaml
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
```
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.